summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--modules/field/field.api.php65
-rw-r--r--modules/field/field.form.inc9
2 files changed, 74 insertions, 0 deletions
diff --git a/modules/field/field.api.php b/modules/field/field.api.php
index 9b3ebf0f5..415e8935c 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 d5778dfc5..474cc7f5b 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)) {