Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
<?php /** * Theming a common wrapper to supply html attributes without modifying templates. */ /** * These variables will be available to all templates owned by this theme or * any sub-themes. */ function THEME_NAME_preprocess(&$vars, $hook) { global $theme_key; // From general to more specific, add these wrapper paths and template names. // Applies to all templated hooks. More can be added through hook specific // preprocess but these should be good enough for most cases. We want less // templates, not more. // Add paths to your wrapper templates. The default will sit in the base of // your theme. path_to_theme() not used since it can lead to module owned templates. $vars['template_wrapper_paths'][] = drupal_get_path('theme', $theme_key); $vars['template_wrappers'][] = 'common-wrapper'; $vars['template_wrappers'][] = $hook . '-wrapper'; // Element attributes can be added either way but this is easier to enter... $vars['wrapper_id'] = ''; $vars['wrapper_classes'][] = $hook . '-wrapper'; // ...While this structure allows passing through drupal_attributes(). $vars['wrapper_attributes_array']['id'] = &$vars['wrapper_id']; $vars['wrapper_attributes_array']['class'] = &$vars['wrapper_classes']; // Simple switch to trigger. // You definitely don't want this on the page hook. $vars['enable_wrapper'] = $hook !== 'page' ? TRUE : FALSE; } /** * Override of theme_render_template. This allows for template wrappers. */ function phptemplate_render_template($template_file, &$variables) { process_template_wrapper($variables); // Template render. extract($variables, EXTR_SKIP && EXTR_REFS); ob_start(); include "./$template_file"; $contents = ob_get_contents(); ob_end_clean(); // Template wrapper. if (!empty($variables['template_wrapper']) && !empty($contents)) { ob_start(); include './' . $variables['template_wrapper']; $contents = ob_get_contents(); ob_end_clean(); } return $contents; } /** * A little helper to find the right wrapper template and to clean html attributes. */ function process_template_wrapper(&$variables) { $variables['template_wrapper'] = $variables['wrapper_attributes'] = ''; if (!empty($variables['enable_wrapper']) && $template_wrapper = drupal_discover_template($variables['template_wrapper_paths'], $variables['template_wrappers'])) { $attributes = array(); foreach ($variables['wrapper_attributes_array'] as $attribute => $value) { if (empty($value)) { continue; } if (is_array($value)) { $value = implode(' ', $value); } $attributes[$attribute] = $value; } $variables['wrapper_attributes'] = drupal_attributes($attributes); $variables['template_wrapper'] = $template_wrapper; } } ?> <?php /** * Within 'common-wrapper.tpl.php' or 'HOOK-wrapper.tpl.php': */ ?> <div<?php print $wrapper_attributes ?>> <?php print $contents ?> </div>
This paste will be private.
From the Design Piracy series on my blog: