maxlength.module in Maxlength 7
Same filename and directory in other branches
Enables a max length countdown on node body, title and CCK textfields.
File
maxlength.moduleView source
<?php
/**
* @file
* Enables a max length countdown on node body, title and CCK textfields.
*/
/**
* Implementation of hook_help().
*/
function maxlength_help($path, $arg) {
switch ($path) {
case 'admin/help#maxlength':
case 'admin/modules#description':
return t('Sets a maximum length for body fields and shows a counter that is updated as you type.');
break;
}
}
/**
* Implementation of hook_form_alter().
*/
function maxlength_form_alter(&$form, &$form_state, $form_id) {
// Editing the content
if (strpos($form['#id'], 'node-form') !== FALSE) {
module_load_include('inc', 'maxlength', 'maxlength');
_maxlength_content_form_alter($form, $form_state, $form_id);
}
elseif ($form_id == 'node_type_form' && isset($form['submission'])) {
module_load_include('inc', 'maxlength', 'maxlength');
_maxlength_content_type_form_alter($form, $form_state, $form_id);
}
elseif ($form_id == 'field_ui_field_edit_form' && isset($form['field']['settings'])) {
if ($form['#field']['type'] == 'text' || $form['#field']['type'] == 'text_long' || $form['#field']['type'] == 'text_with_summary') {
if (($form['#field']['type'] == 'text_long' || $form['#field']['type'] == 'text_with_summary') && empty($form['field']['settings']['max_length'])) {
$field_key = $form['instance']['field_name']['#value'];
if (!(strpos($field_key, 'field_') === 0)) {
$type = isset($form['instance']['bundle']['#value']) ? $form['instance']['bundle']['#value'] : '';
if ($type != '') {
$field_key .= '_' . $type;
}
}
$form['field']['settings']['max_length'] = array(
'#type' => 'textfield',
'#title' => t('Maximum length'),
'#default_value' => variable_get('maxlength_' . $field_key, ''),
'#required' => FALSE,
'#element_validate' => array(
'_element_validate_integer_positive',
),
'#description' => t('The maximum length of the field in characters. Leave blank for an unlimited size.'),
);
}
module_load_include('inc', 'maxlength', 'maxlength');
_maxlength_cck_form_alter($form, $form_state, $form_id);
}
}
elseif ($form_id == '_content_admin_field_remove') {
variable_del('maxlength_' . $form['field_name']['#value']);
variable_del('maxlength_' . $form['field_name']['#value'] . '_js');
variable_del('maxlength_' . $form['field_name']['#value'] . '_text');
}
}
/**
* Implementation of hook_node_validate().
*/
function maxlength_node_validate($node, $form, &$form_state) {
// Core fields, CCK takes care of CCK fields, no need to validate them
$fields = array(
'title',
);
foreach ($fields as $field) {
$limit = intval(variable_get('maxlength_' . $field . '_' . $node->type, ''));
if ($limit > 0) {
//$form = $a3;
// line breaks can be stored 2 or more chars, breaking the count.
$text = $node->{$field};
$text = str_replace("\r\n", '#', $text);
$text = str_replace("\n", '#', $text);
$text = str_replace("\r", '#', $text);
if (drupal_strlen($text) > $limit) {
form_set_error($field, t('The @field field has exceeded its maximum number of characters (@limit).', array(
'@limit' => $limit,
'@field' => $field,
)));
}
}
}
}
/**
* Implements hook_node_type_update().
*/
function maxlength_node_type_delete($info) {
$labels = _maxlength_node_type_get_labels();
foreach ($labels as $label) {
variable_del('maxlength_' . $label . $info->type);
}
}
/**
* Implements hook_node_type_update().
*/
function maxlength_node_type_update($info) {
$labels = _maxlength_node_type_get_labels();
if (!empty($info->old_type) && $info->old_type != $info->type) {
foreach ($labels as $label) {
$old_var = variable_get('maxlength_' . $label . $info->old_type, '');
variable_set('maxlength_' . $label . $info->type, $old_var);
variable_del('maxlength_' . $label . $info->old_type);
}
}
}
function _maxlength_node_type_get_labels() {
$labels = array(
'title',
'js_title',
'text_title',
'body',
'js_body',
'text_body',
);
return $labels;
}
/**
* Formats a form element to use maxlength value and use js.
* It's not moved to maxlength.inc because Form API calls it even when form_alter is not called
*
* @arg array $element
* The form element which should be maxlengthed.
* @return
* Maxlength-enabled form element
*
*/
function _maxlength_format_element($element) {
static $processed = array();
module_load_include('inc', 'maxlength', 'maxlength');
$value = $element['#max_length_properties'][0];
$field = $element['#max_length_properties'][1];
$id = $element['#max_length_properties'][2];
$type = $element['#max_length_properties'][3];
if (in_array('edit-' . $id, $processed)) {
return $element;
}
$values = _maxlength_get_values($field, $type);
if ($values !== FALSE && isset($values['limit']) && $values['limit'] && $values['use_js']) {
$path = drupal_get_path('module', 'maxlength');
drupal_add_js($path . '/maxlength.js');
$remaining = $values['limit'] - drupal_strlen($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['#default_value'] = drupal_substr($element['#default_value'], 0, $values['limit']);
$remaining = 0;
}
if (in_array($element['#id'], $processed) === FALSE) {
$js_settings = array(
'maxlength' => array(
'edit-' . $id => $values['limit'],
),
);
drupal_add_js($js_settings, 'setting');
}
$element['#suffix'] = '<div id="maxlength-' . $id . '"
class="maxlength-counter">' . t($values['text'], array(
'!limit' => $values['limit'],
'!count' => '<span class="maxlength-count">' . drupal_strlen($value) . '</span>',
'!remaining' => '<span class="maxlength-counter-remaining">' . $remaining . '</span>',
)) . '</div>';
$processed[] = $element['#id'];
}
return $element;
}
Functions
Name | Description |
---|---|
maxlength_form_alter | Implementation of hook_form_alter(). |
maxlength_help | Implementation of hook_help(). |
maxlength_node_type_delete | Implements hook_node_type_update(). |
maxlength_node_type_update | Implements hook_node_type_update(). |
maxlength_node_validate | Implementation of hook_node_validate(). |
_maxlength_format_element | Formats a form element to use maxlength value and use js. It's not moved to maxlength.inc because Form API calls it even when form_alter is not called |
_maxlength_node_type_get_labels |