Newer
Older
<?php
// $Id$
/**
* @file
* Defines simple text field types.
*/
/**
* Implementation of hook_help().
*/
function text_help($section) {
switch ($section) {
case 'admin/modules#description':
Jonathan Chaffer
committed
return t('<strong>CCK:</strong> Defines simple text field types. <em>Note: Requires content.module.</em>');
}
}
/**
* Implementation of hook_field_info().
*/
function text_field_info() {
return array(
'text' => array('label' => 'Text'),
);
}
/**
* Implementation of hook_field_settings().
*/
function text_field_settings($op, $field) {
switch ($op) {
case 'form':
$form = array();
$options = array(0 => t('Plain text'), 1 => t('Filtered text (user selects input format)'));
$form['text_processing'] = array(
'#type' => 'radios',
'#title' => t('Text processing'),
'#default_value' => isset($field['text_processing']) ? $field['text_processing'] : 0,
'#options' => $options,
);
$form['max_length'] = array(
'#type' => 'textfield',
'#title' => t('Maximum length'),
'#default_value' => isset($field['max_length']) ? $field['max_length'] : '',
'#required' => FALSE,
'#description' => t('The maximum length of the field in characters. Leave blank for an unlimited size.'),
);
Jonathan Chaffer
committed
$form['allowed_values'] = array(
'#type' => 'textarea',
Karen Stevenson
committed
'#title' => t('Allowed values list'),
'#default_value' => isset($field['allowed_values']) ? $field['allowed_values'] : '',
Jonathan Chaffer
committed
'#required' => FALSE,
'#rows' => 10,
Karen Stevenson
committed
'#description' => t('The possible values this field can contain. Enter one value per line, in the format key|label. The key is the value that will be stored in the database and it must match the field storage type, %type. The label is optional and the key will be used as the label if no label is specified.', array('%type' => $field['type'])),
);
$form['advanced_options'] = array(
'#type' => 'fieldset',
'#title' => t('Php code'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form['advanced_options']['allowed_values_php'] = array(
'#type' => 'textarea',
'#title' => t('Code'),
'#default_value' => $field['allowed_values_php'],
'#rows' => 6,
'#description' => t('Advanced Usage Only: PHP code that returns a keyed array of allowed values. Should not include <?php ?> delimiters. If this field is filled out, the array returned by this code will override the allowed values list above.'),
Jonathan Chaffer
committed
);
Karen Stevenson
committed
return array('text_processing', 'max_length', 'allowed_values', 'allowed_values_php');
Jonathan Chaffer
committed
case 'database columns':
$columns = array(
'value' => array('type' => 'varchar', 'not null' => TRUE, 'default' => "''", 'sortable' => TRUE),
Jonathan Chaffer
committed
'format' => array('type' => 'int', 'length' => 10, 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
);
if ($field['max_length'] == 0 || $field['max_length'] > 255) {
$columns['value']['type'] = 'longtext';
}
else {
$columns['value']['length'] = $field['max_length'];
}
Jonathan Chaffer
committed
if ($field['text_processing'] == 0) {
unset($columns['format']);
}
return $columns;
Karen Stevenson
committed
$allowed_values = text_allowed_values($field);
if (count($allowed_values)) {
return array(
'default' => array(
'list' => $allowed_values,
'list-type' => 'list',
'operator' => 'views_handler_operator_or',
'value-type' => 'array',
),
);
}
Jonathan Chaffer
committed
else {
return array(
'like' => array(
'operator' => 'views_handler_operator_like',
'handler' => 'views_handler_filter_like',
),
);
}
break;
}
}
/**
* Implementation of hook_field().
*/
Jonathan Chaffer
committed
function text_field($op, &$node, $field, &$items, $teaser, $page) {
switch ($op) {
Jonathan Chaffer
committed
case 'validate':
Karen Stevenson
committed
$allowed_values = text_allowed_values($field);
Jonathan Chaffer
committed
Jonathan Chaffer
committed
if (is_array($items)) {
foreach ($items as $delta => $item) {
Yves Chedemois
committed
$error_field = $field['field_name'].']['.$delta.'][value';
Jonathan Chaffer
committed
if ($item['value'] != '') {
Karen Stevenson
committed
if (count($allowed_values) && !array_key_exists($item['value'], $allowed_values)) {
Yves Chedemois
committed
form_set_error($error_field, t('Illegal value for %name.', array('%name' => t($field['widget']['label']))));
Jonathan Chaffer
committed
}
}
}
}
Karen Stevenson
committed
if ($field['max_length'] > 0) {
foreach ($items as $delta => $data) {
$error_field = $field['field_name'].']['.$delta.'][value';
if (strlen($data['value']) > $field['max_length']) {
form_set_error($error_field, t('%label is longer than %max characters.', array('%label' => $field['widget']['label'], '%max' => $field['max_length'])));
}
}
}
Jonathan Chaffer
committed
break;
/**
* Implementation of hook_field_formatter_info().
Jonathan Chaffer
committed
*/
function text_field_formatter_info() {
return array(
'default' => array(
'label' => 'Default',
'field types' => array('text'),
),
'plain' => array(
'label' => 'Plain text',
'field types' => array('text'),
),
'trimmed' => array(
'label' => 'Trimmed',
'field types' => array('text'),
),
);
}
/**
* Implementation of hook_field_formatter().
Jonathan Chaffer
committed
* The $node argument is necessary so that filter access can be checked on
* node preview.
*/
Jonathan Chaffer
committed
function text_field_formatter($field, $item, $formatter, $node) {
if (!isset($item['value'])) {
return '';
}
Karen Stevenson
committed
if ($allowed_values = text_allowed_values($field)) {
return $allowed_values[$item['value']];
}
if ($field['text_processing']) {
Jonathan Chaffer
committed
$text = check_markup($item['value'], $item['format'], is_null($node) || isset($node->in_preview));
}
else {
Jonathan Chaffer
committed
$text = check_plain($item['value']);
}
Yves Chedemois
committed
Jonathan Chaffer
committed
switch ($formatter) {
case 'plain':
return strip_tags($text);
Yves Chedemois
committed
Jonathan Chaffer
committed
case 'trimmed':
return node_teaser($text, $field['text_processing'] ? $item['format'] : NULL);
Yves Chedemois
committed
Jonathan Chaffer
committed
default:
return $text;
}
}
Jonathan Chaffer
committed
/**
* Implementation of hook_widget_info().
*/
function text_widget_info() {
return array(
'text' => array(
'label' => 'Text Field',
'field types' => array('text'),
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
),
);
}
/**
* Implementation of hook_widget_settings().
*/
function text_widget_settings($op, $widget) {
switch ($op) {
case 'form':
$form = array();
$form['rows'] = array(
'#type' => 'textfield',
'#title' => t('Rows'),
'#default_value' => $widget['rows'] ? $widget['rows'] : 1,
'#required' => TRUE,
);
return $form;
case 'validate':
if (!is_numeric($widget['rows']) || intval($widget['rows']) != $widget['rows'] || $widget['rows'] <= 0) {
form_set_error('rows', t('"Rows" must be a positive integer.'));
}
break;
case 'save':
return array('rows');
}
}
/**
* Implementation of hook_widget().
*/
Jonathan Chaffer
committed
function text_widget($op, &$node, $field, &$items) {
switch ($op) {
case 'form':
$form = array();
$form[$field['field_name']] = array('#tree' => TRUE);
if ($field['multiple']) {
$form[$field['field_name']]['#type'] = 'fieldset';
Karen Stevenson
committed
$form[$field['field_name']]['#description'] = $field['widget']['description'];
Jonathan Chaffer
committed
foreach ($items as $data) {
if ($data['value']) {
if ($field['widget']['rows'] == 1) {
$form[$field['field_name']][$delta]['value'] = array(
'#type' => 'textfield',
'#title' => ($delta == 0) ? t($field['widget']['label']) : '',
'#default_value' => $data['value'],
'#required' => ($delta == 0) ? $field['required'] : FALSE,
'#maxlength' => $field['max_length'] ? $field['max_length'] : '',
'#weight' => $field['widget']['weight'],
);
}
else {
$form[$field['field_name']][$delta]['value'] = array(
'#type' => 'textarea',
'#title' => ($delta == 0) ? t($field['widget']['label']) : '',
'#default_value' => $data['value'],
'#required' => ($delta == 0) ? $field['required'] : FALSE,
'#rows' => $field['widget']['rows'],
'#weight' => $field['widget']['weight'],
);
}
if ($field['text_processing']) {
$form[$field['field_name']][$delta]['format'] = filter_form($data['format'], $form[$field['field_name']][$delta]['value']['#weight'] + 1, array($field['field_name'], $delta, 'format'));
}
$delta++;
}
}
foreach (range($delta, $delta + 2) as $delta) {
$form[$field['field_name']][$delta]['value'] = array(
'#type' => 'textfield',
'#title' => ($delta == 0) ? t($field['widget']['label']) : '',
'#default_value' => '',
'#required' => ($delta == 0) ? $field['required'] : FALSE,
'#maxlength' => $field['max_length'] ? $field['max_length'] : '',
'#weight' => $field['widget']['weight'],
);
}
else {
$form[$field['field_name']][$delta]['value'] = array(
'#type' => 'textarea',
'#title' => ($delta == 0) ? t($field['widget']['label']) : '',
'#default_value' => '',
'#required' => ($delta == 0) ? $field['required'] : FALSE,
'#rows' => $field['widget']['rows'],
'#weight' => $field['widget']['weight'],
);
}
if ($field['text_processing']) {
Jonathan Chaffer
committed
$form[$field['field_name']][$delta]['format'] = filter_form($items[$delta]['format'], $form[$field['field_name']][$delta]['value']['#weight'] + 1, array($field['field_name'], $delta, 'format'));
}
}
}
else {
Jonathan Chaffer
committed
$form[$field['field_name']][0]['value'] = array(
'#type' => 'textfield',
'#title' => t($field['widget']['label']),
Jonathan Chaffer
committed
'#default_value' => isset($items[0]['value']) ? $items[0]['value'] : '',
'#required' => $field['required'],
'#description' => $field['widget']['description'],
'#maxlength' => $field['max_length'] ? $field['max_length'] : '',
'#weight' => $field['widget']['weight'],
);
}
else {
Jonathan Chaffer
committed
$form[$field['field_name']][0]['value'] = array(
'#type' => 'textarea',
'#title' => t($field['widget']['label']),
Jonathan Chaffer
committed
'#default_value' => $items[0]['value'],
'#required' => $field['required'],
'#rows' => $field['widget']['rows'],
'#description' => $field['widget']['description'],
'#weight' => $field['widget']['weight'],
);
}
if ($field['text_processing']) {
Jonathan Chaffer
committed
$form[$field['field_name']][0]['format'] = filter_form($items[0]['format'], $form[$field['field_name']][0]['value']['#weight'] + 1, array($field['field_name'], 0, 'format'));
}
}
return $form;
case 'process form values':
Yves Chedemois
committed
// Don't save empty fields except the first value
foreach ($items as $delta => $item) {
if ($item['value'] == '' && $delta > 0) {
unset($items[$delta]);
}
}
break;
}
}
Karen Stevenson
committed
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
/**
* Create an array of the allowed values for this field
*/
function text_allowed_values($field) {
static $allowed_values;
if ($allowed_values[$field['field_name']]) {
return $allowed_values[$field['field_name']];
}
$allowed_values[$field['field_name']] = array();
if ($field['allowed_values_php']) {
ob_start();
$result = eval($field['allowed_values_php']);
if (is_array($result)) {
$allowed_values[$field['field_name']] = $result;
}
ob_end_clean();
}
if (!$allowed_values[$field['field_name']]) {
$list = explode("\n", $field['allowed_values']);
$list = array_map('trim', $list);
$list = array_filter($list, 'strlen');
foreach ($list as $opt) {
list($key, $value) = explode('|', $opt);
Karen Stevenson
committed
$allowed_values[$field['field_name']][$key] = $value ? $value : $key;
}
}
return $allowed_values[$field['field_name']];
}