Index: maxlength.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/maxlength/maxlength.module,v
retrieving revision 1.11.4.8
diff -U65535 -r1.11.4.8 maxlength.module
--- maxlength.module 28 Sep 2008 20:36:17 -0000 1.11.4.8
+++ maxlength.module 28 Sep 2008 22:24:29 -0000
@@ -1,302 +1,302 @@
'admin/settings/maxlength',
'title' => t('Maxlength'),
'description' => t('Set maximum length for body fields.'),
'callback' => 'drupal_get_form',
'callback arguments' => '_maxlength_admin_settings',
'access' => user_access(ADMINISTER_MAXLENGTH),
'type' => MENU_NORMAL_ITEM,
);
}
return $items;
}
function _maxlength_admin_settings() {
$form = array();
$form['contact_information'] = array(
'#value' => t('This page is now deprecated, check the edit page of the relevant content type to edit its settings'),
);
return system_settings_form($form);
}
/**
* Implementation of hook_elements().
*/
function maxlength_elements() {
$type = array();
if (_maxlength_get_values('body') !== FALSE) {
$type['textarea'] = array(
'#theme' => 'maxlength_textarea',
);
}
if (_maxlength_get_values('title') !== FALSE) {
$type['textfield'] = array(
'#theme' => 'maxlength_textfield',
);
}
return $type;
}
function _maxlength_get_values($field = 'body', $limit = FALSE) {
$type = '';
$values = '';
$values['limit'] = FALSE;
if (arg(0) == 'node') {
if (arg(1) == 'add') {
$type = str_replace('-', '_', arg(2));
}
if (arg(2) == 'edit') {
$type = _maxlength_node_type_from_id(arg(1));
}
}
//CCK
if (strpos($field, 'field_') === 0) {
$values['limit'] = $limit;
$values['use_js'] = variable_get(MAXLENGTH_NODE_TYPE . $field .'_js', FALSE);
$values['text'] = variable_get(MAXLENGTH_NODE_TYPE . $field .'_text', FALSE);
} //body and title
else if ($type != '') {
$values['limit'] = variable_get(MAXLENGTH_NODE_TYPE . $field .'_'. $type, FALSE);
$values['use_js'] = variable_get(MAXLENGTH_NODE_TYPE . $field .'_js_'. $type, FALSE);
$values['text'] = variable_get(MAXLENGTH_NODE_TYPE . $field .'_text_'. $type, FALSE);
}
if ($values['limit']) {
return $values;
}
else {
return FALSE;
}
}
function theme_maxlength_textarea($element) {
$prefix = _maxlength_theme_input($element);
return theme_textarea($element) . $prefix;
}
function theme_maxlength_textfield($element) {
$prefix = _maxlength_theme_input($element);
- return theme_textfield($element) . $prefix;
+ return theme('textfield', $element) . $prefix;
}
function _maxlength_theme_input(&$element) {
$prefix = '';
$values = _maxlength_get_values($element['#parents'][0], $element['#maxlength']);
if ($values !== FALSE AND isset($values['limit']) AND $values['limit'] AND $values['use_js']) {
$path = drupal_get_path('module', 'maxlength');
drupal_add_js($path .'/maxlength.js');
$remaining = $values['limit'] - drupal_strlen($element['#value']);
if ($remaining < 0) {
drupal_set_message(
t('%body_field_label truncated to %limit characters!',
array(
'%body_field_label' => $element['#title'],
'%limit' => $values['limit'])
),
'error'
);
$element['#value'] = drupal_substr($element['#value'], 0, $values['limit']);
$remaining = 0;
}
$js_settings = array(
'maxlength' => array(
$element['#id'] => $values['limit'],
),
);
drupal_add_js($js_settings, 'setting');
$prefix = '
'. t($values['text'], array('!limit' => $values['limit'], '!remaining' => ''. $remaining .'')) .'
';
}
return $prefix;
}
function _maxlength_node_type_from_id($nid) {
$node = node_load($nid);
return $node->type;
}
/**
* Implementation of hook_form_alter().
*/
function maxlength_form_alter($form_id, &$form) {
//Body and Title form alter
if ($form_id == 'node_type_form' && isset($form['identity']['type'])) {
$type = $form['#node_type']->type;
$labels = array('-3' => 'title', '-1 ' => 'body');
foreach ($labels as $weigh => $label) {
// bit of a hack to allow us to position the input fields correctly
$form['submission'][$label .'_label']['#weight'] = $weight - 1;
$form['submission'][MAXLENGTH_NODE_TYPE . $label] = array(
'#type' => 'fieldset',
'#weight' => $weight,
'#title' => t('Limit !type length', array('!type ' => $label)),
'#collapsible' => TRUE,
'#collapsed' => strlen(variable_get($type .'_'. $label, '')) == 0,
);
$form['submission'][MAXLENGTH_NODE_TYPE . $label][MAXLENGTH_NODE_TYPE . $label] = array(
'#type' => 'textfield',
'#title' => t('!label max length', array('!label' => ucwords($label))),
'#field_suffix' => t('characters'),
'#return_value' => 1,
'#size' => 4,
'#default_value' => variable_get(MAXLENGTH_NODE_TYPE . $label .'_'. $type, ''),
'#description' => t('Maximum number of characters allowed for the !type field of this content type. Leave blank for an unlimited size.', array('!type' => $label)) .'
'.
''. t('Please remember, it counts all characters, including HTML, so may not work as expected with rich text editors e.g. FCKeditor / tinyMCE.') .'',
);
$form['submission'][MAXLENGTH_NODE_TYPE . $label][MAXLENGTH_NODE_TYPE . $label .'_js'] = array(
'#type' => 'checkbox',
'#title' => t('Enable remaining characters countdown for the !label', array('!label' => ucwords($label))),
'#default_value' => variable_get(MAXLENGTH_NODE_TYPE . $label .'_js_'. $type, '0'),
'#description' => t('This will enable a java script based count down from the maximum number of characters to 0 for the !type field of this content type. If no limit set this is ignored.', array('!type' => $label)),
);
$form['submission'][MAXLENGTH_NODE_TYPE . $label][MAXLENGTH_NODE_TYPE . $label .'_text'] = array(
'#type' => 'textarea',
'#title' => t('!label count down message', array('!label' => ucwords($label))),
'#default_value' => variable_get(MAXLENGTH_NODE_TYPE . $label .'_text_'. $type, 'Content limited to !limit characters, remaining: !remaining'),
'#description' => t('The text used in the java script message under the !type input, where "!limit" and "!remaining" are replaced by the appropriate numbers', array('!type' => $label)),
);
}
}
//CCK text field form alter on edit.
if ($form_id == '_content_admin_field' AND isset($form['field']['max_length'])) {
//if form is being loaded, add extra config fields
if (empty($form['#post'])) {
$new_fields = array();
foreach ($form['field'] as $key => $field) {
$new_fields[$key] = $field;
if ($key == 'max_length') {
$new_fields[MAXLENGTH_NODE_TYPE . $form['field_name']['#value'] .'_js'] = array(
'#type' => 'checkbox',
'#title' => t('Enable remaining characters countdown for this field'),
'#default_value' => variable_get(MAXLENGTH_NODE_TYPE . $form['field_name']['#value'] .'_js', '0'),
'#description' => t('This will enable a java script based count down from the maximum number of characters to 0 for this field. If no limit set this is ignored.'),
);
$new_fields[MAXLENGTH_NODE_TYPE . $form['field_name']['#value'] .'_text'] = array(
'#type' => 'textarea',
'#title' => t('Count down message'),
'#default_value' => variable_get(MAXLENGTH_NODE_TYPE . $form['field_name']['#value'] .'_text', 'Content limited to !limit characters, remaining: !remaining'),
'#description' => t('The text used in the java script message under the input, where "!limit" and "!remaining" are replaced by the appropriate numbers'),
);
}
}
$form['field'] = $new_fields;
} //otherwise its being submitted, so save the data.
else {
variable_set(MAXLENGTH_NODE_TYPE . $form['field_name']['#value'] .'_js', $form['#post'][MAXLENGTH_NODE_TYPE . $form['field_name']['#value'] .'_js']);
variable_set(MAXLENGTH_NODE_TYPE . $form['field_name']['#value'] .'_text', $form['#post'][MAXLENGTH_NODE_TYPE . $form['field_name']['#value'] .'_text']);
}
}
//CCK text field form alter on delete.
if ($form_id == '_content_admin_field_remove') {
variable_del(MAXLENGTH_NODE_TYPE . $form['field_name']['#value'] .'_js');
variable_del(MAXLENGTH_NODE_TYPE . $form['field_name']['#value'] .'_text');
}
}
/**
* Implementation of hook_nodeapi().
*/
function maxlength_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
$fields = array('title', 'body');
foreach ($fields as $field) {
$limit = intval(variable_get(MAXLENGTH_NODE_TYPE . $field .'_'. $node->type, ''));
if ($limit > 0) {
switch ($op) {
case 'validate':
$form = $a3;
if (drupal_strlen($node->$field) > $limit) {
form_set_error($field, t('The !field field has exceeded its maximum number of characters (!limit).', array('!limit' => $limit, '!field' => $field)));
}
break;
}
}
}
}
/**
* Implementation of hook_node_type().
*/
function maxlength_node_type($op, $info) {
$labels = array('title', 'js_title', 'text_title',
'body', 'js_body', 'text_body');
switch ($op) {
case 'delete':
foreach ($labels as $label) {
variable_del(MAXLENGTH_NODE_TYPE . $label . $info->type);
}
break;
case 'update':
if (!empty($info->old_type) && $info->old_type != $info->type) {
foreach ($labels as $label) {
$old_var = variable_get(MAXLENGTH_NODE_TYPE . $label . $info->old_type, '');
variable_set(MAXLENGTH_NODE_TYPE . $label . $info->type, $old_var);
variable_del(MAXLENGTH_NODE_TYPE . $label . $info->old_type);
}
}
break;
}
}