5 * Defines a field type and its formatters and widgets.
9 * Implements hook_field_info().
11 function field_test_field_info() {
13 'test_field' => array(
14 'label' => t('Test field'),
15 'description' => t('Dummy field type used for tests.'),
17 'test_field_setting' => 'dummy test string',
18 'changeable' => 'a changeable field setting',
19 'unchangeable' => 'an unchangeable field setting',
21 'instance_settings' => array(
22 'test_instance_setting' => 'dummy test string',
23 'test_hook_field_load' => FALSE,
25 'default_widget' => 'test_field_widget',
26 'default_formatter' => 'field_test_default',
29 'label' => t('Shape'),
30 'description' => t('Another dummy field type.'),
32 'foreign_key_name' => 'shape',
34 'instance_settings' => array(),
35 'default_widget' => 'test_field_widget',
36 'default_formatter' => 'field_test_default',
38 'hidden_test_field' => array(
40 'label' => t('Hidden from UI test field'),
41 'description' => t('Dummy hidden field type used for tests.'),
42 'settings' => array(),
43 'instance_settings' => array(),
44 'default_widget' => 'test_field_widget',
45 'default_formatter' => 'field_test_default',
51 * Implements hook_field_update_forbid().
53 function field_test_field_update_forbid($field, $prior_field, $has_data) {
54 if ($field['type'] == 'test_field' && $field['settings']['unchangeable'] != $prior_field['settings']['unchangeable']) {
55 throw new FieldException("field_test 'unchangeable' setting cannot be changed'");
60 * Implements hook_field_load().
62 function field_test_field_load($entity_type, $entities, $field, $instances, $langcode, &$items, $age) {
63 $args = func_get_args();
64 field_test_memorize(__FUNCTION__, $args);
66 foreach ($items as $id => $item) {
67 // To keep the test non-intrusive, only act for instances with the
68 // test_hook_field_load setting explicitly set to TRUE.
69 if ($instances[$id]['settings']['test_hook_field_load']) {
70 foreach ($item as $delta => $value) {
71 // Don't add anything on empty values.
73 $items[$id][$delta]['additional_key'] = 'additional_value';
81 * Implements hook_field_insert().
83 function field_test_field_insert($entity_type, $entity, $field, $instance, $items) {
84 $args = func_get_args();
85 field_test_memorize(__FUNCTION__, $args);
89 * Implements hook_field_update().
91 function field_test_field_update($entity_type, $entity, $field, $instance, $items) {
92 $args = func_get_args();
93 field_test_memorize(__FUNCTION__, $args);
97 * Implements hook_field_delete().
99 function field_test_field_delete($entity_type, $entity, $field, $instance, $items) {
100 $args = func_get_args();
101 field_test_memorize(__FUNCTION__, $args);
105 * Implements hook_field_validate().
107 * Possible error codes:
108 * - 'field_test_invalid': The value is invalid.
110 function field_test_field_validate($entity_type, $entity, $field, $instance, $langcode, $items, &$errors) {
111 $args = func_get_args();
112 field_test_memorize(__FUNCTION__, $args);
114 foreach ($items as $delta => $item) {
115 if ($item['value'] == -1) {
116 $errors[$field['field_name']][$langcode][$delta][] = array(
117 'error' => 'field_test_invalid',
118 'message' => t('%name does not accept the value -1.', array('%name' => $instance['label'])),
125 * Implements hook_field_is_empty().
127 function field_test_field_is_empty($item, $field) {
128 return empty($item['value']);
132 * Implements hook_field_settings_form().
134 function field_test_field_settings_form($field, $instance, $has_data) {
135 $settings = $field['settings'];
137 $form['test_field_setting'] = array(
138 '#type' => 'textfield',
139 '#title' => t('Field test field setting'),
140 '#default_value' => $settings['test_field_setting'],
141 '#required' => FALSE,
142 '#description' => t('A dummy form element to simulate field setting.'),
149 * Implements hook_field_instance_settings_form().
151 function field_test_field_instance_settings_form($field, $instance) {
152 $settings = $instance['settings'];
154 $form['test_instance_setting'] = array(
155 '#type' => 'textfield',
156 '#title' => t('Field test field instance setting'),
157 '#default_value' => $settings['test_instance_setting'],
158 '#required' => FALSE,
159 '#description' => t('A dummy form element to simulate field instance setting.'),
166 * Implements hook_field_widget_info().
168 function field_test_field_widget_info() {
170 'test_field_widget' => array(
171 'label' => t('Test field'),
172 'field types' => array('test_field', 'hidden_test_field'),
173 'settings' => array('test_widget_setting' => 'dummy test string'),
175 'test_field_widget_multiple' => array(
176 'label' => t('Test field 1'),
177 'field types' => array('test_field'),
178 'settings' => array('test_widget_setting_multiple' => 'dummy test string'),
179 'behaviors' => array(
180 'multiple values' => FIELD_BEHAVIOR_CUSTOM,
187 * Implements hook_field_widget_form().
189 function field_test_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
190 switch ($instance['widget']['type']) {
191 case 'test_field_widget':
193 '#type' => 'textfield',
194 '#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : '',
196 return array('value' => $element);
198 case 'test_field_widget_multiple':
200 foreach ($items as $delta => $value) {
201 $values[] = $value['value'];
204 '#type' => 'textfield',
205 '#default_value' => implode(', ', $values),
206 '#element_validate' => array('field_test_widget_multiple_validate'),
213 * Form element validation handler for 'test_field_widget_multiple' widget.
215 function field_test_widget_multiple_validate($element, &$form_state) {
216 $values = array_map('trim', explode(',', $element['#value']));
218 foreach ($values as $value) {
219 $items[] = array('value' => $value);
221 form_set_value($element, $items, $form_state);
225 * Implements hook_field_widget_error().
227 function field_test_field_widget_error($element, $error, $form, &$form_state) {
228 // @todo No easy way to differenciate widget types, we should receive it as a
230 if (isset($element['value'])) {
231 // Widget is test_field_widget.
232 $error_element = $element['value'];
235 // Widget is test_field_widget_multiple.
236 $error_element = $element;
239 form_error($error_element, $error['message']);
243 * Implements hook_field_widget_settings_form().
245 function field_test_field_widget_settings_form($field, $instance) {
246 $widget = $instance['widget'];
247 $settings = $widget['settings'];
249 $form['test_widget_setting'] = array(
250 '#type' => 'textfield',
251 '#title' => t('Field test field widget setting'),
252 '#default_value' => $settings['test_widget_setting'],
253 '#required' => FALSE,
254 '#description' => t('A dummy form element to simulate field widget setting.'),
261 * Implements hook_field_formatter_info().
263 function field_test_field_formatter_info() {
265 'field_test_default' => array(
266 'label' => t('Default'),
267 'description' => t('Default formatter'),
268 'field types' => array('test_field'),
270 'test_formatter_setting' => 'dummy test string',
273 'field_test_multiple' => array(
274 'label' => t('Multiple'),
275 'description' => t('Multiple formatter'),
276 'field types' => array('test_field'),
278 'test_formatter_setting_multiple' => 'dummy test string',
281 'field_test_with_prepare_view' => array(
282 'label' => t('Tests hook_field_formatter_prepare_view()'),
283 'field types' => array('test_field'),
285 'test_formatter_setting_additional' => 'dummy test string',
292 * Implements hook_field_formatter_settings_form().
294 function field_test_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
295 $display = $instance['display'][$view_mode];
296 $settings = $display['settings'];
300 // The name of the setting depends on the formatter type.
302 'field_test_default' => 'test_formatter_setting',
303 'field_test_multiple' => 'test_formatter_setting_multiple',
304 'field_test_with_prepare_view' => 'test_formatter_setting_additional',
307 if (isset($map[$display['type']])) {
308 $name = $map[$display['type']];
310 $element[$name] = array(
311 '#title' => t('Setting'),
312 '#type' => 'textfield',
314 '#default_value' => $settings[$name],
323 * Implements hook_field_formatter_settings_summary().
325 function field_test_field_formatter_settings_summary($field, $instance, $view_mode) {
326 $display = $instance['display'][$view_mode];
327 $settings = $display['settings'];
331 // The name of the setting depends on the formatter type.
333 'field_test_default' => 'test_formatter_setting',
334 'field_test_multiple' => 'test_formatter_setting_multiple',
335 'field_test_with_prepare_view' => 'test_formatter_setting_additional',
338 if (isset($map[$display['type']])) {
339 $name = $map[$display['type']];
340 $summary = t('@setting: @value', array('@setting' => $name, '@value' => $settings[$name]));
347 * Implements hook_field_formatter_prepare_view().
349 function field_test_field_formatter_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items, $displays) {
350 foreach ($items as $id => $item) {
351 // To keep the test non-intrusive, only act on the
352 // 'field_test_with_prepare_view' formatter.
353 if ($displays[$id]['type'] == 'field_test_with_prepare_view') {
354 foreach ($item as $delta => $value) {
355 // Don't add anything on empty values.
357 $items[$id][$delta]['additional_formatter_value'] = $value['value'] + 1;
365 * Implements hook_field_formatter_view().
367 function field_test_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
369 $settings = $display['settings'];
371 switch ($display['type']) {
372 case 'field_test_default':
373 foreach ($items as $delta => $item) {
374 $element[$delta] = array('#markup' => $settings['test_formatter_setting'] . '|' . $item['value']);
378 case 'field_test_with_prepare_view':
379 foreach ($items as $delta => $item) {
380 $element[$delta] = array('#markup' => $settings['test_formatter_setting_additional'] . '|' . $item['value'] . '|' . $item['additional_formatter_value']);
384 case 'field_test_multiple':
385 if (!empty($items)) {
387 foreach ($items as $delta => $item) {
388 $array[] = $delta . ':' . $item['value'];
390 $element[0] = array('#markup' => $settings['test_formatter_setting_multiple'] . '|' . implode('|', $array));
399 * Sample 'default value' callback.
401 function field_test_default_value($entity_type, $entity, $field, $instance) {
402 return array(array('value' => 99));
406 * Implements hook_field_access().
408 function field_test_field_access($op, $field, $entity_type, $entity, $account) {
409 if ($field['field_name'] == "field_no_{$op}_access") {