感觉这一章没什么用,用UI为Drupal增加字段看起来的确很酷,但是没什么实用性。个人网站还好,商业网站程序卖出去给客户让客户按照说明书帮你创建字段?很明显还是用Field API写代码来创建字段更有实际意义,在你安装模块后,这个字段就在你的节点编辑表单里,已准备好为你的模块使用。
color_example.info
name = Color Example description = "Creates a custom field for inputting and displaying text in a colorful fashion." package = Pro Drupal Development core = 7.x files[] = color_example.module php = 5.2
color_example.module
<?php
/**
* @file
* An example field using the Field API.
*
*/
/**
* Implements hook_field_info().
*
* Provides the description of the field.
* 描述字段名
*/
function color_example_field_info()
{
return array(
'color_example_rgb' => array(
'label' => t('Example Color RGB'),
'description' => t('Demonstrates a field composed of an RGB color.'),
'default_widget' => 'color_example_3text',
'default_formatter' => 'color_example_simple_text'
)
);
}
/**
* Implements hook_field_schema().
* 建立数据表
*/
function color_example_field_schema($field)
{
$columns = array(
'rgb' => array(
'type' => 'varchar',
'length' => 7,
'not null' => FALSE
)
);
$indexes = array(
'rgb' => array(
'rgb'
)
);
return array(
'columns' => $columns,
'indexes' => $indexes
);
}
/**
* Implements hook_field_validate().
*
* Verifies that the RGB field as combined is valid
* (6 hex digits with a # at the beginning).
* 校验rgb是否合法必须是#xxxxxx的形式
*/
function color_example_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors)
{
foreach($items as $delta=>$item)
{
if(!empty($item['rgb']))
{
if(!preg_match('@^#[0-9a-f]{6}$@', $item['rgb']))
{
$errors[$field['field_name']][$langcode][$delta][] = array(
'error' => 'color_example_invalid',
'message' => t('Color must be in the HTML format #abcdef.')
);
}
}
}
}
/**
* Implements hook_field_is_empty().
* 描述什么样的字段是空字段
*/
function color_example_field_is_empty($item, $field)
{
return empty($item['rgb']);
}
/**
* Implements hook_field_formatter_info().
* 定义字段是如何被描述的,只是定义,下一个函数才渲染
*/
function color_example_field_formatter_info()
{
return array(
// This formatter just displays the hex value in the color indicated.
'color_example_simple_text' => array(
'label' => t('Simple text-based formatter'),
'field types' => array(
'color_example_rgb'
)
),
// This formatter changes the background color of the content region.
'color_example_color_background' => array(
'label' => t('Change the background of the output text'),
'field types' => array(
'color_example_rgb'
)
)
);
}
/**
* Implements hook_field_formatter_view().
* 渲染
*/
function color_example_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.
// 简单地将rgb值以对应的颜色输出
case 'color_example_simple_text' :
foreach($items as $delta=>$item)
{
$element[$delta]['#markup'] = '<p style="color: ' . $item['rgb'] . '">' . t('The color for this event is @code', array(
'@code' => $item['rgb']
)) . '</p>';
}
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.
// 通过css改变'.region-content'
case 'color_example_color_background' :
foreach($items as $delta=>$item)
{
drupal_add_css('div.region-content { background-color:' . $item['rgb'] . ';}', array(
'type' => 'inline'
));
$element[$delta]['#markup'] = '<p>' . t('The color for this event has been changed to @code', array(
'@code' => $item['rgb']
)) . '</p>';
}
break;
}
return $element;
}
/**
* Implements hook_field_widget_info().
* 定义三个挂件
*/
function color_example_field_widget_info()
{
return array(
'color_example_text' => array(
'label' => t('RGB value as #ffffff'),
'field types' => array(
'color_example_rgb'
)
),
'color_example_3text' => array(
'label' => t('RGB text fields'),
'field types' => array(
'color_example_rgb'
)
),
'color_example_colorpicker' => array(
'label' => t('Color Picker'),
'field types' => array(
'color_example_rgb'
)
)
);
}
/**
* Implements hook_field_widget_form().
*/
function color_example_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element)
{
$value = isset($items[$delta]['rgb']) ? $items[$delta]['rgb'] : '';
$element += array(
'#delta' => $delta
);
$element['rgb'] = array();
switch ($instance['widget']['type'])
{
case 'color_example_colorpicker' :
$element['rgb'] += array(
'#suffix' => '<div class="field-example-colorpicker"></div>',
'#attributes' => array(
'class' => array(
'edit-field-examplecolorpicker'
)
),
'#attached' => array(
// Add Farbtastic color picker.
'library' => array(
array(
'system',
'farbtastic'
)
),
// Add javascript to trigger the colorpicker.
'js' => array(
drupal_get_path('module', 'color_example') . '/color_example.js'
)
)
);
// DELIBERATE fall-through: From here on the color_example_text and
// color_example_colorpicker are exactly the same.
case 'color_example_text' :
$element['rgb'] += array(
'#title' => t('Event\’s RGB Color'),
'#type' => 'textfield',
'#default_value' => $value,
// Allow a slightly larger size than the field length to allow for some
// configurations where all characters won't fit in input field.
'#size' => 7,
'#maxlength' => 7
);
break;
case 'color_example_3text' :
// Convert rgb value into r, g, and b for #default_value.
if(isset($items[$delta]['rgb']))
{
preg_match_all('@..@', substr($items[$delta]['rgb'], 1), $match);
}
else
{
$match = array(
array()
);
}
// A fieldset to hold the three text fields.
$element += array(
'#type' => 'fieldset',
'#element_validate' => array(
'color_example_3text_validate'
),
// The following is set so that the validation function will be able
// to access external value information that otherwise would be
// unavailable.
'#delta' => $delta,
'#attached' => array(
'css' => array(
drupal_get_path('module', 'color_example') . '/color_example.css'
)
)
);
// Create a textfield for saturation values for Red, Green, and Blue.
foreach(array(
'r' => t('Red'),
'g' => t('Green'),
'b' => t('Blue')
) as $key=>$title)
{
$element[$key] = array(
'#type' => 'textfield',
'#title' => $title,
'#size' => 2,
'#default_value' => array_shift($match[0]),
'#attributes' => array(
'class' => array(
'rgb-entry'
)
),
'#description' => t('The 2-digit hexadecimal representation of the
@color saturation, like "a1" or "ff"', array(
'@color' => $title
))
);
}
break;
}
return $element;
}
/**
* Validate the individual fields and then convert them into a single HTML RGB
* value as text.
*/
function color_example_3text_validate($element, &$form_state)
{
$delta = $element['#delta'];
$field = $form_state['field'][$element['#field_name']][$element['#language']]['field'];
$field_name = $field['field_name'];
if(isset($form_state['values'][$field_name][$element['#language']][$delta]))
{
$values = $form_state['values'][$field_name][$element['#language']][$delta];
foreach(array(
'r',
'g',
'b'
) as $colorfield)
{
$val = hexdec($values[$colorfield]);
// If they left any empty, we'll set the value empty and quit.
if(strlen($values[$colorfield]) == 0)
{
form_set_value($element, array(
'rgb' => NULL
), $form_state);
return;
}
// If they gave us anything that's not hex, reject it.
if((strlen($values[$colorfield]) != 2) || $val < 0 || $val > 255)
{
form_error($element[$colorfield], t("Saturation value must be a 2-digit hexadecimal
value between 00 and ff."));
}
}
$value = sprintf('#%02s%02s%02s', $values['r'], $values['g'], $values['b']);
form_set_value($element, array(
'rgb' => $value
), $form_state);
}
}
/**
* Implements hook_field_error().
*/
function color_example_field_widget_error($element, $error, $form, &$form_state)
{
switch ($error['error'])
{
case 'color_example_invalid' :
form_error($element, $error['message']);
break;
}
}
color_example.js
/**
* @file
* Javascript for Color Example.
*/
/**
* Provide a farbtastic colorpicker for the fancier widget.
*/
(function ($) {
Drupal.behaviors.color_example_colorpicker = {
attach: function(context) {
$(".edit-field-example-colorpicker").live("focus", function(event) {
var edit_field = this;
var picker = $(this).closest('tr').find(".field-example-colorpicker");
// Hide all color pickers except this one.
$(".field-example-colorpicker").hide();
$(picker).show();
$.farbtastic(picker, function(color) {
edit_field.value = color;
}).setColor(edit_field.value);
});
}
}
})(jQuery);
color_example.css
/**
* @file
* CSS for Color Example.
*/
div.form-item table .form-type-textfield,div.form-item table .form-type-textfield *
{
display: inline-block;
}

知识共享署名-非商业性使用-相同方式共享:码农场 » Chapter 08: Working with Fields Drupal字段
码农场