Newer
Older
<?php
// $Id$
/**
* @file
* Defines simple text field types.
*/
/**
* Implementation of hook_field_info().
*/
function text_field_info() {
return array(
Yves Chedemois
committed
'text' => array('label' => t('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'),
Karen Stevenson
committed
'#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;
Yves Chedemois
committed
case 'arguments':
$arguments = content_views_field_arguments($field);
$alias = "content: $field[field_name]";
$argument = array(
'handler' => 'text_views_argument_handler',
'option' => 'string',
'help' => t('Set the option to the number of initial characters to filter by. Leave empty for full term; use 1 for an A/B/C style glossary.'),
);
$arguments[$alias] = array_merge($arguments[$alias], $argument);
return $arguments;
Karen Stevenson
committed
$allowed_values = text_allowed_values($field);
if (count($allowed_values)) {
return array(
'default' => array(
'list' => $allowed_values,
'list-type' => 'list',
Yves Chedemois
committed
'operator' => 'views_handler_operator_andor',
Karen Stevenson
committed
'value-type' => 'array',
),
);
}
else {
return array(
'like' => array(
'operator' => 'views_handler_operator_like',
'handler' => 'views_handler_filter_like',
),
);
}
break;
Yves Chedemois
committed
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
function text_views_argument_handler($op, &$query, $argtype, $arg = '') {
$name = explode(':', is_array($argtype) ? $argtype['type'] : $argtype);
$field_name = trim($name[1]);
$field = content_fields($field_name);
$db_info = content_database_info($field);
$value = $db_info['columns']['value']['column'];
$table = 'node_data_'. $field['field_name'];
switch($op) {
case 'summary':
$query->ensure_table($table);
$query->add_field($value, $table);
$length = intval($arg);
$fieldinfo['field'] = $length <= 0 ? "$table.$value" : "LEFT($table.$value, $length)";
$fieldinfo['fieldname'] = 'letter';
return $fieldinfo;
case 'sort':
break;
case 'filter':
$query->ensure_table($table);
$query->add_field($value, $table);
$length = intval($argtype['options']);
$where = $length <= 0 ? "$table.$value = '%s'" : "LEFT($table.$value, $length) = '%s'";
$query->add_where($where, $arg);
break;
case 'link':
return l(strtoupper($query->letter), "$arg/$query->letter");
case 'title':
return check_plain(strtoupper($query));
}
}
/**
* Implementation of hook_field().
*/
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
if (is_array($items)) {
foreach ($items as $delta => $item) {
$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';
Karen Stevenson
committed
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().
*/
function text_field_formatter_info() {
return array(
'default' => array(
Yves Chedemois
committed
'label' => t('Default'),
'field types' => array('text'),
),
'plain' => array(
Yves Chedemois
committed
'label' => t('Plain text'),
'field types' => array('text'),
),
'trimmed' => array(
Yves Chedemois
committed
'label' => t('Trimmed'),
'field types' => array('text'),
),
);
}
/**
* Implementation of hook_field_formatter().
* The $node argument is necessary so that filter access can be checked on
* node preview.
*/
function text_field_formatter($field, $item, $formatter, $node) {
if (!isset($item['value'])) {
return '';
}
Yves Chedemois
committed
Karen Stevenson
committed
if ($allowed_values = text_allowed_values($field)) {
return $allowed_values[$item['value']];
}
Yves Chedemois
committed
switch ($formatter) {
case 'plain':
$text = strip_tags($item['value']);
break;
Yves Chedemois
committed
case 'trimmed':
$text = node_teaser($item['value'], $field['text_processing'] ? $item['format'] : NULL);
break;
case 'default':
$text = $item['value'];
}
Yves Chedemois
committed
if ($field['text_processing']) {
return check_markup($text, $item['format'], is_null($node) || isset($node->in_preview));
}
else {
return check_plain($text);
}
}
/**
* Implementation of hook_widget_info().
*/
function text_widget_info() {
return array(
'text' => array(
Yves Chedemois
committed
'label' => t('Text Field'),
'field types' => array('text'),
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
),
);
}
/**
* 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().
*/
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';
$form[$field['field_name']]['#description'] = t($field['widget']['description']);
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,
Yves Chedemois
committed
'#maxlength' => $field['max_length'] ? $field['max_length'] : NULL,
'#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,
Yves Chedemois
committed
'#maxlength' => $field['max_length'] ? $field['max_length'] : NULL,
'#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']) {
$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']),
'#default_value' => isset($items[0]['value']) ? $items[0]['value'] : '',
'#required' => $field['required'],
'#description' => t($field['widget']['description']),
'#maxlength' => $field['max_length'] ? $field['max_length'] : NULL,
'#weight' => $field['widget']['weight'],
);
}
else {
Jonathan Chaffer
committed
$form[$field['field_name']][0]['value'] = array(
'#type' => 'textarea',
'#title' => t($field['widget']['label']),
'#default_value' => $items[0]['value'],
'#required' => $field['required'],
'#rows' => $field['widget']['rows'],
'#description' => t($field['widget']['description']),
'#weight' => $field['widget']['weight'],
);
}
if ($field['text_processing']) {
$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
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
/**
* 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']];
}