Skip to content

Instantly share code, notes, and snippets.

@ss81
Last active August 29, 2015 14:03
Show Gist options
  • Save ss81/7e0773ad942d8c2be82f to your computer and use it in GitHub Desktop.
Save ss81/7e0773ad942d8c2be82f to your computer and use it in GitHub Desktop.
Defining Custom Field Types in Drupal
<?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