1
|
<?php
|
2
|
/**
|
3
|
* @file
|
4
|
* Contains functions to alter Drupal's markup for the Zen theme.
|
5
|
*
|
6
|
* IMPORTANT WARNING: DO NOT MODIFY THIS FILE.
|
7
|
*
|
8
|
* The base Zen theme is designed to be easily extended by its sub-themes. You
|
9
|
* shouldn't modify this or any of the CSS or PHP files in the root zen/ folder.
|
10
|
* See the online documentation for more information:
|
11
|
* https://drupal.org/documentation/theme/zen
|
12
|
*/
|
13
|
|
14
|
// Auto-rebuild the theme registry during theme development.
|
15
|
if (theme_get_setting('zen_rebuild_registry') && !defined('MAINTENANCE_MODE')) {
|
16
|
// Rebuild .info data.
|
17
|
system_rebuild_theme_data();
|
18
|
// Rebuild theme registry.
|
19
|
drupal_theme_rebuild();
|
20
|
}
|
21
|
|
22
|
|
23
|
/**
|
24
|
* Implements HOOK_theme().
|
25
|
*/
|
26
|
function zen_theme(&$existing, $type, $theme, $path) {
|
27
|
include_once './' . drupal_get_path('theme', 'zen') . '/zen-internals/template.theme-registry.inc';
|
28
|
return _zen_theme($existing, $type, $theme, $path);
|
29
|
}
|
30
|
|
31
|
/**
|
32
|
* Return a themed breadcrumb trail.
|
33
|
*
|
34
|
* @param $variables
|
35
|
* - title: An optional string to be used as a navigational heading to give
|
36
|
* context for breadcrumb links to screen-reader users.
|
37
|
* - title_attributes_array: Array of HTML attributes for the title. It is
|
38
|
* flattened into a string within the theme function.
|
39
|
* - breadcrumb: An array containing the breadcrumb links.
|
40
|
* @return
|
41
|
* A string containing the breadcrumb output.
|
42
|
*/
|
43
|
function zen_breadcrumb($variables) {
|
44
|
$breadcrumb = $variables['breadcrumb'];
|
45
|
$output = '';
|
46
|
|
47
|
// Determine if we are to display the breadcrumb.
|
48
|
$show_breadcrumb = theme_get_setting('zen_breadcrumb');
|
49
|
if ($show_breadcrumb == 'yes' || $show_breadcrumb == 'admin' && arg(0) == 'admin') {
|
50
|
|
51
|
// Optionally get rid of the homepage link.
|
52
|
$show_breadcrumb_home = theme_get_setting('zen_breadcrumb_home');
|
53
|
if (!$show_breadcrumb_home) {
|
54
|
array_shift($breadcrumb);
|
55
|
}
|
56
|
|
57
|
// Return the breadcrumb with separators.
|
58
|
if (!empty($breadcrumb)) {
|
59
|
$breadcrumb_separator = filter_xss_admin(theme_get_setting('zen_breadcrumb_separator'));
|
60
|
$trailing_separator = $title = '';
|
61
|
if (theme_get_setting('zen_breadcrumb_title')) {
|
62
|
$item = menu_get_item();
|
63
|
if (!empty($item['tab_parent'])) {
|
64
|
// If we are on a non-default tab, use the tab's title.
|
65
|
$breadcrumb[] = check_plain($item['title']);
|
66
|
}
|
67
|
else {
|
68
|
$breadcrumb[] = drupal_get_title();
|
69
|
}
|
70
|
}
|
71
|
elseif (theme_get_setting('zen_breadcrumb_trailing')) {
|
72
|
$trailing_separator = $breadcrumb_separator;
|
73
|
}
|
74
|
|
75
|
// Provide a navigational heading to give context for breadcrumb links to
|
76
|
// screen-reader users.
|
77
|
if (empty($variables['title'])) {
|
78
|
$variables['title'] = t('You are here');
|
79
|
}
|
80
|
// Unless overridden by a preprocess function, make the heading invisible.
|
81
|
if (!isset($variables['title_attributes_array']['class'])) {
|
82
|
$variables['title_attributes_array']['class'][] = 'element-invisible';
|
83
|
}
|
84
|
|
85
|
// Build the breadcrumb trail.
|
86
|
$output = '<nav class="breadcrumb" role="navigation">';
|
87
|
$output .= '<h2' . drupal_attributes($variables['title_attributes_array']) . '>' . $variables['title'] . '</h2>';
|
88
|
$output .= '<ol><li>' . implode($breadcrumb_separator . '</li><li>', $breadcrumb) . $trailing_separator . '</li></ol>';
|
89
|
$output .= '</nav>';
|
90
|
}
|
91
|
}
|
92
|
|
93
|
return $output;
|
94
|
}
|
95
|
|
96
|
/**
|
97
|
* Override or insert variables into the html template.
|
98
|
*
|
99
|
* @param $variables
|
100
|
* An array of variables to pass to the theme template.
|
101
|
* @param $hook
|
102
|
* The name of the template being rendered. This is usually "html", but can
|
103
|
* also be "maintenance_page" since zen_preprocess_maintenance_page() calls
|
104
|
* this function to have consistent variables.
|
105
|
*/
|
106
|
function zen_preprocess_html(&$variables, $hook) {
|
107
|
// Add variables and paths needed for HTML5 and responsive support.
|
108
|
$variables['base_path'] = base_path();
|
109
|
$variables['path_to_zen'] = drupal_get_path('theme', 'zen');
|
110
|
// Get settings for HTML5 and responsive support. array_filter() removes
|
111
|
// items from the array that have been disabled.
|
112
|
$html5_respond_meta = array_filter((array) theme_get_setting('zen_html5_respond_meta'));
|
113
|
$variables['add_respond_js'] = in_array('respond', $html5_respond_meta);
|
114
|
$variables['add_html5_shim'] = in_array('html5', $html5_respond_meta);
|
115
|
$variables['default_mobile_metatags'] = in_array('meta', $html5_respond_meta);
|
116
|
|
117
|
// If the user is silly and enables Zen as the theme, add some styles.
|
118
|
if ($GLOBALS['theme'] == 'zen') {
|
119
|
include_once './' . $variables['path_to_zen'] . '/zen-internals/template.zen.inc';
|
120
|
_zen_preprocess_html($variables, $hook);
|
121
|
}
|
122
|
|
123
|
// Attributes for html element.
|
124
|
$variables['html_attributes_array'] = array(
|
125
|
'lang' => $variables['language']->language,
|
126
|
'dir' => $variables['language']->dir,
|
127
|
);
|
128
|
|
129
|
// Send X-UA-Compatible HTTP header to force IE to use the most recent
|
130
|
// rendering engine or use Chrome's frame rendering engine if available.
|
131
|
// This also prevents the IE compatibility mode button to appear when using
|
132
|
// conditional classes on the html tag.
|
133
|
if (is_null(drupal_get_http_header('X-UA-Compatible'))) {
|
134
|
drupal_add_http_header('X-UA-Compatible', 'IE=edge,chrome=1');
|
135
|
}
|
136
|
|
137
|
$variables['skip_link_anchor'] = check_plain(theme_get_setting('zen_skip_link_anchor'));
|
138
|
$variables['skip_link_text'] = check_plain(theme_get_setting('zen_skip_link_text'));
|
139
|
|
140
|
// Return early, so the maintenance page does not call any of the code below.
|
141
|
if ($hook != 'html') {
|
142
|
return;
|
143
|
}
|
144
|
|
145
|
// Serialize RDF Namespaces into an RDFa 1.1 prefix attribute.
|
146
|
if ($variables['rdf_namespaces']) {
|
147
|
$prefixes = array();
|
148
|
foreach (explode("\n ", ltrim($variables['rdf_namespaces'])) as $namespace) {
|
149
|
// Remove xlmns: and ending quote and fix prefix formatting.
|
150
|
$prefixes[] = str_replace('="', ': ', substr($namespace, 6, -1));
|
151
|
}
|
152
|
$variables['rdf_namespaces'] = ' prefix="' . implode(' ', $prefixes) . '"';
|
153
|
}
|
154
|
|
155
|
// Classes for body element. Allows advanced theming based on context
|
156
|
// (home page, node of certain type, etc.)
|
157
|
if (!$variables['is_front']) {
|
158
|
// Add unique class for each page.
|
159
|
$path = drupal_get_path_alias($_GET['q']);
|
160
|
// Add unique class for each website section.
|
161
|
list($section, ) = explode('/', $path, 2);
|
162
|
$arg = explode('/', $_GET['q']);
|
163
|
if ($arg[0] == 'node' && isset($arg[1])) {
|
164
|
if ($arg[1] == 'add') {
|
165
|
$section = 'node-add';
|
166
|
}
|
167
|
elseif (isset($arg[2]) && is_numeric($arg[1]) && ($arg[2] == 'edit' || $arg[2] == 'delete')) {
|
168
|
$section = 'node-' . $arg[2];
|
169
|
}
|
170
|
}
|
171
|
$variables['classes_array'][] = drupal_html_class('section-' . $section);
|
172
|
}
|
173
|
if (theme_get_setting('zen_wireframes')) {
|
174
|
$variables['classes_array'][] = 'with-wireframes'; // Optionally add the wireframes style.
|
175
|
}
|
176
|
// Store the menu item since it has some useful information.
|
177
|
$variables['menu_item'] = menu_get_item();
|
178
|
if ($variables['menu_item']) {
|
179
|
switch ($variables['menu_item']['page_callback']) {
|
180
|
case 'views_page':
|
181
|
// Is this a Views page?
|
182
|
$variables['classes_array'][] = 'page-views';
|
183
|
break;
|
184
|
case 'page_manager_blog':
|
185
|
case 'page_manager_blog_user':
|
186
|
case 'page_manager_contact_site':
|
187
|
case 'page_manager_contact_user':
|
188
|
case 'page_manager_node_add':
|
189
|
case 'page_manager_node_edit':
|
190
|
case 'page_manager_node_view_page':
|
191
|
case 'page_manager_page_execute':
|
192
|
case 'page_manager_poll':
|
193
|
case 'page_manager_search_page':
|
194
|
case 'page_manager_term_view_page':
|
195
|
case 'page_manager_user_edit_page':
|
196
|
case 'page_manager_user_view_page':
|
197
|
// Is this a Panels page?
|
198
|
$variables['classes_array'][] = 'page-panels';
|
199
|
break;
|
200
|
}
|
201
|
}
|
202
|
}
|
203
|
|
204
|
/**
|
205
|
* Override or insert variables into the html templates.
|
206
|
*
|
207
|
* @param $variables
|
208
|
* An array of variables to pass to the theme template.
|
209
|
* @param $hook
|
210
|
* The name of the template being rendered ("html" in this case.)
|
211
|
*/
|
212
|
function zen_process_html(&$variables, $hook) {
|
213
|
// Flatten out html_attributes.
|
214
|
$variables['html_attributes'] = drupal_attributes($variables['html_attributes_array']);
|
215
|
}
|
216
|
|
217
|
/**
|
218
|
* Override or insert variables in the html_tag theme function.
|
219
|
*/
|
220
|
function zen_process_html_tag(&$variables) {
|
221
|
$tag = &$variables['element'];
|
222
|
|
223
|
if ($tag['#tag'] == 'style' || $tag['#tag'] == 'script') {
|
224
|
// Remove redundant type attribute and CDATA comments.
|
225
|
unset($tag['#attributes']['type'], $tag['#value_prefix'], $tag['#value_suffix']);
|
226
|
|
227
|
// Remove media="all" but leave others unaffected.
|
228
|
if (isset($tag['#attributes']['media']) && $tag['#attributes']['media'] === 'all') {
|
229
|
unset($tag['#attributes']['media']);
|
230
|
}
|
231
|
}
|
232
|
}
|
233
|
|
234
|
/**
|
235
|
* Implement hook_html_head_alter().
|
236
|
*/
|
237
|
function zen_html_head_alter(&$head) {
|
238
|
// Simplify the meta tag for character encoding.
|
239
|
if (isset($head['system_meta_content_type']['#attributes']['content'])) {
|
240
|
$head['system_meta_content_type']['#attributes'] = array('charset' => str_replace('text/html; charset=', '', $head['system_meta_content_type']['#attributes']['content']));
|
241
|
}
|
242
|
}
|
243
|
|
244
|
/**
|
245
|
* Override or insert variables into the page template.
|
246
|
*
|
247
|
* @param $variables
|
248
|
* An array of variables to pass to the theme template.
|
249
|
* @param $hook
|
250
|
* The name of the template being rendered ("page" in this case.)
|
251
|
*/
|
252
|
function zen_preprocess_page(&$variables, $hook) {
|
253
|
// Find the title of the menu used by the secondary links.
|
254
|
$secondary_links = variable_get('menu_secondary_links_source', 'user-menu');
|
255
|
if ($secondary_links) {
|
256
|
$menus = function_exists('menu_get_menus') ? menu_get_menus() : menu_list_system_menus();
|
257
|
$variables['secondary_menu_heading'] = $menus[$secondary_links];
|
258
|
}
|
259
|
else {
|
260
|
$variables['secondary_menu_heading'] = '';
|
261
|
}
|
262
|
}
|
263
|
|
264
|
/**
|
265
|
* Override or insert variables into the maintenance page template.
|
266
|
*
|
267
|
* @param $variables
|
268
|
* An array of variables to pass to the theme template.
|
269
|
* @param $hook
|
270
|
* The name of the template being rendered ("maintenance_page" in this case.)
|
271
|
*/
|
272
|
function zen_preprocess_maintenance_page(&$variables, $hook) {
|
273
|
zen_preprocess_html($variables, $hook);
|
274
|
// There's nothing maintenance-related in zen_preprocess_page(). Yet.
|
275
|
//zen_preprocess_page($variables, $hook);
|
276
|
}
|
277
|
|
278
|
/**
|
279
|
* Override or insert variables into the maintenance page template.
|
280
|
*
|
281
|
* @param $variables
|
282
|
* An array of variables to pass to the theme template.
|
283
|
* @param $hook
|
284
|
* The name of the template being rendered ("maintenance_page" in this case.)
|
285
|
*/
|
286
|
function zen_process_maintenance_page(&$variables, $hook) {
|
287
|
zen_process_html($variables, $hook);
|
288
|
// Ensure default regions get a variable. Theme authors often forget to remove
|
289
|
// a deleted region's variable in maintenance-page.tpl.
|
290
|
foreach (array('header', 'navigation', 'highlighted', 'help', 'content', 'sidebar_first', 'sidebar_second', 'footer', 'bottom') as $region) {
|
291
|
if (!isset($variables[$region])) {
|
292
|
$variables[$region] = '';
|
293
|
}
|
294
|
}
|
295
|
}
|
296
|
|
297
|
/**
|
298
|
* Override or insert variables into the node templates.
|
299
|
*
|
300
|
* @param $variables
|
301
|
* An array of variables to pass to the theme template.
|
302
|
* @param $hook
|
303
|
* The name of the template being rendered ("node" in this case.)
|
304
|
*/
|
305
|
function zen_preprocess_node(&$variables, $hook) {
|
306
|
// Add $unpublished variable.
|
307
|
$variables['unpublished'] = (!$variables['status']) ? TRUE : FALSE;
|
308
|
|
309
|
// Add pubdate to submitted variable.
|
310
|
$variables['pubdate'] = '<time pubdate datetime="' . format_date($variables['node']->created, 'custom', 'c') . '">' . $variables['date'] . '</time>';
|
311
|
if ($variables['display_submitted']) {
|
312
|
$variables['submitted'] = t('Submitted by !username on !datetime', array('!username' => $variables['name'], '!datetime' => $variables['pubdate']));
|
313
|
}
|
314
|
|
315
|
// Add a class for the view mode.
|
316
|
if (!$variables['teaser']) {
|
317
|
$variables['classes_array'][] = 'view-mode-' . $variables['view_mode'];
|
318
|
}
|
319
|
|
320
|
// Add a class to show node is authored by current user.
|
321
|
if ($variables['uid'] && $variables['uid'] == $GLOBALS['user']->uid) {
|
322
|
$variables['classes_array'][] = 'node-by-viewer';
|
323
|
}
|
324
|
|
325
|
$variables['title_attributes_array']['class'][] = 'node__title';
|
326
|
$variables['title_attributes_array']['class'][] = 'node-title';
|
327
|
}
|
328
|
|
329
|
/**
|
330
|
* Override or insert variables into the comment templates.
|
331
|
*
|
332
|
* @param $variables
|
333
|
* An array of variables to pass to the theme template.
|
334
|
* @param $hook
|
335
|
* The name of the template being rendered ("comment" in this case.)
|
336
|
*/
|
337
|
function zen_preprocess_comment(&$variables, $hook) {
|
338
|
// If comment subjects are disabled, don't display them.
|
339
|
if (variable_get('comment_subject_field_' . $variables['node']->type, 1) == 0) {
|
340
|
$variables['title'] = '';
|
341
|
}
|
342
|
|
343
|
// Add pubdate to submitted variable.
|
344
|
$variables['pubdate'] = '<time pubdate datetime="' . format_date($variables['comment']->created, 'custom', 'c') . '">' . $variables['created'] . '</time>';
|
345
|
$variables['submitted'] = t('!username replied on !datetime', array('!username' => $variables['author'], '!datetime' => $variables['pubdate']));
|
346
|
|
347
|
// Zebra striping.
|
348
|
if ($variables['id'] == 1) {
|
349
|
$variables['classes_array'][] = 'first';
|
350
|
}
|
351
|
if ($variables['id'] == $variables['node']->comment_count) {
|
352
|
$variables['classes_array'][] = 'last';
|
353
|
}
|
354
|
$variables['classes_array'][] = $variables['zebra'];
|
355
|
|
356
|
$variables['title_attributes_array']['class'][] = 'comment__title';
|
357
|
$variables['title_attributes_array']['class'][] = 'comment-title';
|
358
|
}
|
359
|
|
360
|
/**
|
361
|
* Preprocess variables for region.tpl.php
|
362
|
*
|
363
|
* @param $variables
|
364
|
* An array of variables to pass to the theme template.
|
365
|
* @param $hook
|
366
|
* The name of the template being rendered ("region" in this case.)
|
367
|
*/
|
368
|
function zen_preprocess_region(&$variables, $hook) {
|
369
|
// Sidebar regions get some extra classes and a common template suggestion.
|
370
|
if (strpos($variables['region'], 'sidebar_') === 0) {
|
371
|
$variables['classes_array'][] = 'column';
|
372
|
$variables['classes_array'][] = 'sidebar';
|
373
|
// Allow a region-specific template to override Zen's region--sidebar.
|
374
|
array_unshift($variables['theme_hook_suggestions'], 'region__sidebar');
|
375
|
}
|
376
|
// Use a template with no wrapper for the content region.
|
377
|
elseif ($variables['region'] == 'content') {
|
378
|
// Allow a region-specific template to override Zen's region--no-wrapper.
|
379
|
array_unshift($variables['theme_hook_suggestions'], 'region__no_wrapper');
|
380
|
}
|
381
|
// Add a SMACSS-style class for header region.
|
382
|
elseif ($variables['region'] == 'header') {
|
383
|
array_unshift($variables['classes_array'], 'header__region');
|
384
|
}
|
385
|
}
|
386
|
|
387
|
/**
|
388
|
* Override or insert variables into the block templates.
|
389
|
*
|
390
|
* @param $variables
|
391
|
* An array of variables to pass to the theme template.
|
392
|
* @param $hook
|
393
|
* The name of the template being rendered ("block" in this case.)
|
394
|
*/
|
395
|
function zen_preprocess_block(&$variables, $hook) {
|
396
|
// Use a template with no wrapper for the page's main content.
|
397
|
if ($variables['block_html_id'] == 'block-system-main') {
|
398
|
$variables['theme_hook_suggestions'][] = 'block__no_wrapper';
|
399
|
}
|
400
|
|
401
|
// Classes describing the position of the block within the region.
|
402
|
if ($variables['block_id'] == 1) {
|
403
|
$variables['classes_array'][] = 'first';
|
404
|
}
|
405
|
// The last_in_region property is set in zen_page_alter().
|
406
|
if (isset($variables['block']->last_in_region)) {
|
407
|
$variables['classes_array'][] = 'last';
|
408
|
}
|
409
|
$variables['classes_array'][] = $variables['block_zebra'];
|
410
|
|
411
|
$variables['title_attributes_array']['class'][] = 'block__title';
|
412
|
$variables['title_attributes_array']['class'][] = 'block-title';
|
413
|
|
414
|
// Add Aria Roles via attributes.
|
415
|
switch ($variables['block']->module) {
|
416
|
case 'system':
|
417
|
switch ($variables['block']->delta) {
|
418
|
case 'main':
|
419
|
// Note: the "main" role goes in the page.tpl, not here.
|
420
|
break;
|
421
|
case 'help':
|
422
|
case 'powered-by':
|
423
|
$variables['attributes_array']['role'] = 'complementary';
|
424
|
break;
|
425
|
default:
|
426
|
// Any other "system" block is a menu block.
|
427
|
$variables['attributes_array']['role'] = 'navigation';
|
428
|
break;
|
429
|
}
|
430
|
break;
|
431
|
case 'menu':
|
432
|
case 'menu_block':
|
433
|
case 'blog':
|
434
|
case 'book':
|
435
|
case 'comment':
|
436
|
case 'forum':
|
437
|
case 'shortcut':
|
438
|
case 'statistics':
|
439
|
$variables['attributes_array']['role'] = 'navigation';
|
440
|
break;
|
441
|
case 'search':
|
442
|
$variables['attributes_array']['role'] = 'search';
|
443
|
break;
|
444
|
case 'help':
|
445
|
case 'aggregator':
|
446
|
case 'locale':
|
447
|
case 'poll':
|
448
|
case 'profile':
|
449
|
$variables['attributes_array']['role'] = 'complementary';
|
450
|
break;
|
451
|
case 'node':
|
452
|
switch ($variables['block']->delta) {
|
453
|
case 'syndicate':
|
454
|
$variables['attributes_array']['role'] = 'complementary';
|
455
|
break;
|
456
|
case 'recent':
|
457
|
$variables['attributes_array']['role'] = 'navigation';
|
458
|
break;
|
459
|
}
|
460
|
break;
|
461
|
case 'user':
|
462
|
switch ($variables['block']->delta) {
|
463
|
case 'login':
|
464
|
$variables['attributes_array']['role'] = 'form';
|
465
|
break;
|
466
|
case 'new':
|
467
|
case 'online':
|
468
|
$variables['attributes_array']['role'] = 'complementary';
|
469
|
break;
|
470
|
}
|
471
|
break;
|
472
|
}
|
473
|
}
|
474
|
|
475
|
/**
|
476
|
* Override or insert variables into the block templates.
|
477
|
*
|
478
|
* @param $variables
|
479
|
* An array of variables to pass to the theme template.
|
480
|
* @param $hook
|
481
|
* The name of the template being rendered ("block" in this case.)
|
482
|
*/
|
483
|
function zen_process_block(&$variables, $hook) {
|
484
|
// Drupal 7 should use a $title variable instead of $block->subject.
|
485
|
$variables['title'] = isset($variables['block']->subject) ? $variables['block']->subject : '';
|
486
|
}
|
487
|
|
488
|
/**
|
489
|
* Implements hook_page_alter().
|
490
|
*
|
491
|
* Look for the last block in the region. This is impossible to determine from
|
492
|
* within a preprocess_block function.
|
493
|
*
|
494
|
* @param $page
|
495
|
* Nested array of renderable elements that make up the page.
|
496
|
*/
|
497
|
function zen_page_alter(&$page) {
|
498
|
// Look in each visible region for blocks.
|
499
|
foreach (system_region_list($GLOBALS['theme'], REGIONS_VISIBLE) as $region => $name) {
|
500
|
if (!empty($page[$region])) {
|
501
|
// Find the last block in the region.
|
502
|
$blocks = array_reverse(element_children($page[$region]));
|
503
|
while ($blocks && !isset($page[$region][$blocks[0]]['#block'])) {
|
504
|
array_shift($blocks);
|
505
|
}
|
506
|
if ($blocks) {
|
507
|
$page[$region][$blocks[0]]['#block']->last_in_region = TRUE;
|
508
|
}
|
509
|
}
|
510
|
}
|
511
|
}
|
512
|
|
513
|
/**
|
514
|
* Implements hook_form_BASE_FORM_ID_alter().
|
515
|
*
|
516
|
* Prevent user-facing field styling from screwing up node edit forms by
|
517
|
* renaming the classes on the node edit form's field wrappers.
|
518
|
*/
|
519
|
function zen_form_node_form_alter(&$form, &$form_state, $form_id) {
|
520
|
// Remove if #1245218 is backported to D7 core.
|
521
|
foreach (array_keys($form) as $item) {
|
522
|
if (strpos($item, 'field_') === 0) {
|
523
|
if (!empty($form[$item]['#attributes']['class'])) {
|
524
|
foreach ($form[$item]['#attributes']['class'] as &$class) {
|
525
|
// Core bug: the field-type-text-with-summary class is used as a JS hook.
|
526
|
if ($class != 'field-type-text-with-summary' && strpos($class, 'field-type-') === 0 || strpos($class, 'field-name-') === 0) {
|
527
|
// Make the class different from that used in theme_field().
|
528
|
$class = 'form-' . $class;
|
529
|
}
|
530
|
}
|
531
|
}
|
532
|
}
|
533
|
}
|
534
|
}
|
535
|
|
536
|
/**
|
537
|
* Returns HTML for primary and secondary local tasks.
|
538
|
*
|
539
|
* @ingroup themeable
|
540
|
*/
|
541
|
function zen_menu_local_tasks(&$variables) {
|
542
|
$output = '';
|
543
|
|
544
|
// Add theme hook suggestions for tab type.
|
545
|
foreach (array('primary', 'secondary') as $type) {
|
546
|
if (!empty($variables[$type])) {
|
547
|
foreach (array_keys($variables[$type]) as $key) {
|
548
|
if (isset($variables[$type][$key]['#theme']) && ($variables[$type][$key]['#theme'] == 'menu_local_task' || is_array($variables[$type][$key]['#theme']) && in_array('menu_local_task', $variables[$type][$key]['#theme']))) {
|
549
|
$variables[$type][$key]['#theme'] = array('menu_local_task__' . $type, 'menu_local_task');
|
550
|
}
|
551
|
}
|
552
|
}
|
553
|
}
|
554
|
|
555
|
if (!empty($variables['primary'])) {
|
556
|
$variables['primary']['#prefix'] = '<h2 class="element-invisible">' . t('Primary tabs') . '</h2>';
|
557
|
$variables['primary']['#prefix'] .= '<ul class="tabs-primary tabs primary">';
|
558
|
$variables['primary']['#suffix'] = '</ul>';
|
559
|
$output .= drupal_render($variables['primary']);
|
560
|
}
|
561
|
if (!empty($variables['secondary'])) {
|
562
|
$variables['secondary']['#prefix'] = '<h2 class="element-invisible">' . t('Secondary tabs') . '</h2>';
|
563
|
$variables['secondary']['#prefix'] .= '<ul class="tabs-secondary tabs secondary">';
|
564
|
$variables['secondary']['#suffix'] = '</ul>';
|
565
|
$output .= drupal_render($variables['secondary']);
|
566
|
}
|
567
|
|
568
|
return $output;
|
569
|
}
|
570
|
|
571
|
/**
|
572
|
* Returns HTML for a single local task link.
|
573
|
*
|
574
|
* @ingroup themeable
|
575
|
*/
|
576
|
function zen_menu_local_task($variables) {
|
577
|
$type = $class = FALSE;
|
578
|
|
579
|
$link = $variables['element']['#link'];
|
580
|
$link_text = $link['title'];
|
581
|
|
582
|
// Check for tab type set in zen_menu_local_tasks().
|
583
|
if (is_array($variables['element']['#theme'])) {
|
584
|
$type = in_array('menu_local_task__secondary', $variables['element']['#theme']) ? 'tabs-secondary' : 'tabs-primary';
|
585
|
}
|
586
|
|
587
|
// Add SMACSS-style class names.
|
588
|
if ($type) {
|
589
|
$link['localized_options']['attributes']['class'][] = $type . '__tab-link';
|
590
|
$class = $type . '__tab';
|
591
|
}
|
592
|
|
593
|
if (!empty($variables['element']['#active'])) {
|
594
|
// Add text to indicate active tab for non-visual users.
|
595
|
$active = ' <span class="element-invisible">' . t('(active tab)') . '</span>';
|
596
|
|
597
|
// If the link does not contain HTML already, check_plain() it now.
|
598
|
// After we set 'html'=TRUE the link will not be sanitized by l().
|
599
|
if (empty($link['localized_options']['html'])) {
|
600
|
$link['title'] = check_plain($link['title']);
|
601
|
}
|
602
|
$link['localized_options']['html'] = TRUE;
|
603
|
$link_text = t('!local-task-title!active', array('!local-task-title' => $link['title'], '!active' => $active));
|
604
|
|
605
|
if (!$type) {
|
606
|
$class = 'active';
|
607
|
}
|
608
|
else {
|
609
|
$link['localized_options']['attributes']['class'][] = 'is-active';
|
610
|
$class .= ' is-active';
|
611
|
}
|
612
|
}
|
613
|
|
614
|
return '<li' . ($class ? ' class="' . $class . '"' : '') . '>' . l($link_text, $link['href'], $link['localized_options']) . "</li>\n";
|
615
|
}
|
616
|
|
617
|
/**
|
618
|
* Implements hook_preprocess_menu_link().
|
619
|
*/
|
620
|
function zen_preprocess_menu_link(&$variables, $hook) {
|
621
|
foreach ($variables['element']['#attributes']['class'] as $key => $class) {
|
622
|
switch ($class) {
|
623
|
// Menu module classes.
|
624
|
case 'expanded':
|
625
|
case 'collapsed':
|
626
|
case 'leaf':
|
627
|
case 'active':
|
628
|
// Menu block module classes.
|
629
|
case 'active-trail':
|
630
|
array_unshift($variables['element']['#attributes']['class'], 'is-' . $class);
|
631
|
break;
|
632
|
case 'has-children':
|
633
|
array_unshift($variables['element']['#attributes']['class'], 'is-parent');
|
634
|
break;
|
635
|
}
|
636
|
}
|
637
|
array_unshift($variables['element']['#attributes']['class'], 'menu__item');
|
638
|
if (empty($variables['element']['#localized_options']['attributes']['class'])) {
|
639
|
$variables['element']['#localized_options']['attributes']['class'] = array();
|
640
|
}
|
641
|
else {
|
642
|
foreach ($variables['element']['#localized_options']['attributes']['class'] as $key => $class) {
|
643
|
switch ($class) {
|
644
|
case 'active':
|
645
|
case 'active-trail':
|
646
|
array_unshift($variables['element']['#localized_options']['attributes']['class'], 'is-' . $class);
|
647
|
break;
|
648
|
}
|
649
|
}
|
650
|
}
|
651
|
array_unshift($variables['element']['#localized_options']['attributes']['class'], 'menu__link');
|
652
|
}
|
653
|
|
654
|
/**
|
655
|
* Returns HTML for status and/or error messages, grouped by type.
|
656
|
*/
|
657
|
function zen_status_messages($variables) {
|
658
|
$display = $variables['display'];
|
659
|
$output = '';
|
660
|
|
661
|
$status_heading = array(
|
662
|
'status' => t('Status message'),
|
663
|
'error' => t('Error message'),
|
664
|
'warning' => t('Warning message'),
|
665
|
);
|
666
|
foreach (drupal_get_messages($display) as $type => $messages) {
|
667
|
$output .= "<div class=\"messages--$type messages $type\">\n";
|
668
|
if (!empty($status_heading[$type])) {
|
669
|
$output .= '<h2 class="element-invisible">' . $status_heading[$type] . "</h2>\n";
|
670
|
}
|
671
|
if (count($messages) > 1) {
|
672
|
$output .= " <ul class=\"messages__list\">\n";
|
673
|
foreach ($messages as $message) {
|
674
|
$output .= ' <li class=\"messages__item\">' . $message . "</li>\n";
|
675
|
}
|
676
|
$output .= " </ul>\n";
|
677
|
}
|
678
|
else {
|
679
|
$output .= $messages[0];
|
680
|
}
|
681
|
$output .= "</div>\n";
|
682
|
}
|
683
|
return $output;
|
684
|
}
|
685
|
|
686
|
/**
|
687
|
* Returns HTML for a marker for new or updated content.
|
688
|
*/
|
689
|
function zen_mark($variables) {
|
690
|
$type = $variables['type'];
|
691
|
|
692
|
if ($type == MARK_NEW) {
|
693
|
return ' <mark class="new">' . t('new') . '</mark>';
|
694
|
}
|
695
|
elseif ($type == MARK_UPDATED) {
|
696
|
return ' <mark class="updated">' . t('updated') . '</mark>';
|
697
|
}
|
698
|
}
|
699
|
|
700
|
/**
|
701
|
* Alters the default Panels render callback so it removes the panel separator.
|
702
|
*/
|
703
|
function zen_panels_default_style_render_region($variables) {
|
704
|
return implode('', $variables['panes']);
|
705
|
}
|