array(
'variables' => array(
'text_color' => 'black', 'text_message' => '',
),
'template' => 'templates/colorfield-simpletext',
),
);
}
/***************************************************************
* Field Type API hooks
***************************************************************/
/**
* Implements hook_field_info().
*
* Provides the description of the field.
*/
function colorfield_field_info() {
return array(
// We name our field as the associative name of the array.
'colorfield_rgb' => array(
'label' => t('Color Picker (RGB)'),
'description' => t('A field composed of an RGB color.'),
'default_widget' => 'colorfield_text',
'default_formatter' => 'colorfield_simple_text',
'instance_settings' => array('text_processing' => 0),
),
);
}
/**
* Implements hook_field_validate().
*
* This hook gives us a chance to validate content that's in our
* field. We're really only interested in the $items parameter, since
* it holds arrays representing content in the field we've defined.
* We want to verify that the items only contain RGB hex values like
* this: #RRGGBB. If the item validates, we do nothing. If it doesn't
* validate, we add our own error notification to the $errors parameter.
*
* @see colorfield_field_widget_error()
*/
function colorfield_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
foreach ($items as $delta => $item) {
if (!empty($item['rgb'])) {
if (!preg_match('@^#[0-9a-fA-F]{6}$@', $item['rgb'])) {
$errors[$field['field_name']][$langcode][$delta][] = array(
'error' => 'colorfield_invalid',
'message' => t('Color must be in the HTML format #abcdef.'),
);
}
}
}
}
/**
* Implements hook_field_is_empty().
*
* hook_field_is_emtpy() is where Drupal asks us if this field is empty.
* Return TRUE if it does not contain data, FALSE if it does. This lets
* the form API flag an error when required fields are empty.
*/
function colorfield_field_is_empty($item, $field) {
return empty($item['rgb']);
}
/**
* Implements hook_field_formatter_info().
*
* We need to tell Drupal that we have two different types of formatters
* for this field. One will change the text color, and the other will
* change the background color.
*
* @see colorfield_field_formatter_view()
*/
function colorfield_field_formatter_info() {
return array(
// This formatter displays the raw value of the color.
'colorfield_raw_rgb' => array(
'label' => t('Raw RGB value'),
'field types' => array('colorfield_rgb'),
'settings' => array('display_hash' => TRUE),
),
// This formatter displays a DIV of the specified color
'colorfield_color_swatch' => array(
'label' => t('Color swatch'),
'field types' => array('colorfield_rgb'),
'settings' => array('width' => 20, 'height' => 20),
),
// This formatter just displays the hex value in the color indicated.
'colorfield_simple_text' => array(
'label' => t('Simple text-based formatter'),
'field types' => array('colorfield_rgb'),
'settings' => array('message' => t('The color code in this field is @code')),
),
// This formatter changes the background color of the content region.
'colorfield_color_background' => array(
'label' => t('Background of the output text'),
'field types' => array('colorfield_rgb'),
),
);
}
/**
* Implements hook_field_formatter_settings_form().
*/
function colorfield_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
$display = $instance['display'][$view_mode];
$settings = $display['settings'];
// Expose the message to display as a setting.
if ($display['type'] == 'colorfield_simple_text') {
$element['message'] = array(
'#type' => 'textfield',
'#title' => t('Message to display'),
'#default_value' => $settings['message'],
'#description' => t('Note that you can use @code to display the value of the code in the message.'),
);
}
// Expose the the block width and height.
else if ($display['type'] == 'colorfield_color_swatch') {
$element['width'] = array(
'#type' => 'textfield',
'#title' => t('Width of the block'),
'#size' => 3,
'#required' => TRUE,
'#element_validate' => array('element_validate_number'),
'#default_value' => $settings['width'],
);
$element['height'] = array(
'#type' => 'textfield',
'#title' => t('Height of the block'),
'#size' => 3,
'#required' => TRUE,
'#element_validate' => array('element_validate_number'),
'#default_value' => $settings['height'],
);
}
else if ($display['type'] == 'colorfield_raw_rgb') {
$element['display_hash'] = array(
'#type' => 'checkbox',
'#title' => t('Display the # in the output of the color'),
'#default_value' => $settings['display_hash'],
);
}
return $element;
}
/**
* Implements hook_field_formatter_settings_summary().
*/
function colorfield_field_formatter_settings_summary($field, $instance, $view_mode) {
$display = $instance['display'][$view_mode];
$settings = $display['settings'];
$summary = array();
// Displays the dynamic message and replace @code by the value of the color
// code if it exists in the message.
if ($display['type'] == 'colorfield_simple_text') {
$summary[] = t('Message displayed: %message', array('%message' => $settings['message']));
if (strpos($settings['message'], '@code')) {
$summary[] = '' . t('Note that @code will be replaced by the color picked.') . '';
}
}
// Displays the width & height of the block as summary.
else if ($display['type'] == 'colorfield_color_swatch') {
$summary[] = t('Width: @width px', array('@width' => $settings['width']));
$summary[] = t('Height: @height px', array('@height' => $settings['height']));
}
// Displays if the hash is displayed or not.
else if ($display['type'] == 'colorfield_raw_rgb') {
$summary[] = ($settings['display_hash']) ? t('The raw will be prefixed with #.') : t('The raw will not be prefixed with #.');
}
return implode('
', $summary);
}
/**
* Implements hook_field_formatter_view().
*
* Two formatters are implemented.
* - colorfield_simple_text just outputs markup indicating the color that
* was entered and uses an inline style to set the text color to that value.
* - colorfield_color_background does the same but also changes the
* background color of div.region-content.
*
* @see colorfield_field_formatter_info()
*/
function colorfield_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
$element = array();
switch ($display['type']) {
// This formatter simply outputs the field as text and with a color.
case 'colorfield_simple_text':
foreach ($items as $delta => $item) {
$element[$delta] = array(
'#theme' => 'colorfield_simpletext',
'#text_color' => $item['rgb'],
'#text_message' => t($display['settings']['message'], array('@code' => $item['rgb'])),
);
}
break;
// This formatter simply outputs the raw RGB value prefixed or not with
// the hash.
case 'colorfield_raw_rgb':
foreach ($items as $delta => $item) {
$color = ($display['settings']['display_hash'])? $item['rgb'] : substr($item['rgb'], 1);
$element[$delta] = array('#markup' => $color);
}
break;
// This formatter adds css to the page changing the '.region-content' area's
// background color. If there are many fields, the last one will win.
case 'colorfield_color_background':
foreach ($items as $delta => $item) {
$element[$delta] = array(
'#type' => 'html_tag',
'#tag' => 'p',
'#value' => t('The content area color has been changed to @code', array('@code' => $item['rgb'])),
'#attached' => array(
'css' => array(
array(
'data' => 'div.region-content { background-color:' . $item['rgb'] . ';}',
'type' => 'inline',
),
),
),
);
}
break;
// Adds an empty DIV, the background of which uses the selected colour.
// Could be used, for example, to display a swatch of the color.
case 'colorfield_color_swatch':
foreach ($items as $delta => $item) {
$element[$delta] = array(
'#type' => 'html_tag',
'#tag' => 'div',
'#attributes' => array(
'class' => array('colorfield-color-swatch'),
'style' => 'width: ' . $display['settings']['width'] . 'px; height: ' . $display['settings']['height'] . 'px; background-color:' . $item['rgb'] . ';'
),
);
}
break;
}
return $element;
}
/**
* Implements hook_field_widget_info().
*
* Three widgets are provided.
* - A simple text-only widget where the user enters the '#ffffff'.
* - A 3-textfield widget that gathers the red, green, and blue values
* separately.
* - A farbtastic colorpicker widget that chooses the value graphically.
*
* These widget types will eventually show up in hook_field_widget_form,
* where we will have to flesh them out.
*
* @see colorfield_field_widget_form()
*/
function colorfield_field_widget_info() {
return array(
'colorfield_text' => array(
'label' => t('RGB value as #ffffff'),
'field types' => array('colorfield_rgb'),
),
'colorfield_3text' => array(
'label' => t('RGB text field'),
'field types' => array('colorfield_rgb'),
),
);
}
/**
* Implements hook_field_widget_form().
*
* hook_widget_form() is where Drupal tells us to create form elements for
* our field's widget.
*
* We provide one of three different forms, depending on the widget type of
* the Form API item provided.
*
* The 'colorfield_colorpicker' and 'colorfield_text' are essentially
* the same, but colorfield_colorpicker adds a javascript colorpicker
* helper.
*
* colorfield_3text displays three text fields, one each for red, green,
* and blue. However, the field type defines a single text column,
* rgb, which needs an HTML color spec. Define an element validate
* handler that converts our r, g, and b fields into a simulated single
* 'rgb' form element.
*/
function colorfield_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
$value = isset($items[$delta]['rgb']) ? $items[$delta]['rgb'] : '';
$widget = $element;
$widget['#delta'] = $delta;
switch ($instance['widget']['type']) {
// DELIBERATE fall-through: From here on the colorfield_text and
// colorfield_colorpicker are exactly the same.
case 'colorfield_text':
$widget += array(
'#type' => 'textfield',
'#default_value' => $value,
// Allow a slightly larger size that the field length to allow for some
// configurations where all characters won't fit in input field.
'#size' => 7,
'#maxlength' => 7,
'#suffix' => '