diff --git a/modules/field/field.api.php b/modules/field/field.api.php index 9b3ebf0f5441930f97b3e7df8b92f1093c590193..415e8935c6aa1be3274cc038caf7ce1c92e24402 100644 --- a/modules/field/field.api.php +++ b/modules/field/field.api.php @@ -2178,6 +2178,71 @@ function hook_field_extra_fields_display_alter(&$displays, $context) { $displays['description']['visibility'] = FALSE; } } + +/** + * Alters the widget properties of a field instance before it gets displayed. + * + * Note that instead of hook_field_widget_properties_alter(), which is called + * for all fields on all entity types, + * hook_field_widget_properties_ENTITY_TYPE_alter() may be used to alter widget + * properties for fields on a specific entity type only. + * + * This hook is called once per field per added or edit entity. If the result + * of the hook involves reading from the database, it is highly recommended to + * statically cache the information. + * + * @param $widget + * The instance's widget properties. + * @param $context + * An associative array containing: + * - entity_type: The entity type; e.g. 'node' or 'user'. + * - entity: The entity object. + * - field: The field that the widget belongs to. + * - instance: The instance of the field. + * + * @see hook_field_widget_properties_ENTITY_TYPE_alter() + */ +function hook_field_widget_properties_alter(&$widget, $context) { + // Change a widget's type according to the time of day. + $field = $context['field']; + if ($context['entity_type'] == 'node' && $field['field_name'] == 'field_foo') { + $time = date('H'); + $widget['type'] = $time < 12 ? 'widget_am' : 'widget_pm'; + } +} + +/** + * Alters the widget properties of a field instance on a given entity type + * before it gets displayed. + * + * Modules can implement hook_field_widget_properties_ENTITY_TYPE_alter() to + * alter the widget properties for fields on a specific entity type, rather than + * implementing hook_field_widget_properties_alter(). + * + * This hook is called once per field per displayed widget entity. If the result + * of the hook involves reading from the database, it is highly recommended to + * statically cache the information. + * + * @param $widget + * The instance's widget properties. + * @param $context + * An associative array containing: + * - entity_type: The entity type; e.g. 'node' or 'user'. + * - entity: The entity object. + - field: The field that the widget belongs to. + * - instance: The instance of the field. + * + * @see hook_field_widget_properties_alter() + */ +function hook_field_widget_properties_ENTITY_TYPE_alter(&$widget, $context) { + // Change a widget's type according to the time of day. + $field = $context['field']; + if ($field['field_name'] == 'field_foo') { + $time = date('H'); + $widget['type'] = $time < 12 ? 'widget_am' : 'widget_pm'; + } +} + /** * @} End of "ingroup field_storage" */ diff --git a/modules/field/field.form.inc b/modules/field/field.form.inc index d5778dfc56843d61976bf6b07f980c9100f105d1..474cc7f5b752d9d18fa2b72964ed99787f113737 100644 --- a/modules/field/field.form.inc +++ b/modules/field/field.form.inc @@ -25,6 +25,15 @@ function field_default_form($entity_type, $entity, $field, $instance, $langcode, $items = field_get_default_value($entity_type, $entity, $field, $instance, $langcode); } + // Let modules alter the widget properties. + $context = array( + 'entity_type' => $entity_type, + 'entity' => $entity, + 'field' => $field, + 'instance' => $instance, + ); + drupal_alter(array('field_widget_properties', 'field_widget_properties_' . $entity_type), $instance['widget'], $context); + // Collect widget elements. $elements = array(); if (field_access('edit', $field, $entity_type, $entity)) {