summaryrefslogtreecommitdiff
path: root/modules/field/field.default.inc
diff options
context:
space:
mode:
Diffstat (limited to 'modules/field/field.default.inc')
-rw-r--r--modules/field/field.default.inc504
1 files changed, 252 insertions, 252 deletions
diff --git a/modules/field/field.default.inc b/modules/field/field.default.inc
index 815c9b42d..da2590c16 100644
--- a/modules/field/field.default.inc
+++ b/modules/field/field.default.inc
@@ -1,253 +1,253 @@
-<?php
-
-/**
- * @file
- *
- * Default 'implementations' of hook_field_*().
- *
- * Handles common field housekeeping.
- * Those implementations are special, as field.module does not define any field
- * types. Those functions take care of default stuff common to all field types.
- *
- * Storage ops ('load', 'insert', 'update', 'delete', 'delete revisions')
- * are not executed field by field, and are thus handled separately.
- */
-
-function field_default_validate($obj_type, $object, $field, $instance, $items, $form) {
- // TODO: here we could validate that required fields are filled in (for programmatic save)
-}
-
-function field_default_submit($obj_type, &$object, $field, $instance, &$items, $form, &$form_state) {
- // Get field values from the submitted form values. Assigning them to $items
- // populates $object->field_name when we return from _field_invoke_default().
-
- // TODO D7: Allow the values to be form_altered to another location, like we
- // do for the form definition ($form['#fields'][$field_name]['form_path']) ?
-
- if (isset($form_state['values'][$field['field_name']])) {
- $items = $form_state['values'][$field['field_name']];
-
- // Remove the 'value' of the 'add more' button.
- unset($items[$field['field_name'] . '_add_more']);
-
- // TODO: the above should be moved to validate time (and values saved back
- // using form_set_value() ), so that hook_field_validate() works on clean data.
- // Not sure we'll want what's below in validate too.
-
- // Reorder items to account for drag-n-drop reordering.
- if (field_behaviors_widget('multiple values', $instance) == FIELD_BEHAVIOR_DEFAULT) {
- $items = _field_sort_items($field, $items);
- }
-
- // Filter out empty values.
- $items = field_set_empty($field, $items);
-
- // _field_invoke() does not add back items for fields not present in the
- // original $object, so add them manually.
- $object->{$field['field_name']} = $items;
- }
- else {
- // The form did not include this field, for instance because of access
- // rules: make sure any existing value for the field stays unchanged.
- unset($object->{$field['field_name']});
- }
-}
-
-/**
- * The 'view' operation constructs the $object in a way that you can use
- * drupal_render() to display the formatted output for an individual field.
- * i.e. print drupal_render($object->content['field_foo']);
- *
- * The code supports both single value formatters, which theme an individual
- * item value, and multiple value formatters, which theme all values for the
- * field in a single theme. The multiple value formatters could be used, for
- * instance, to plot field values on a single map or display them in a graph.
- * Single value formatters are the default, multiple value formatters can be
- * designated as such in formatter_info().
- *
- * The $object array will look like:
- * $object->content['field_foo']['wrapper'] = array(
- * '#type' => 'field',
- * '#title' => 'label'
- * '#field_name' => 'field_name',
- * '#object' => $object,
- * '#object_type' => $obj_type,
- * // Value of the $teaser param of hook_nodeapi('view').
- * '#teaser' => $teaser,
- * 'items' =>
- * 0 => array(
- * '#item' => $items[0],
- * // Only for 'single-value' formatters
- * '#theme' => $theme,
- * '#field_name' => 'field_name',
- * '#bundle' => $bundle,
- * '#formatter' => $formatter_name,
- * '#settings' => $formatter_settings,
- * '#object' => $object,
- * '#object_type' => $obj_type,
- * '#delta' => 0,
- * ),
- * 1 => array(
- * '#item' => $items[1],
- * // Only for 'single-value' formatters
- * '#theme' => $theme,
- * '#field_name' => 'field_name',
- * '#bundle' => $bundle_name,
- * '#formatter' => $formatter_name,
- * '#settings' => $formatter_settings,
- * '#object' => $object,
- * '#object_type' => $obj_type,
- * '#delta' => 1,
- * ),
- * // Only for 'multiple-value' formatters
- * '#theme' => $theme,
- * '#field_name' => 'field_name',
- * '#bundle' => $bundle_name,
- * '#formatter' => $formatter_name,
- * '#settings' => $formatter_settings,
- * ),
- * );
- */
-function field_default_view($obj_type, $object, $field, $instance, $items, $teaser) {
- list($id, $vid, $bundle) = field_attach_extract_ids($obj_type, $object);
-
- $addition = array();
-
- // Entities without build modes should provide a 'full' context.
- // NODE_BUILD_NORMAL is 0, and ('whatever' == 0) is TRUE, so we need a ===.
- if (!isset($object->build_mode)) {
- $context = 'full';
- }
- elseif ($object->build_mode === NODE_BUILD_NORMAL
- || $object->build_mode == NODE_BUILD_PREVIEW) {
- $context = $teaser ? 'teaser' : 'full';
- }
- else {
- $context = $object->build_mode;
- }
-
- // If we don't have specific settings for the current build_mode, we use the
- // (required) 'full' build_mode.
- $display = isset($instance['display'][$context]) ? $instance['display'][$context] : $instance['display']['full'];
- // Ensure we have a valid formatter and formatter settings.
- $display = _field_get_formatter($display, $field);
-
- if ($display['type'] && $display['type'] !== 'hidden') {
- $theme = 'field_formatter_' . $display['type'];
- $single = (field_behaviors_formatter('multiple values', $display) == FIELD_BEHAVIOR_DEFAULT);
-
- $label_display = $display['label'];
- if (isset($object->build_mode) && $object->build_mode == NODE_BUILD_SEARCH_INDEX) {
- $label_display = 'hidden';
- }
-
- $info = array(
- '#field_name' => $field['field_name'],
- '#bundle' => $bundle,
- '#object' => $object,
- '#object_type' => $obj_type,
- );
-
- $element = $info + array(
- '#type' => 'field',
- '#title' => check_plain(t($instance['label'])),
- '#access' => field_access('view', $field),
- '#label_display' => $label_display,
- '#teaser' => $teaser,
- '#single' => $single,
- 'items' => array(),
- );
-
- // Fill-in items.
- foreach ($items as $delta => $item) {
- $element['items'][$delta] = array(
- '#item' => $item,
- '#weight' => $delta,
- );
- }
-
- // Append formatter information either on each item ('single-value' formatter)
- // or at the upper 'items' level ('multiple-value' formatter)
- $format_info = $info + array(
- '#formatter' => $display['type'],
- '#settings' => $display['settings'],
- '#theme' => $theme,
- );
-
- if ($single) {
- foreach ($items as $delta => $item) {
- $element['items'][$delta] += $format_info;
- $element['items'][$delta]['#item']['#delta'] = $delta;
- }
- }
- else {
- $element['items'] += $format_info;
- }
-
- // The wrapper lets us get the themed output for the whole field
- // to populate the $FIELD_NAME_rendered variable for templates,
- // and hide it from the $content variable if needed.
- // See 'preprocess' op and theme_content_field_wrapper()?
- $wrapper = $info + array(
- 'field' => $element,
- '#weight' => $instance['weight'],
- '#post_render' => array('field_wrapper_post_render'),
- '#context' => $context,
- );
-
- $addition = array($field['field_name'] => $wrapper);
- }
- return $addition;
-}
-
-/**
- * Hide excluded fields from the $content variable in templates.
- */
-function field_wrapper_post_render($content, $element) {
- $instance = field_info_instance($element['#field_name'], $element['#bundle']);
- if (theme('field_exclude', $content, $instance, $element['#context'])) {
- return '';
- }
- return $content;
-}
-
-/**
- * 'Theme' function for a field's addition to the combined template output,
- * i.e. the node's $content or the user's $user_profile value.
- * This allows more flexibility in templates : you can use custom markup
- * around a few specific fields, and print the rest normally.
- *
- * This is a theme function, so it can be overridden in different
- * themes to produce different results.
- *
- * The html for individual fields and groups are available in the
- * $FIELD_NAME_rendered and $GROUP_NAME_rendered variables.
- *
- * @return
- * Whether or not the field's content is to be added in this context.
- * Uses the 'exclude' value from the field's display settings.
- */
-function theme_field_exclude($content, $object, $context) {
- if (empty($object['display'])
- || empty($object['display'][$context])
- || empty($object['display'][$context]['exclude'])) {
- return FALSE;
- }
- else {
- return TRUE;
- }
-}
-
-function field_default_preprocess($obj_type, $object, $field, $instance, &$items) {
- return array(
- $field['field_name'] . '_rendered' => isset($object->content[$field['field_name']]['#children']) ? $object->content[$field['field_name']]['#children'] : '',
- );
-}
-
-function field_default_prepare_translation($obj_type, $object, $field, $instance, &$items) {
- $addition = array();
- if (isset($object->translation_source->$field['field_name'])) {
- $addition[$field['field_name']] = $object->translation_source->$field['field_name'];
- }
- return $addition;
+<?php
+
+/**
+ * @file
+ *
+ * Default 'implementations' of hook_field_*().
+ *
+ * Handles common field housekeeping.
+ * Those implementations are special, as field.module does not define any field
+ * types. Those functions take care of default stuff common to all field types.
+ *
+ * Storage ops ('load', 'insert', 'update', 'delete', 'delete revisions')
+ * are not executed field by field, and are thus handled separately.
+ */
+
+function field_default_validate($obj_type, $object, $field, $instance, $items, $form) {
+ // TODO: here we could validate that required fields are filled in (for programmatic save)
+}
+
+function field_default_submit($obj_type, &$object, $field, $instance, &$items, $form, &$form_state) {
+ // Get field values from the submitted form values. Assigning them to $items
+ // populates $object->field_name when we return from _field_invoke_default().
+
+ // TODO D7: Allow the values to be form_altered to another location, like we
+ // do for the form definition ($form['#fields'][$field_name]['form_path']) ?
+
+ if (isset($form_state['values'][$field['field_name']])) {
+ $items = $form_state['values'][$field['field_name']];
+
+ // Remove the 'value' of the 'add more' button.
+ unset($items[$field['field_name'] . '_add_more']);
+
+ // TODO: the above should be moved to validate time (and values saved back
+ // using form_set_value() ), so that hook_field_validate() works on clean data.
+ // Not sure we'll want what's below in validate too.
+
+ // Reorder items to account for drag-n-drop reordering.
+ if (field_behaviors_widget('multiple values', $instance) == FIELD_BEHAVIOR_DEFAULT) {
+ $items = _field_sort_items($field, $items);
+ }
+
+ // Filter out empty values.
+ $items = field_set_empty($field, $items);
+
+ // _field_invoke() does not add back items for fields not present in the
+ // original $object, so add them manually.
+ $object->{$field['field_name']} = $items;
+ }
+ else {
+ // The form did not include this field, for instance because of access
+ // rules: make sure any existing value for the field stays unchanged.
+ unset($object->{$field['field_name']});
+ }
+}
+
+/**
+ * The 'view' operation constructs the $object in a way that you can use
+ * drupal_render() to display the formatted output for an individual field.
+ * i.e. print drupal_render($object->content['field_foo']);
+ *
+ * The code supports both single value formatters, which theme an individual
+ * item value, and multiple value formatters, which theme all values for the
+ * field in a single theme. The multiple value formatters could be used, for
+ * instance, to plot field values on a single map or display them in a graph.
+ * Single value formatters are the default, multiple value formatters can be
+ * designated as such in formatter_info().
+ *
+ * The $object array will look like:
+ * $object->content['field_foo']['wrapper'] = array(
+ * '#type' => 'field',
+ * '#title' => 'label'
+ * '#field_name' => 'field_name',
+ * '#object' => $object,
+ * '#object_type' => $obj_type,
+ * // Value of the $teaser param of hook_nodeapi('view').
+ * '#teaser' => $teaser,
+ * 'items' =>
+ * 0 => array(
+ * '#item' => $items[0],
+ * // Only for 'single-value' formatters
+ * '#theme' => $theme,
+ * '#field_name' => 'field_name',
+ * '#bundle' => $bundle,
+ * '#formatter' => $formatter_name,
+ * '#settings' => $formatter_settings,
+ * '#object' => $object,
+ * '#object_type' => $obj_type,
+ * '#delta' => 0,
+ * ),
+ * 1 => array(
+ * '#item' => $items[1],
+ * // Only for 'single-value' formatters
+ * '#theme' => $theme,
+ * '#field_name' => 'field_name',
+ * '#bundle' => $bundle_name,
+ * '#formatter' => $formatter_name,
+ * '#settings' => $formatter_settings,
+ * '#object' => $object,
+ * '#object_type' => $obj_type,
+ * '#delta' => 1,
+ * ),
+ * // Only for 'multiple-value' formatters
+ * '#theme' => $theme,
+ * '#field_name' => 'field_name',
+ * '#bundle' => $bundle_name,
+ * '#formatter' => $formatter_name,
+ * '#settings' => $formatter_settings,
+ * ),
+ * );
+ */
+function field_default_view($obj_type, $object, $field, $instance, $items, $teaser) {
+ list($id, $vid, $bundle) = field_attach_extract_ids($obj_type, $object);
+
+ $addition = array();
+
+ // Entities without build modes should provide a 'full' context.
+ // NODE_BUILD_NORMAL is 0, and ('whatever' == 0) is TRUE, so we need a ===.
+ if (!isset($object->build_mode)) {
+ $context = 'full';
+ }
+ elseif ($object->build_mode === NODE_BUILD_NORMAL
+ || $object->build_mode == NODE_BUILD_PREVIEW) {
+ $context = $teaser ? 'teaser' : 'full';
+ }
+ else {
+ $context = $object->build_mode;
+ }
+
+ // If we don't have specific settings for the current build_mode, we use the
+ // (required) 'full' build_mode.
+ $display = isset($instance['display'][$context]) ? $instance['display'][$context] : $instance['display']['full'];
+ // Ensure we have a valid formatter and formatter settings.
+ $display = _field_get_formatter($display, $field);
+
+ if ($display['type'] && $display['type'] !== 'hidden') {
+ $theme = 'field_formatter_' . $display['type'];
+ $single = (field_behaviors_formatter('multiple values', $display) == FIELD_BEHAVIOR_DEFAULT);
+
+ $label_display = $display['label'];
+ if (isset($object->build_mode) && $object->build_mode == NODE_BUILD_SEARCH_INDEX) {
+ $label_display = 'hidden';
+ }
+
+ $info = array(
+ '#field_name' => $field['field_name'],
+ '#bundle' => $bundle,
+ '#object' => $object,
+ '#object_type' => $obj_type,
+ );
+
+ $element = $info + array(
+ '#theme' => 'field',
+ '#title' => check_plain(t($instance['label'])),
+ '#access' => field_access('view', $field),
+ '#label_display' => $label_display,
+ '#teaser' => $teaser,
+ '#single' => $single,
+ 'items' => array(),
+ );
+
+ // Fill-in items.
+ foreach ($items as $delta => $item) {
+ $element['items'][$delta] = array(
+ '#item' => $item,
+ '#weight' => $delta,
+ );
+ }
+
+ // Append formatter information either on each item ('single-value' formatter)
+ // or at the upper 'items' level ('multiple-value' formatter)
+ $format_info = $info + array(
+ '#formatter' => $display['type'],
+ '#settings' => $display['settings'],
+ '#theme_wrapper' => $theme,
+ );
+
+ if ($single) {
+ foreach ($items as $delta => $item) {
+ $element['items'][$delta] += $format_info;
+ $element['items'][$delta]['#item']['#delta'] = $delta;
+ }
+ }
+ else {
+ $element['items'] += $format_info;
+ }
+
+ // The wrapper lets us get the themed output for the whole field
+ // to populate the $FIELD_NAME_rendered variable for templates,
+ // and hide it from the $content variable if needed.
+ // See 'preprocess' op and theme_content_field_wrapper()?
+ $wrapper = $info + array(
+ 'field' => $element,
+ '#weight' => $instance['weight'],
+ '#post_render' => array('field_wrapper_post_render'),
+ '#context' => $context,
+ );
+
+ $addition = array($field['field_name'] => $wrapper);
+ }
+ return $addition;
+}
+
+/**
+ * Hide excluded fields from the $content variable in templates.
+ */
+function field_wrapper_post_render($content, $element) {
+ $instance = field_info_instance($element['#field_name'], $element['#bundle']);
+ if (theme('field_exclude', $content, $instance, $element['#context'])) {
+ return '';
+ }
+ return $content;
+}
+
+/**
+ * 'Theme' function for a field's addition to the combined template output,
+ * i.e. the node's $content or the user's $user_profile value.
+ * This allows more flexibility in templates : you can use custom markup
+ * around a few specific fields, and print the rest normally.
+ *
+ * This is a theme function, so it can be overridden in different
+ * themes to produce different results.
+ *
+ * The html for individual fields and groups are available in the
+ * $FIELD_NAME_rendered and $GROUP_NAME_rendered variables.
+ *
+ * @return
+ * Whether or not the field's content is to be added in this context.
+ * Uses the 'exclude' value from the field's display settings.
+ */
+function theme_field_exclude($content, $object, $context) {
+ if (empty($object['display'])
+ || empty($object['display'][$context])
+ || empty($object['display'][$context]['exclude'])) {
+ return FALSE;
+ }
+ else {
+ return TRUE;
+ }
+}
+
+function field_default_preprocess($obj_type, $object, $field, $instance, &$items) {
+ return array(
+ $field['field_name'] . '_rendered' => isset($object->content[$field['field_name']]['#children']) ? $object->content[$field['field_name']]['#children'] : '',
+ );
+}
+
+function field_default_prepare_translation($obj_type, $object, $field, $instance, &$items) {
+ $addition = array();
+ if (isset($object->translation_source->$field['field_name'])) {
+ $addition[$field['field_name']] = $object->translation_source->$field['field_name'];
+ }
+ return $addition;
} \ No newline at end of file