' . t('About') . ''; $output .= '

' . t('The Number module defines various numeric field types for the Field module. Numbers can be in integer, decimal, or floating-point form, and they can be formatted when displayed. Number fields can be limited to a specific set of input values or to a range of values. See the Field module help page for more information about fields.', array('@field-help' => url('admin/help/field'))) . '

'; return $output; } } /** * Implements hook_field_info(). */ function number_field_info() { return array( 'number_integer' => array( 'label' => t('Integer'), 'description' => t('This field stores a number in the database as an integer.'), 'instance_settings' => array('min' => '', 'max' => '', 'prefix' => '', 'suffix' => ''), 'default_widget' => 'number', 'default_formatter' => 'number_integer', 'field item class' => '\Drupal\number\Type\IntegerItem', ), 'number_decimal' => array( 'label' => t('Decimal'), 'description' => t('This field stores a number in the database in a fixed decimal format.'), 'settings' => array('precision' => 10, 'scale' => 2), 'instance_settings' => array('min' => '', 'max' => '', 'prefix' => '', 'suffix' => ''), 'default_widget' => 'number', 'default_formatter' => 'number_decimal', 'field item class' => '\Drupal\number\Type\DecimalItem', ), 'number_float' => array( 'label' => t('Float'), 'description' => t('This field stores a number in the database in a floating point format.'), 'instance_settings' => array('min' => '', 'max' => '', 'prefix' => '', 'suffix' => ''), 'default_widget' => 'number', 'default_formatter' => 'number_decimal', 'field item class' => '\Drupal\number\Type\FloatItem', ), ); } /** * Implements hook_field_settings_form(). */ function number_field_settings_form($field, $instance, $has_data) { $settings = $field['settings']; $form = array(); if ($field['type'] == 'number_decimal') { $form['precision'] = array( '#type' => 'select', '#title' => t('Precision'), '#options' => drupal_map_assoc(range(10, 32)), '#default_value' => $settings['precision'], '#description' => t('The total number of digits to store in the database, including those to the right of the decimal.'), '#disabled' => $has_data, ); $form['scale'] = array( '#type' => 'select', '#title' => t('Scale'), '#options' => drupal_map_assoc(range(0, 10)), '#default_value' => $settings['scale'], '#description' => t('The number of digits to the right of the decimal.'), '#disabled' => $has_data, ); } return $form; } /** * Implements hook_field_instance_settings_form(). */ function number_field_instance_settings_form($field, $instance) { $settings = $instance['settings']; $form['min'] = array( '#type' => 'textfield', '#title' => t('Minimum'), '#default_value' => $settings['min'], '#description' => t('The minimum value that should be allowed in this field. Leave blank for no minimum.'), '#element_validate' => array('form_validate_number'), ); $form['max'] = array( '#type' => 'textfield', '#title' => t('Maximum'), '#default_value' => $settings['max'], '#description' => t('The maximum value that should be allowed in this field. Leave blank for no maximum.'), '#element_validate' => array('form_validate_number'), ); $form['prefix'] = array( '#type' => 'textfield', '#title' => t('Prefix'), '#default_value' => $settings['prefix'], '#size' => 60, '#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['suffix'] = array( '#type' => 'textfield', '#title' => t('Suffix'), '#default_value' => $settings['suffix'], '#size' => 60, '#description' => t("Define a string that should be suffixed to the value, like ' m', ' kb/s'. Leave blank for none. Separate singular and plural values with a pipe ('pound|pounds')."), ); return $form; } /** * Implements hook_field_validate(). * * Possible error codes: * - number_min: The value is less than the allowed minimum value. * - number_max: The value is greater than the allowed maximum value. */ function number_field_validate(EntityInterface $entity = NULL, $field, $instance, $langcode, $items, &$errors) { foreach ($items as $delta => $item) { if ($item['value'] != '') { if (is_numeric($instance['settings']['min']) && $item['value'] < $instance['settings']['min']) { $errors[$field['field_name']][$langcode][$delta][] = array( 'error' => 'number_min', 'message' => t('%name: the value may be no less than %min.', array('%name' => $instance['label'], '%min' => $instance['settings']['min'])), ); } if (is_numeric($instance['settings']['max']) && $item['value'] > $instance['settings']['max']) { $errors[$field['field_name']][$langcode][$delta][] = array( 'error' => 'number_max', 'message' => t('%name: the value may be no greater than %max.', array('%name' => $instance['label'], '%max' => $instance['settings']['max'])), ); } } } } /** * Implements hook_field_presave(). */ function number_field_presave(EntityInterface $entity, $field, $instance, $langcode, &$items) { if ($field['type'] == 'number_decimal') { // Let PHP round the value to ensure consistent behavior across storage // backends. foreach ($items as $delta => $item) { if (isset($item['value'])) { $items[$delta]['value'] = round($item['value'], $field['settings']['scale']); } } } } /** * Implements hook_field_is_empty(). */ function number_field_is_empty($item, $field) { if (empty($item['value']) && (string) $item['value'] !== '0') { return TRUE; } return FALSE; }