array('label' => t('Integer')), 'number_decimal' => array('label' => t('Decimal')), ); } /** * Implementation of hook_field_settings(). */ function number_field_settings($op, $field) { switch ($op) { case 'form': $form = array(); foreach (number_field_formatter_info() as $format => $opt) { if (in_array($field['type'], $opt['field types'])) { $options[$format] = $opt['label']; } } $form['min'] = array( '#type' => 'textfield', '#title' => t('Minimum'), '#default_value' => isset($field['min']) ? $field['min'] : '', ); $form['max'] = array( '#type' => 'textfield', '#title' => t('Maximum'), '#default_value' => isset($field['max']) ? $field['max'] : '', ); $form['append']['prefix'] = array( '#type' => 'textfield', '#title' => t('Prefix'), '#size' => 60, '#default_value' => isset($field['prefix']) ? $field['prefix'] : '', '#description' => t('Define a string that should be prefixed to the value, like $ or €. Leave blank for none. Separate singular and plural values with a pipe (pound|pounds).'), ); $form['append']['suffix'] = array( '#type' => 'textfield', '#title' => t('Suffix'), '#size' => 60, '#default_value' => isset($field['suffix']) ? $field['suffix'] : '', '#description' => t('Define a string that should suffixed to the value, like m², m/s², kb/s. Leave blank for none. Separate singular and plural values with a pipe (pound|pounds). '), ); $form['allowed_values'] = array( '#type' => 'textarea', '#title' => t('Allowed values list'), '#default_value' => isset($field['allowed_values']) ? $field['allowed_values'] : '', '#required' => FALSE, '#rows' => 10, '#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.
Allowed HTML tags: @tags', array('%type' => $field['type'], '@tags' => _content_filter_xss_display_allowed_tags())), ); $form['advanced_options'] = array( '#type' => 'fieldset', '#title' => t('PHP code'), '#collapsible' => TRUE, '#collapsed' => empty($field['allowed_values_php']), ); if (user_access('Use PHP input for field settings (dangerous - grant with care)')) { $form['advanced_options']['allowed_values_php'] = array( '#type' => 'textarea', '#title' => t('Code'), '#default_value' => !empty($field['allowed_values_php']) ? $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.'), ); } else { $form['advanced_options']['markup_allowed_values_php'] = array( '#type' => 'item', '#title' => t('Code'), '#value' => !empty($field['allowed_values_php']) ? ''. check_plain($field['allowed_values_php']) .'' : t('<none>'), '#description' => empty($field['allowed_values_php']) ? t("You're not allowed to input PHP code.") : t('This PHP code was set by an administrator and will override the allowed values list above.'), ); } return $form; case 'validate': if ($field['min'] && !is_numeric($field['min'])) { form_set_error('min', t('"Minimum" must be a number.')); } if ($field['max'] && !is_numeric($field['max'])) { form_set_error('max', t('"Maximum" must be a number.')); } break; case 'save': return array('prefix', 'suffix', 'append_position', 'min', 'max', 'allowed_values', 'allowed_values_php'); case 'database columns': if ($field['type'] == 'number_integer') { return array( 'value' => array('type' => 'int', 'not null' => FALSE, 'default' => NULL, 'sortable' => TRUE), ); } if ($field['type'] == 'number_decimal') { return array( 'value' => array('type' => 'float', 'not null' => FALSE, 'default' => NULL, 'sortable' => TRUE), ); } case 'filters': $allowed_values = number_allowed_values($field); if (count($allowed_values)) { return array( 'default' => array( 'list' => $allowed_values, 'list-type' => 'list', 'operator' => 'views_handler_operator_andor', 'value-type' => 'array', ), ); } else { return array( 'default' => array( 'operator' => 'views_handler_operator_gtlt', ), ); } break; } } /** * Implementation of hook_field(). */ function number_field($op, &$node, $field, &$items, $teaser, $page) { switch ($op) { case 'validate': $allowed_values = number_allowed_values($field); if (is_array($items)) { foreach ($items as $delta => $item) { $error_field = $field['field_name'] .']['. $delta .'][value'; if ($item['value'] != '') { if (is_numeric($field['min']) && $item['value'] < $field['min']) { form_set_error($error_field, t('The value of %name may be no smaller than %min.', array('%name' => t($field['widget']['label']), '%min' => $field['min']))); } if (is_numeric($field['max']) && $item['value'] > $field['max']) { form_set_error($error_field, t('The value of %name may be no larger than %max.', array('%name' => t($field['widget']['label']), '%max' => $field['max']))); } if (count($allowed_values) && !array_key_exists($item['value'], $allowed_values)) { form_set_error($error_field, t('Illegal value for %name.', array('%name' => t($field['widget']['label'])))); } } } } break; } } /** * Implementation of hook_field_formatter_info(). */ function number_field_formatter_info() { return array( 'default' => array('label' => '9999', 'field types' => array('number_integer', 'number_decimal')), 'us_0' => array('label' => '9,999', 'field types' => array('number_integer', 'number_decimal')), 'us_1' => array('label' => '9,999.9', 'field types' => array('number_decimal')), 'us_2' => array('label' => '9,999.99', 'field types' => array('number_decimal')), 'be_0' => array('label' => '9.999', 'field types' => array('number_integer', 'number_decimal')), 'be_1' => array('label' => '9.999,9', 'field types' => array('number_decimal')), 'be_2' => array('label' => '9.999,99', 'field types' => array('number_decimal')), 'fr_0' => array('label' => '9 999', 'field types' => array('number_integer', 'number_decimal')), 'fr_1' => array('label' => '9 999, 9', 'field types' => array('number_decimal')), 'fr_2' => array('label' => '9 999, 99', 'field types' => array('number_decimal')), 'unformatted' => array('label' => t('unformatted'), 'field types' => array('number_integer', 'number_decimal')), ); } /** * Implementation of hook_field_formatter(). */ function number_field_formatter($field, $item, $formatter, $node) { // If the value is empty, we have $item['value'] = NULL if (is_null($item['value'])) { return ''; } $item['value'] = check_plain($item['value']); if ($formatter == 'unformatted') { return $item['value']; } if ($allowed_values = number_allowed_values($field)) { if ($allowed_values[$item['value']] != $item['value']) { return $allowed_values[$item['value']]; } } switch ($formatter) { case 'us_0': $value = number_format($item['value'], 0, '.', ','); break; case 'us_1': $value = number_format($item['value'], 1, '.', ','); break; case 'us_2': $value = number_format($item['value'], 2, '.', ','); break; case 'be_0': $value = number_format($item['value'], 0, ',', '.'); break; case 'be_1': $value = number_format($item['value'], 1, ',', '.'); break; case 'be_2': $value = number_format($item['value'], 2, ',', '.'); break; case 'fr_0': $value = number_format($item['value'], 0, ', ', ' '); break; case 'fr_1': $value = number_format($item['value'], 1, ', ', ' '); break; case 'fr_2': $value = number_format($item['value'], 2, ', ', ' '); break; default: $value = ($item['value']); break; } $prefixes = explode('|', check_plain($field['prefix'])); $suffixes = explode('|', check_plain($field['suffix'])); if ($prefixes) { if (sizeof($prefixes) > 1) { $prefix = format_plural($item['value'], $prefixes[0], $prefixes[1]); } else { $prefix = $field['prefix']; } } if ($suffixes) { if (sizeof($suffixes) > 1) { $suffix = format_plural($item['value'], $suffixes[0], $suffixes[1]); } else { $suffix = $field['suffix']; } } return $prefix . $value . $suffix; } /** * Implementation of hook_widget_info(). */ function number_widget_info() { return array( 'number' => array( 'label' => t('Text Field'), 'field types' => array('number_integer', 'number_decimal'), ), ); } /** * Implementation of hook_widget(). */ function number_widget($op, &$node, $field, &$items) { switch ($op) { case 'form': $form = array(); $prefixes = explode('|', $field['prefix']); $suffixes = explode('|', $field['suffix']); // We take the plural form (if any) for forms. $prefix = array_pop($prefixes); $suffix = array_pop($suffixes); $form[$field['field_name']] = array('#tree' => TRUE); if ($field['multiple']) { $form[$field['field_name']]['#type'] = 'fieldset'; $form[$field['field_name']]['#description'] = content_filter_xss(t($field['widget']['description'])); $delta = 0; foreach ($items as $data) { if (isset($data['value'])) { $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, '#size' => 20, '#maxlength' => 11, '#attributes' => array('class' => 'number'), '#field_prefix' => $prefix, '#field_suffix' => $suffix, ); $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, '#size' => 20, '#maxlength' => 11, '#attributes' => array('class' => 'number'), '#field_prefix' => $prefix, '#field_suffix' => $suffix, ); } } else { $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' => content_filter_xss(t($field['widget']['description'])), '#size' => 20, '#maxlength' => 11, '#attributes' => array('class' => 'number'), '#field_prefix' => $prefix, '#field_suffix' => $suffix, ); } return $form; case 'process form values': // Don't save empty fields. foreach ($items as $delta => $item) { $items[$delta]['value'] = preg_replace('@[^-0-9\.]@', '', $items[$delta]['value']); } if ($field['multiple']) { foreach ($items as $delta => $item) { if ($item['value'] == '' && $delta > 0) { unset($items[$delta]); } } } break; } } /** * Create an array of the allowed values for this field */ function number_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) { // Sanitize the user input with a permissive filter. $opt = content_filter_xss($opt); list($key, $value) = explode('|', $opt); $allowed_values[$field['field_name']][$key] = $value ? $value : $key; } } return $allowed_values[$field['field_name']]; }