'messaging_template_text', '#options' => array(), '#format' => MESSAGING_FORMAT, '#markup' => '', '#pre_render' => array('messaging_template_pre_render_text'), '#post_render' => array('messaging_template_post_render_text'), ); $types['messaging_template_subject'] = array( '#markup' => '', '#separator' => ' ', '#plaintext' => TRUE, // This element can render itself as plain text '#theme' => 'messaging_template_subject', '#pre_render' => array('drupal_pre_render_markup'), '#post_render' => array('messaging_template_post_render_text'), ); $types['messaging_template_body'] = array( '#theme' => 'messaging_template_body', '#pre_render' => array('messaging_template_pre_render_body'), ); $types['messaging_link'] = array( '#plaintext' => TRUE, // This element can render itself as plain text '#options' => array(), '#pre_render' => array('messaging_template_pre_render_link', 'drupal_pre_render_markup'), ); $types['messaging_list'] = array( '#theme' => 'item_list', '#title' => '', '#options' => array(), '#pre_render' => array('messaging_template_pre_render_list'), ); return $types; } /** * Implements hook_theme() */ function messaging_template_theme() { return array( 'messaging_template_text' => array( 'render element' => 'element', 'file' => 'messaging_template.inc', ), 'messaging_template_subject' => array( 'render element' => 'element', 'file' => 'messaging_template.inc', ), 'messaging_template_body' => array( 'render element' => 'element', 'file' => 'messaging_template.inc', ), 'messaging_template_body_html' => array( 'variables' => array('element' => NULL, 'header' => NULL, 'content' => NULL, 'footer' => NULL), 'template' => 'messaging_template_body_html', ), 'messaging_template_body_plain' => array( 'variables' => array('element' => NULL, 'header' => NULL, 'content' => NULL, 'footer' => NULL), 'template' => 'messaging_template_body_plain', ), ); } /** * Prepare body elements */ function messaging_template_pre_render_body($element) { return messaging_template_pre_render_element($element); } /** * Prepare text */ function messaging_template_pre_render_text($element) { $options = $element['#options']; if ($element['#format'] == MESSAGING_FORMAT_HTML) { $element += array('#linebreak' => '
'); } else { //$element = messaging_template_pre_render_text_plain($element); $element += array('#linebreak' => "\n"); // If it is the base element, add text wrapper. We just want to run it once for each part //$element['#post_render'][] = 'messaging_template_html_to_text'; } // Propagate properties $element = messaging_template_pre_render_element($element); return $element; } /** * Post render message text (header, content, footer) * - Token replacement if needed * - Final text plain formatting */ function messaging_template_post_render_text($string, $element) { if (!empty($element['#tokens']) && !empty($element['#options']['replace']) && $element['#template']) { $string = $element['#template']->token_replace($string); } if ($string && $element['#format'] == MESSAGING_FORMAT_PLAIN && empty($element['#plaintext'])) { $string = drupal_html_to_text($string); } return $string; } /** * Prepare element (add format, method properties recursively) */ function messaging_template_pre_render_element($element) { // Add properties to all the tree $properties = array( '#format' => $element['#format'], '#method' => $element['#method'], ); foreach (element_children($element) as $index) { $element[$index] = $properties + $element[$index]; $element[$index] = messaging_template_pre_render_element($element[$index]); } return $element; } /** * Prepare list for theme_item_list */ function messaging_template_pre_render_list($element) { foreach (element_children($element) as $index) { $element['#items'][] = drupal_render($element[$index]); } // Remove element type, that will clash with item_list parameter unset($element['#type']); return $element; } /** * Preprocess message text */ function template_preprocess_messaging_template_body(&$variables) { $element = $variables['element']; // Add default template tokens $variables['tokens'] = $element['#template']->get_tokens(); // Render all body parts, not only 'header', 'content', 'footer' foreach (element_children($element) as $index) { $variables[$index] = isset($element[$index]) ? drupal_render($element[$index]) : ''; } } /** * Render links (txt or html) * * Element properties * - #text, plain text to prefix the link * - #title, link title, will default to the url itself if not available * - #url, Full url, when we don't want to run it through url() */ function messaging_template_pre_render_link($element) { // Fill some default options we are using later $element['#options'] += array('attributes' => array(), 'html' => FALSE); $element += array('#title' => '', '#prefix' => '', '#text' => ''); // However, within the scope of renderable elements, #attributes is a valid // way to specify attributes, too. Take them into account, but do not override // attributes from #options. if (isset($element['#attributes'])) { $element['#options']['attributes'] += $element['#attributes']; } if ($element['#format'] == MESSAGING_FORMAT_HTML && !empty($element['#href']) && $element['#title']) { if ($element['#text']) { $element['#prefix'] .= $element['#text'] . ' '; } // If its a regular link, render with default function return drupal_pre_render_link($element); } else { $url = !empty($element['#url']) ? $element['#url'] : url($element['#href'], $element['#options']); $text = !empty($element['#text']) ? check_plain($element['#text']) . ' ' : ''; if ($element['#format'] == MESSAGING_FORMAT_HTML) { if ($element['#title']) { $title = $element['#options']['html'] ? $element['#title'] : check_plain($element['#title']); } else { $title = $url; } $element['#markup'] = $text . '' . $title . ''; } else { // The text will be the title if no text available $text = $text ? $text : $element['#title'] . ' '; $element['#markup'] = $text . $url; } return $element; } } /** * Format as plaintext * @param $string * @param $elements */ function messaging_template_html_to_text($string, $elements){ return $string ? drupal_html_to_text($string) : $string; }