Last active
August 29, 2015 14:03
-
-
Save ss81/7e0773ad942d8c2be82f to your computer and use it in GitHub Desktop.
Defining Custom Field Types in Drupal
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Implements hook_field_schema(). | |
*/ | |
function license_plate_field_schema($field) { | |
return array( | |
'columns' => array( | |
'plate_number' => array( | |
'type' => 'varchar', | |
'length' => 8, | |
'not null' => TRUE, | |
), | |
'state' => array( | |
'type' => 'varchar', | |
'length' => 2, | |
'not null' => FALSE, | |
), | |
), | |
); | |
} | |
/** | |
* Implements hook_field_info(). | |
*/ | |
function license_plate_field_info() { | |
return array( | |
'license_plate' => array( | |
'label' => t('License Plate'), | |
'description' => t('This field stores a license plate number in the database.'), | |
'default_widget' => 'license_plate_field', | |
'default_formatter' => 'license_plate_default', | |
), | |
); | |
} | |
/** | |
* Implements hook_field_widget_info(). | |
*/ | |
function license_plate_field_widget_info() { | |
return array( | |
'license_plate_field' => array( | |
'label' => t('Text field'), | |
'field types' => array('license_plate'), | |
), | |
); | |
} | |
/** | |
* Implements hook_field_settings_form(). | |
*/ | |
function license_plate_field_settings_form($field, $instance, $has_data) { | |
$settings = $field['settings']; | |
// Add your global settings fields here | |
$form = array(); | |
return $form; | |
} | |
/** | |
* Implements hook_field_instance_settings_form(). | |
*/ | |
function license_plate_field_instance_settings_form($field, $instance) { | |
$settings = $instance['settings']; | |
// Add your instance settings fields here. | |
$form = array(); | |
return $form; | |
} | |
/** | |
* Implements hook_field_widget_form(). | |
*/ | |
function license_plate_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) { | |
switch ($instance['widget']['type']) { | |
case 'license_plate_field' : | |
$element['license_plate'] = array( | |
'#type' => 'fieldset', | |
'#title' => $element['#title'], | |
'#tree' => TRUE, | |
); | |
$element['license_plate']['plate_number'] = array( | |
'#type' => 'textfield', | |
'#title' => t('Plate number'), | |
'#default_value' => isset($items[$delta]['plate_nuber']) ? $items[$delta]['plate_nuber'] : '', | |
'#required' => $element['#required'], | |
'#size' => 8, | |
'#attributes' => array('maxlength' => 8), | |
); | |
$element['license_plate']['state'] = array( | |
'#type' => 'select', | |
'#title' => t('State'), | |
'#default_value' => isset($items[$delta]['state']) ? $items[$delta]['state'] : '', | |
'#options' => array( | |
'AL' => 'Alabama', | |
'AK' => 'Alaska', | |
'AZ' => 'Arizona', | |
), | |
'#required' => $element['#required'], | |
); | |
break; | |
} | |
return $element; | |
} | |
/** | |
* Implements hook_field_presave(). | |
*/ | |
function license_plate_field_presave($entity_type, $entity, $field, $instance, $langcode, &$items) { | |
foreach ($items as $delta => $item) { | |
if (isset($item['license_plate']['plate_number'])) { | |
$items[$delta]['plate_number'] = $item['license_plate']['plate_number']; | |
$items[$delta]['state'] = $item['license_plate']['state']; | |
} | |
} | |
} | |
/** | |
* Implements hook_field_is_empty(). | |
*/ | |
function license_plate_field_is_empty($item, $field) { | |
if (empty($item['license_plate']['plate_number'])) { | |
return TRUE; | |
} | |
return FALSE; | |
} | |
/** | |
* Implements hook_field_validate(). | |
*/ | |
function license_plate_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) { | |
// Loop through field items in the case of multiple values. | |
foreach ($items as $delta => $item) { | |
if (isset($item['plate_number']) && $item['plate_number'] != '') { | |
if (!valid_license_plate($item['plate_number'])) { | |
$errors[$field['field_name']][$langcode][$delta][] = array( | |
'message' => t('Invalid license plate number.'), | |
); | |
} | |
} | |
} | |
} | |
/** | |
* Implements hook_field_formatter_info(). | |
*/ | |
function license_plate_field_formatter_info() { | |
return array( | |
'license_plate_default' => array( | |
'label' => t('Default'), | |
'field types' => array('license_plate'), | |
), | |
); | |
} | |
/** | |
* Implements hook_field_formatter_view(). | |
*/ | |
function license_plate_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) { | |
$element = array(); | |
switch ($display['type']) { | |
case 'license_plate_default' : | |
foreach ($items as $delta => $item) { | |
if (isset($item['plate_number'])) { | |
$element[$delta]['#markup'] = $item['state'] . ' ' . $item['plate_number']; | |
} | |
} | |
break; | |
} | |
return $element; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment