csm.module in Custom Submit Messages 6
Same filename and directory in other branches
The main module file for Custom Submit Messages.
File
csm.moduleView source
<?php
/**
* @file
* The main module file for Custom Submit Messages.
*/
/**
* Implements hook_form_alter().
*/
function csm_form_alter(&$form, $form_state, $form_id) {
if ($form_id == 'node_type_form' && isset($form['identity']['type'])) {
if (user_access('change ' . $form['#node_type']->type . ' submit messages')) {
// If the current user has the correct permissions, add submit message
// setting fields to the form
$form['csm'] = array(
'#type' => 'fieldset',
'#title' => t('Submit message settings'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
global $language;
$current_lang = $language->language;
// Add submit message subsections for each language
foreach (language_list() as $lang => $details) {
$form['csm'][$lang] = _csm_lang_fieldsets($lang, $form['#node_type']->type);
$form['csm'][$lang]['#title'] = t($details->name);
if ($lang == $current_lang) {
$form['csm'][$lang]['#collapsed'] = FALSE;
}
}
}
if (user_access('change ' . $form['#node_type']->type . ' creation page title')) {
// If the current user has the correct permissions, add node creation
// page title field setting fields to the form
$form['create_form_title'] = array(
'#type' => 'fieldset',
'#title' => t('Node creation page title'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
// Add create form title subsections for each language
foreach (language_list() as $lang => $details) {
$form['create_form_title'][$lang] = _csm_lang_fieldsets($lang, $form['#node_type']->type, 'title');
$form['create_form_title'][$lang]['#title'] = t($details->name);
if ($lang == $current_lang) {
$form['create_form_title'][$lang]['#collapsed'] = FALSE;
}
}
$form['create_form_title']['view']['token_help'] = $form['csm']['view']['token_help'] = array(
'#title' => t('Replacement patterns'),
'#type' => 'fieldset',
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form['create_form_title']['view']['token_help']['help'] = $form['csm']['view']['token_help']['help'] = array(
'#value' => theme('token_help', 'node'),
);
}
}
elseif ($form['#id'] == 'node-form' && $form['nid']['#value'] == NULL && empty($form_state['post'])) {
global $language;
$title = variable_get('csm_form_title_' . $language->language . '_' . $form['type']['#value'], '');
if ($title) {
drupal_set_title(check_plain(token_replace($title, 'node', $form['#node'])));
// Log a system message.
watchdog('csm', '@type: node creation page title changed using Custom Submit Messages.', array(
'@type' => $node->type,
), WATCHDOG_NOTICE);
}
}
return;
}
/**
* Implements hook_nodeapi().
*/
function csm_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
if ($op == 'insert' || $op == 'update' || $op == 'delete') {
$node->op = $op;
$messages = messages_alter_get_messages();
$messages
->add($node->nid, 'csm');
_csm_variable_set('csm_node_temp_' . $node->nid, $node);
}
elseif ($op == 'prepare' && !isset($node->nid)) {
// Adding a new node. Store the node in the variable table so that it can be retrieved
// by hook_form_alter and token substitutions can be done properly on the title of
// the page.
_csm_variable_set('csm_node_temp', $node);
}
return;
}
/**
* Implements hook_perm().
*/
function csm_perm() {
// for each node type, add an option to change submit messages for that node type and change node
// creation page title for that node type
$node_types = node_get_types();
foreach ($node_types as $key => $value) {
$perm[] = 'change ' . $key . ' submit messages';
$perm[] = 'change ' . $key . ' creation page title';
}
return $perm;
}
/**
* Implements hook_message_alter().
*/
function csm_message_alter(&$messages) {
// If $messages->messages['status'] doesn't exist then there are no status
// messages and there's nothing to do
if (!isset($messages->messages['status'])) {
return;
}
// Search for submit messages and change any that are found
// First create arrays containing messages that may need to be changed.
// Because the messages might not be in English, we need to load the node
// first. We can then build its create, update, and delete messages in t()
// and check the output against the message we are looking to change.
if (!isset($messages->messages['csm'][0])) {
return;
}
$nid = $messages->messages['csm'][0];
$node = variable_get('csm_node_temp_' . $nid, NULL);
$args = array(
'@type' => node_type_get_name($node),
'%title' => $node->title,
);
$created = $messages
->contains(t('@type %title has been created.', $args), 'status');
$updated = $messages
->contains(t('@type %title has been updated.', $args), 'status');
$deleted = $messages
->contains(t('@type %title has been deleted.', $args), 'status');
// Then parse through each array, double-checking for messages that need to be
// changed and then changing them.
// This code is no longer necessary because the matching technique (above) is
// tighter, but it is retained so that $relevant_messages is created and can
// be parsed later on. This could be rewritten so that $created, $updated, and
// $deleted are parsed directly.
$message_types_to_check = array(
'created',
'updated',
'deleted',
);
foreach ($message_types_to_check as $delta => $type) {
if (${$type} == FALSE) {
continue;
// There are no messages of type $$type so nothing to check
}
else {
// Double check the messages
foreach (${$type}['status'] as $delta_2 => $message_array) {
// Check that the message does not start with 'The content type <em>'
// If it doesn't then the message is relevant.
if (!strpos($message_array['message'], 'The content type <em>')) {
$relevant_messages[] = $message_array['index'];
}
}
}
}
if (!isset($relevant_messages)) {
// No relevant messages so nothing to change. There might be some stray data
// left if the variable table, though, and also some non-visible messages,
// so let's delete that.
if (array_key_exists('csm', $messages->messages)) {
$nid = $messages->messages['csm'][0];
$nid_message = $messages
->match("/" . $nid . "/", 'csm');
$messages
->remove($nid_message);
$messages
->clean();
variable_del('csm_node_temp_' . $nid);
}
return;
}
// Change the messages:
foreach ($relevant_messages as $delta => $index) {
$nid_message = $messages
->match("/" . $nid . "/", 'csm');
$messages
->remove($nid_message);
$messages
->clean();
variable_del('csm_node_temp_' . $nid);
// Check the active language then loads the msg based on that.
global $language;
// Change the status message to the custom status message.
$message = variable_get('csm_' . $node->op . '_msg_' . $language->language . '_' . $node->type, $messages->messages['status'][$delta]);
if ($message) {
if ($message == '<none>') {
// kill the message
unset($messages->messages['status'][$delta]);
$messages->remove_used = TRUE;
$messages
->clean();
}
else {
$message = $message == '<none>' ? '' : token_replace($message, 'node', $node);
$messages->messages['status'][$delta] = t($message);
}
}
unset($message);
// Log a system message.
watchdog('csm', '@type: node @msg_type message changed using Custom Submit Messages.', array(
'@type' => $node->type,
'@msg_type' => $node->op,
), WATCHDOG_NOTICE);
}
return;
}
/**
* Custom variable_set() function that ensures the correct $node is set in the
* variable table
*/
function _csm_variable_set($name, $value) {
if (module_exists('nodecomment')) {
if (variable_get($name, 'notset') !== 'notset') {
// The variable has already been set so there's not need to set it again
return;
}
}
variable_set($name, $value);
return;
}
/**
* Provide the form sub-section for a given language.
*/
function _csm_lang_fieldsets($lang = NULL, $form_type, $type = 'message') {
if ($lang == NULL) {
global $language;
$lang = $language->language;
}
$fields = array(
'#type' => 'fieldset',
'#title' => t($lang),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
switch ($type) {
case 'message':
$fields['csm_insert_msg_' . $lang] = array(
'#type' => 'textfield',
'#title' => t('Create message'),
'#default_value' => t(variable_get('csm_insert_msg_' . $lang . '_' . $form_type, '')),
'#description' => t('Override the default message displayed when a user creates a node of this type. Use <em><none></em> to display no message, or leave blank to use the default message.'),
'#size' => 60,
'#maxlength' => 4096,
'#required' => FALSE,
);
$fields['csm_update_msg_' . $lang] = array(
'#type' => 'textfield',
'#title' => t('Update message'),
'#default_value' => t(variable_get('csm_update_msg_' . $lang . '_' . $form_type, '')),
'#description' => t('Override the default message displayed when a user updates a node of this type. Use <em><none></em> to display no message, or leave blank to use the default message.'),
'#size' => 60,
'#maxlength' => 4096,
'#required' => FALSE,
);
$fields['csm_delete_msg_' . $lang] = array(
'#type' => 'textfield',
'#title' => t('Delete message'),
'#default_value' => t(variable_get('csm_delete_msg_' . $lang . '_' . $form_type, '')),
'#description' => t('Override the default message displayed when a user deletes a node of this type. Use <em><none></em> to display no message, or leave blank to use the default message.'),
'#size' => 60,
'#maxlength' => 4096,
'#required' => FALSE,
);
return $fields;
break;
case 'title':
$fields['csm_form_title_' . $lang] = array(
'#type' => 'textfield',
'#title' => t('Node create form title'),
'#default_value' => t(variable_get('csm_form_title_' . $lang . '_' . $form_type, '')),
'#description' => t('Override the default title for the node creation page. Use <em><none></em> to display no title, or leave blank to use the default block title.'),
'#size' => 60,
'#maxlength' => 4096,
'#required' => FALSE,
);
return $fields;
break;
}
}
/**
* Returns a list of all of the variables the module may have added to the
* variable table. Used in csm.install when uninstalling the module to clear
* the variables out of the variable table.
*/
function csm_variables() {
$crud = array(
'insert_msg',
'delete_msg',
'form_title',
'update_msg',
);
$node_types = node_get_types();
if (module_exists('locale')) {
$languages = locale_language_list();
}
else {
$languages = array(
'en' => 'en',
);
}
foreach ($crud as $crud_key => $crud_value) {
foreach ($node_types as $node_type_key => $node_type_value) {
foreach ($languages as $language_key => $language_value) {
$variables[] = 'csm_' . $crud_value . '_' . $language_key . '_' . $node_type_key;
}
}
}
if ($csm_node_temp = variable_get('csm_node_temp', FALSE)) {
$variables[] = 'csm_node_temp';
}
if ($result = db_query('SELECT name FROM {variable} WHERE name LIKE "%%%s%"', 'csm_node_temp_')) {
while ($array = db_fetch_array($result)) {
$variables[] = $array['name'];
}
}
return $variables;
}
Functions
Name![]() |
Description |
---|---|
csm_form_alter | Implements hook_form_alter(). |
csm_message_alter | Implements hook_message_alter(). |
csm_nodeapi | Implements hook_nodeapi(). |
csm_perm | Implements hook_perm(). |
csm_variables | Returns a list of all of the variables the module may have added to the variable table. Used in csm.install when uninstalling the module to clear the variables out of the variable table. |
_csm_lang_fieldsets | Provide the form sub-section for a given language. |
_csm_variable_set | Custom variable_set() function that ensures the correct $node is set in the variable table |