Skip to content
number.module 12.4 KiB
Newer Older
 * Defines numeric field types.
 */

/**
 * Implementation of hook_help().
 */
function number_help($section) {
  switch ($section) {
    case 'admin/modules#description':
      return t('<strong>CCK:</strong> Defines numeric field types. <em>Note: Requires content.module.</em>');
  }
}

/**
 * Implementation of hook_field_info().
 */
function number_field_info() {
  return array(
    'number_integer' => array('label' => 'Integer'),
    'number_decimal' => array('label' => '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['append_string'] = array(
        '#type' => 'textfield',
        '#title' => t('Append string'),
        '#size' => 60,
        '#default_value' => isset($field['append_string']) ? $field['append_string'] : '',
        '#description' => t('Define a string that should be appended to the value like $, m², €, m/s², kb/s. Leave blank for none.'),
      );
      $form['append_position'] = array(
        '#type' => 'radios',
        '#title' => t('Append string position'),
        '#options' => array('prefix' => t('Prefix'), 'suffix' => t('Suffix')),
        '#default_value' => isset($field['append_position']) ? $field['append_position'] : 'prefix',
        '#description' => t('Define the position of the append string relative to its value, as a prefix: $99,99 or as a suffix: 24,03m'),
      );
      $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['allowed_values'] = array(
        '#type' => 'textarea',
        '#default_value' => isset($field['allowed_values']) ? $field['allowed_values'] : '',
        '#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 &lt;?php ?&gt; delimiters. If this field is filled out, the array returned by this code will override the allowed values list above.'),
      if ($field['min'] && !is_numeric($field['min'])) {
        form_set_error('rows', t('"Minimum" must be a number.'));
      }
      if ($field['max'] && !is_numeric($field['max'])) {
        form_set_error('rows', t('"Maximum" must be a number.'));
      return array('append_string', '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),
      $allowed_values = number_allowed_values($field);
      if (count($allowed_values)) {
        return array(
          'default' => array(
            'list-type' => 'list',
            'operator' => 'views_handler_operator_or',
            'value-type' => 'array',
        );
      }
      else {
        return array(
          'default' => array(
            'operator' => 'views_handler_operator_gtlt',
          ),
        );
      }
      break;
function number_field($op, &$node, $field, &$items, $teaser, $page) {
      $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']))));
 * Implementation of hook_field_formatter_info().
    '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')),
  );
}

/**
 * Implementation of hook_field_formatter().
 */
function number_field_formatter($field, $item, $formatter, $node) {
  if ($allowed_values = number_allowed_values($field)) {
    $item['value'] = $allowed_values[$item['value']];
    $value = number_format($item['value'], 0, '.', '');
    break;
    $value = number_format($item['value'], 0, '.', ',');
    break;
    $value = number_format($item['value'], 1, '.', ',');
    break;
    $value = number_format($item['value'], 2, '.', ',');
    break;
    $value = number_format($item['value'], 0, ', ', ' ');
    break;
    $value = number_format($item['value'], 1, ', ', '.');
    break;
    $value = number_format($item['value'], 2, ', ', '.');
    break;
    $value = number_format($item['value'], 0, ', ', ' ');
    break;
    $value = number_format($item['value'], 1, ', ', ' ');
    break;
    $value = number_format($item['value'], 2, ', ', ' ');
    break;
    $value = number_format($item['value']);
    break;
  }
  if($field['append_string']) {
    if($field['append_position'] == 'prefix') {
      return check_plain($field['append_string']) . check_plain($value);
    } else {
      return check_plain($value) . check_plain($field['append_string']);
    }
  } else {
    return check_plain($value);
/**
 * Implementation of hook_widget_info().
 */
function number_widget_info() {
  return array(
    'number' => array(
      'label' => 'Text Field',
      'field types' => array('number_integer', 'number_decimal'),
    ),
  );
}

/**
 * Implementation of hook_widget().
 */
function number_widget($op, &$node, $field, &$node_field) {
      
      // Display the append string (if exists) as prefix or suffix next to the input field
      $prefix = '';
      $suffix = '';
      if ($field['append_string']) {
        if($field['append_position'] == 'prefix') {
          $prefix = check_plain($field['append_string']);
        } else {
          $suffix = check_plain($field['append_string']);
        }
      }
      
      $form[$field['field_name']] = array('#tree' => TRUE);

      if ($field['multiple']) {
Jonathan Chaffer's avatar
Jonathan Chaffer committed
        $form[$field['field_name']]['#type'] = 'fieldset';
        $form[$field['field_name']]['#description'] = $field['widget']['description'];
Jonathan Chaffer's avatar
Jonathan Chaffer committed
        $delta = 0;
        foreach ($node_field as $data) {
Jonathan Chaffer's avatar
Jonathan Chaffer committed
            $form[$field['field_name']][$delta]['value'] = array(
              '#type' => 'textfield',
              '#title' => ($delta == 0) ? t($field['widget']['label']) : '',
Jonathan Chaffer's avatar
Jonathan Chaffer committed
              '#default_value' => $data['value'],
              '#required' => ($delta == 0) ? $field['required'] : FALSE,
John Hwang's avatar
John Hwang committed
              '#maxlength' => 11,
              '#attributes' => array('class' => 'number'),
              '#field_prefix' => $prefix,
              '#field_suffix' => $suffix,
Jonathan Chaffer's avatar
Jonathan Chaffer committed
            );
            $delta++;
          }
        }
        foreach (range($delta, $delta + 2) as $delta) {
          $form[$field['field_name']][$delta]['value'] = array(
            '#type' => 'textfield',
            '#title' => ($delta == 0) ? t($field['widget']['label']) : '',
Jonathan Chaffer's avatar
Jonathan Chaffer committed
            '#default_value' => '',
            '#required' => ($delta == 0) ? $field['required'] : FALSE,
John Hwang's avatar
John Hwang committed
            '#maxlength' => 11,
            '#attributes' => array('class' => 'number'),
            '#field_prefix' => $prefix,
            '#field_suffix' => $suffix,
        $form[$field['field_name']][0]['value'] = array(
          '#type' => 'textfield',
          '#title' => t($field['widget']['label']),
          '#default_value' => isset($node_field[0]['value']) ? $node_field[0]['value'] : '',
          '#required' => $field['required'],
Jonathan Chaffer's avatar
Jonathan Chaffer committed
          '#description' => $field['widget']['description'],
John Hwang's avatar
John Hwang committed
          '#maxlength' => 11,
          '#attributes' => array('class' => 'number'),
          '#field_prefix' => $prefix,
          '#field_suffix' => $suffix,

    case 'process form values':
      // Don't save empty fields.
      foreach ($node_field as $delta => $item) {
        $node_field[$delta]['value'] = preg_replace('@[^0-9\.]@','',$node_field[$delta]['value']);
      }
      if ($field['multiple']) {
        foreach ($node_field as $delta => $item) {
          if ($item['value'] == '' && $delta > 0) {

/**
 *  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) {
      list($key, $value) = explode('|', $opt);
      $allowed_values[$field['field_name']][$key] = $value ? $value : $key;
    }
  }
  return $allowed_values[$field['field_name']];
}