1); drupal_add_css(drupal_get_path('module', 'mail_edit') . '/mail_edit.admin.css'); $form['#submit'][] = 'mail_edit_list_submit'; return $form; } /** * Filter the mail edit table. * * @param array $languages_selected * The list of selected langauges. * @param $module * The selected module option. * @return array * The $form array. */ function mail_edit_list_filter($languages_selected, $module, $language_list) { if (count($language_list) > 1) { $form['languages_selected'] = array( '#type' => 'select', '#title' => t('Languages'), '#description' => t('Select the languages to display.'), '#options' => $language_list, '#default_value' => array_keys($languages_selected), '#multiple' => TRUE, ); } $module_list = _mail_edit_module_list(TRUE); $options['-enabled'] = t('- Display enabled modules only -'); $options['-all'] = t('- Display all modules -'); $result = db_query('SELECT DISTINCT(module) FROM {mail_edit_registry} ORDER BY module'); while ($row = db_fetch_object($result)) { $options[$row->module] = isset($module_list[$row->module]) ? $module_list[$row->module] : check_plain($row->module); } $form['module'] = array( '#type' => 'select', '#title' => t('Module'), '#description' => t('Select a module.'), '#options' => $options, '#default_value' => $module, ); $form['submit'] = array( '#type' => 'item', '#value' => '', ); $form['submit']['filter'] = array( '#type' => 'submit', '#value' => t('Filter'), ); $form['language_list'] = array( '#type' => 'hidden', '#value' => serialize($language_list), ); $form['#theme'] = 'mail_edit_list_filter'; return $form; } /** * Create $form array with filtered list. * * @param $languages * The languages to include. * @param $module * The module option to restrict the list with. * @return array * The $form array. */ function mail_edit_list_filtered_form($languages_selected, $module, $display_language_names) { _mail_edit_key_registry_rebuild(); $header = _mail_edit_list_get_header($languages_selected, $display_language_names); switch ($module) { case '-all': $sql = "SELECT mer.id, mer.module, mer.mailkey, mer.description FROM {mail_edit_registry} mer ORDER BY mer.module, mer.mailkey"; $result = pager_query($sql, 50, 0); break; case '-enabled': $enabled_modules = array_keys(_mail_edit_module_list()); $placeholders = db_placeholders($enabled_modules, 'varchar'); $sql = "SELECT mer.id, mer.module, mer.mailkey, mer.description FROM {mail_edit_registry} mer WHERE mer.module IN (" . $placeholders . ") ORDER BY mer.module, mer.mailkey"; $result = pager_query($sql, 50, 0, NULL, $enabled_modules); break; default: $sql = "SELECT mer.id, mer.module, mer.mailkey, mer.description FROM {mail_edit_registry} mer WHERE mer.module = '%s' ORDER BY mer.module, mer.mailkey"; $result = pager_query($sql, 50, 0, NULL, $module); break; } $form['templates']['#tree'] = TRUE; $form['#cache'] = TRUE; $form['header'] = array( '#type' => 'value', '#value' => $header, ); $form['templates'] = array(); while ($template = db_fetch_object($result)) { // Add all translated languages to template. $result2 = db_query("SELECT language FROM {mail_edit} WHERE id = '%s'", $template->id); while ($template2 = db_fetch_object($result2)) { $template->languages[$template2->language] = TRUE; } $form['templates'][$template->id] = _mail_edit_list_row($template, $languages_selected, $display_language_names); } $form['languages'] = array( '#type' => 'value', '#value' => $languages_selected, ); $form['pager'] = array('#value' => theme('pager', NULL, 50, 0)); $form['#theme'] = 'mail_edit_table'; return $form; } /** * Build the header for the mail edit table. * * @param array $languages_selected * The languages to include. * @param bool $display_language_names * Whether to display the name of the langauge. * @return array */ function _mail_edit_list_get_header($languages_selected, $display_language_names) { $header = array( array('data' => t('Module')), array('data' => t('Mailkey')), ); foreach ($languages_selected as $lang_name) { $header[] = array('data' => ($display_language_names ? $lang_name : t('Operations'))); } return $header; } /** * Build one row of the mail edit table. * * @param $template * The mail template for this row. * @param $languages * The languages to include. * @return array */ function _mail_edit_list_row($template, $languages, $display_language_names) { $module_list = _mail_edit_module_list(TRUE); $form['module'] = array( '#type' => 'markup', '#value' => isset($module_list[$template->module]) ? $module_list[$template->module] : check_plain($template->module), ); $form['id'] = array( '#type' => 'value', '#value' => check_plain($template->id), ); $form['mailkey'] = array( '#type' => 'markup', '#value' => check_plain($template->mailkey), ); $form['description'] = array( '#type' => 'markup', '#value' => filter_xss_admin($template->description), ); $form['operations'] = array( '#type' => 'markup', '#value' => '', ); foreach ($languages as $lang_code => $lang_name) { $variable = array('@language' => $lang_code); if ($display_language_names) { $link_text = t(isset($template->languages[$lang_code]) ? 'Edit @language' : 'Add @language', $variable); } else { $link_text = t(isset($template->languages[$lang_code]) ? 'Edit' : 'Add'); } $form[$lang_code] = array( '#type' => 'markup', '#value' => l($link_text, 'admin/build/mail-edit/'. $template->id .'/'. $lang_code), ); } return $form; } /** * The submit handler for mail_edit_list_form(). * * @param $form * @param $form_state */ function mail_edit_list_form_submit($form, &$form_state) { $language_list = unserialize($form_state['values']['language_list']); $_SESSION['mail_edit']['module'] = $form_state['values']['module']; if (isset($form_state['values']['languages_selected'])) { $_SESSION['mail_edit']['languages_selected'] = array_intersect_key($language_list, $form_state['values']['languages_selected']); } } /** * The theme function for the basic filter form. * * @param $form * @return string * * @ingroup themeable */ function theme_mail_edit_list_filter($form) { $output = '
'; foreach (element_children($form) as $key) { $attributes = drupal_attributes(array( 'id' => 'mail-edit-'. str_replace('_', '-', $key) .'-filter', 'class' => 'mail-edit-filter', )); $output .= "
"; $output .= drupal_render($form[$key]); $output .= '
'; } $output .= '
'; return $output; } /** * The theme function for the mail edit table. * * @param $form * @return string * * @ingroup themeable */ function theme_mail_edit_table($form) { $rows = array(); $header = $form['header']['#value']; $languages = $form['languages']['#value']; foreach (element_children($form['templates']) as $key) { // Build the table row. $row = array(); $row['data'][] = array('data' => drupal_render($form['templates'][$key]['module'])); $row['data'][] = array('data' => drupal_render($form['templates'][$key]['mailkey']) . '
' . drupal_render($form['templates'][$key]['description']) . '
'); foreach ($languages as $lang_code => $lang_name) { $row['data'][] = array('data' => drupal_render($form['templates'][$key][$lang_code]), 'class' => 'mail-edit-table-'. $lang_code); }; $row['data'][] = array('data' => drupal_render($form['templates'][$key]['operations'])); $rows[] = $row; } if (empty($rows)) { $rows[] = array(array( 'data' => t('No templates available for override.'), 'colspan' => count($header), )); } $output = theme('table', $header, $rows, array('id' => 'mail-edit-table')); if ($form['pager']['#value']) { $output .= drupal_render($form['pager']); } return $output; } /** * Builds the list of modules that expose mailkeys. * * @param bool $all * Return all modules if TRUE, or only enabled ones otherwise. * @return array */ function _mail_edit_module_list($all = FALSE) { static $modules; if (isset($modules[$all])) { return $modules[$all]; } $modules[$all] = array(); if ($all) { $sql = "SELECT name, info FROM {system} WHERE type = 'module' ORDER BY name ASC"; } else { $sql = "SELECT name, info FROM {system} WHERE type = 'module' AND status = 1 ORDER BY name ASC"; } $result = db_query($sql); while ($module = db_fetch_object($result)) { $info = unserialize($module->info); $modules[$all][$module->name] = $info['name']; } return $modules[$all]; } function mail_edit_trans(&$form_status, $id, $lang) { _mail_edit_include(); $query = "SELECT * FROM {mail_edit_registry} WHERE id = '%s'"; $result = db_query($query, $id); $mailkey_obj = db_fetch_object($result); $mailkey = $mailkey_obj->id; $query = "SELECT * FROM {mail_edit} WHERE id = '%s' AND language = '%s'"; $result = db_query($query, $mailkey, $lang); // If template is set, then we need to update, if its not set then we need to insert. $template = db_fetch_object($result); if ($template) { $update = TRUE; } else { $update = FALSE; } $language = new stdClass(); $language->language = $lang; $mail_data = module_invoke($mailkey_obj->module, 'mail_edit_text', $mailkey_obj->mailkey, $language); if (!isset($template->subject)) { $template->subject = $mail_data['subject']; } if (!isset($template->body)) { $template->body = $mail_data['body']; } $variables = array('%mailkey' => $mailkey, '%language' => $lang); if ($update) { $message = t('Update %mailkey template for %language', $variables); } else { $message = t('Create new %mailkey template for %language', $variables); } drupal_set_title($message); $tokens = array(); $tokens = module_invoke($mailkey_obj->module, 'mail_edit_tokens_list', $mailkey_obj->mailkey); // Allow other modules to alter tokens for specific mailkey id. drupal_alter($mailkey_obj->id, $tokens); $form = array(); $form['update'] = array( '#type' => 'hidden', '#value' => $update, ); $form['language'] = array( '#type' => 'hidden', '#value' => $lang, ); $form['id'] = array( '#type' => 'hidden', '#value' => $id, ); $form['description'] = array( '#title' => t('Description'), '#type' => 'textfield', '#default_value' => isset($template->description) ? $template->description : (isset($mailkey_obj->description) ? filter_xss($mailkey_obj->description, array()) : ''), ); $form['mail'] = array( '#type' => 'fieldset', '#title' => t('Template'), '#collapsible' => TRUE, ); $form['mail']['subject'] = array( '#title' => t('Subject'), '#type' => 'textfield', '#default_value' => isset($template->subject) ? $template->subject : '', ); $form['mail']['body'] = array( '#title' => t('Body'), '#type' => 'textarea', '#default_value' => isset($template->body) ? $template->body : '', '#rows' => 15, ); $placeholders = $tokens; // Display the user documentation of placeholders supported by this module mailkey. $doc = "
\n"; foreach ($placeholders as $name => $description) { $doc .= '
'. $name .'
'; $doc .= '
'. $description .'
'; } $doc .= "
\n"; $form['mail']['token_help'] = array( '#title' => t('Replacement patterns'), '#type' => 'fieldset', '#collapsible' => TRUE, '#collapsed' => TRUE, ); $form['mail']['token_help']['help'] = array( '#value' => $doc, ); $form['op'] = array( '#type' => 'submit', '#value' => $update ? t('Update template') : t('Save new template'), '#submit' => array('mail_edit_trans_save'), ); if ($update) { $form['delete'] = array( '#type' => 'submit', '#value' => t('Remove @language translation', array('@language' => $lang)), '#submit' => array('mail_edit_trans_delete'), ); } return $form; } function mail_edit_trans_delete($form, &$form_state) { $query = "DELETE FROM {mail_edit} WHERE id = '%s' AND language = '%s'"; $args[] = $form_state['values']['id']; $args[] = $form_state['values']['language']; $variables = array('%language' => $form_state['values']['language'], '%id' => $form_state['values']['id']); if (db_query($query, $args)) { drupal_set_message(t('%language translation of %id has been removed', $variables)); } else { drupal_set_message(t('Failed to remove %language translation of %id', $variables)); } $form_state['redirect'] = 'admin/build/mail-edit'; } function mail_edit_trans_save($form, &$form_state) { $update = $form_state['values']['update']; if ($update) { // Do update. $query = " UPDATE {mail_edit} SET description = '%s', subject = '%s', body = '%s' WHERE id = '%s' AND language = '%s' "; $values = $form_state['values']; $args[] = $values['description']; $args[] = $values['subject']; $args[] = $values['body']; $args[] = $values['id']; $args[] = $values['language']; if (db_query($query, $args)) { } else { drupal_set_message(t('Failed to save template for %id for the %language translation', array('%id' => $values['id'], '%language' => $values['language']))); } } else { // Do insert. $query = "INSERT INTO {mail_edit} (description, subject, id, body, language) VALUES ( '%s', '%s', '%s', '%s', '%s' ) "; $values = $form_state['values']; $args[] = $values['description']; $args[] = $values['subject']; $args[] = $values['id']; $args[] = $values['body']; $args[] = $values['language']; if (!db_query($query, $args)) { drupal_set_message(t('Failed to save template for %id for the %language translation', array('%id' => $values['id'], '%language' => $values['language']))); } } $form_state['redirect'] = 'admin/build/mail-edit'; } /** * Builds the registry of exposed mailkeys, keeps track of which module * exposed them. * * @return unknown */ function _mail_edit_key_registry_rebuild() { // Fetch exposed mailkeys. $hook = 'mailkeys'; $mailkeys = array(); foreach (module_implements($hook) as $module) { $function = $module .'_'. $hook; $result = $function(); if (isset($result)) { $mailkeys[$module] = $result; } } // Find out if we already have record of the exposed keys. $query = "SELECT * FROM {mail_edit_registry}"; $result = db_query($query); while ($row = db_fetch_object($result)) { if (isset($mailkeys[$row->module][$row->mailkey])) { unset($mailkeys[$row->module][$row->mailkey]); } } // Insert any new mailkeys into our registry table. foreach ($mailkeys as $module => $keys) { foreach ($keys as $key => $description) { $query = "INSERT INTO {mail_edit_registry} (id, module, mailkey, description) VALUES ('%s', '%s', '%s', '%s')"; db_query($query, $module .'_'. $key, $module, $key, $description); } } }