.../Plugin/field/widget/DatetimeDatelistWidget.php | 47 ++-------- .../Plugin/field/widget/DatetimeDefaultWidget.php | 32 ++----- .../entity_reference/entity_reference.module | 17 ++-- .../EntityReferenceAutocomplete.php | 3 +- .../entity_reference/EntityReferenceController.php | 3 +- .../Plugin/Derivative/SelectionBase.php | 2 +- .../Plugin/Type/Selection/SelectionBroken.php | 5 +- .../Plugin/Type/SelectionPluginManager.php | 6 +- .../entity_reference/selection/SelectionBase.php | 33 ++----- .../Plugin/field/widget/AutocompleteTagsWidget.php | 10 +- .../Plugin/field/widget/AutocompleteWidget.php | 10 +- .../Plugin/field/widget/AutocompleteWidgetBase.php | 13 ++- .../Tests/EntityReferenceSelectionAccessTest.php | 48 ++++------ .../Tests/EntityReferenceSelectionSortTest.php | 17 ++-- core/modules/field/field.form.inc | 45 ++------- .../lib/Drupal/field/Plugin/Core/Entity/Field.php | 16 +++- .../field/Plugin/Core/Entity/FieldInstance.php | 3 +- .../field/Plugin/Type/Formatter/FormatterBase.php | 2 +- .../Drupal/field/Plugin/Type/Widget/WidgetBase.php | 96 +++++++------------- .../field/Plugin/Type/Widget/WidgetFactory.php | 9 +- .../field/Plugin/Type/Widget/WidgetInterface.php | 9 +- .../lib/Drupal/field/Plugin/views/field/Field.php | 2 +- .../tests/modules/field_test/field_test.field.inc | 4 +- .../tests/modules/field_test/field_test.module | 14 ++- .../Drupal/field_ui/Form/FieldInstanceEditForm.php | 6 +- core/modules/file/file.field.inc | 43 ++++----- core/modules/file/file.module | 2 +- .../Drupal/file/Plugin/field/widget/FileWidget.php | 38 ++++---- core/modules/image/image.field.inc | 4 +- .../image/Plugin/field/widget/ImageWidget.php | 12 +-- .../Drupal/link/Plugin/field/widget/LinkWidget.php | 8 +- .../number/Plugin/field/widget/NumberWidget.php | 31 +++---- .../options/Plugin/field/widget/OnOffWidget.php | 2 +- .../Plugin/field/widget/OptionsWidgetBase.php | 14 +-- core/modules/options/options.api.php | 12 +-- core/modules/options/options.module | 17 ++-- .../field/widget/TaxonomyAutocompleteWidget.php | 15 ++- core/modules/taxonomy/taxonomy.module | 18 ++-- .../text/Plugin/field/widget/TextareaWidget.php | 8 +- .../field/widget/TextareaWithSummaryWidget.php | 8 +- .../text/Plugin/field/widget/TextfieldWidget.php | 10 +- 41 files changed, 282 insertions(+), 412 deletions(-) diff --git a/core/modules/datetime/lib/Drupal/datetime/Plugin/field/widget/DatetimeDatelistWidget.php b/core/modules/datetime/lib/Drupal/datetime/Plugin/field/widget/DatetimeDatelistWidget.php index 366a4c4..1e9b0a6 100644 --- a/core/modules/datetime/lib/Drupal/datetime/Plugin/field/widget/DatetimeDatelistWidget.php +++ b/core/modules/datetime/lib/Drupal/datetime/Plugin/field/widget/DatetimeDatelistWidget.php @@ -12,7 +12,6 @@ use Drupal\Component\Plugin\Discovery\DiscoveryInterface; use Drupal\Core\Entity\EntityInterface; use Drupal\field\Plugin\PluginSettingsBase; -use Drupal\field\Plugin\Core\Entity\FieldInstance; use Drupal\Core\Datetime\DrupalDateTime; use Drupal\datetime\DateHelper; @@ -36,23 +35,12 @@ class DateTimeDatelistWidget extends WidgetBase { /** - * Constructs a DateTimeDatelist Widget object. - * - * @param array $plugin_id - * The plugin_id for the widget. - * @param array $plugin_definition - * The plugin implementation definition. - * @param \Drupal\field\Plugin\Core\Entity\FieldInstance $instance - * The field instance to which the widget is associated. - * @param array $settings - * The widget settings. - * @param int $weight - * The widget weight. + * {@inheritdoc} */ - public function __construct($plugin_id, array $plugin_definition, FieldInstance $instance, array $settings, $weight) { + public function __construct($plugin_id, array $plugin_definition, array $field_definition, array $settings, $weight) { // Identify the function used to set the default value. - $instance['default_value_function'] = $this->defaultValueFunction(); - parent::__construct($plugin_id, $plugin_definition, $instance, $settings, $weight); + $field_definition['default_value_function'] = $this->defaultValueFunction(); + parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $weight); } /** @@ -66,13 +54,9 @@ public function defaultValueFunction() { } /** - * Implements \Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement(). + * {@inheritdoc} */ public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) { - - $field = $this->field; - $instance = $this->instance; - $date_order = $this->getSetting('date_order'); $time_type = $this->getSetting('time_type'); $increment = $this->getSetting('increment'); @@ -89,7 +73,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr $element['#element_validate'][] = 'datetime_datelist_widget_validate'; // Identify the type of date and time elements to use. - switch ($field['settings']['datetime_type']) { + switch ($this->field_definition['settings']['datetime_type']) { case 'date': $storage_format = DATETIME_DATE_STORAGE_FORMAT; $type_type = 'none'; @@ -137,7 +121,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr ); // Set the storage and widget options so the validation can use them. The - // validator will not have access to field or instance settings. + // validator will not have access to the field definition. $element['value']['#date_storage_format'] = $storage_format; if (!empty($items[$delta]['date'])) { @@ -145,7 +129,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr // The date was created and verified during field_load(), so it is safe to // use without further inspection. $date->setTimezone( new \DateTimeZone($element['value']['#date_timezone'])); - if ($field['settings']['datetime_type'] == 'date') { + if ($this->field_definition['settings']['datetime_type'] == 'date') { // A date without time will pick up the current time, use the default // time. datetime_date_default_time($date); @@ -156,22 +140,11 @@ public function formElement(array $items, $delta, array $element, $langcode, arr } /** - * - * - * @param array $form - * The form definition as an array. - * @param array $form_state - * The current state of the form as an array. - * - * @return array - * + * {@inheritdoc} */ function settingsForm(array $form, array &$form_state) { $element = parent::settingsForm($form, $form_state); - $field = $this->field; - $instance = $this->instance; - $element['date_order'] = array( '#type' => 'select', '#title' => t('Date part order'), @@ -179,7 +152,7 @@ function settingsForm(array $form, array &$form_state) { '#options' => array('MDY' => t('Month/Day/Year'), 'DMY' => t('Day/Month/Year'), 'YMD' => t('Year/Month/Day')), ); - if ($field['settings']['datetime_type'] == 'datetime') { + if ($this->field_definition['settings']['datetime_type'] == 'datetime') { $element['time_type'] = array( '#type' => 'select', '#title' => t('Time type'), diff --git a/core/modules/datetime/lib/Drupal/datetime/Plugin/field/widget/DatetimeDefaultWidget.php b/core/modules/datetime/lib/Drupal/datetime/Plugin/field/widget/DatetimeDefaultWidget.php index d51bac4..1d8f8e6 100644 --- a/core/modules/datetime/lib/Drupal/datetime/Plugin/field/widget/DatetimeDefaultWidget.php +++ b/core/modules/datetime/lib/Drupal/datetime/Plugin/field/widget/DatetimeDefaultWidget.php @@ -12,7 +12,6 @@ use Drupal\Component\Plugin\Discovery\DiscoveryInterface; use Drupal\Core\Entity\EntityInterface; use Drupal\field\Plugin\PluginSettingsBase; -use Drupal\field\Plugin\Core\Entity\FieldInstance; use Drupal\Core\Datetime\DrupalDateTime; /** @@ -30,23 +29,12 @@ class DateTimeDefaultWidget extends WidgetBase { /** - * Constructs a DateTimeDefault Widget object. - * - * @param array $plugin_id - * The plugin_id for the widget. - * @param array $plugin_definition - * The plugin implementation definition. - * @param \Drupal\field\Plugin\Core\Entity\FieldInstance $instance - * The field instance to which the widget is associated. - * @param array $settings - * The widget settings. - * @param int $weight - * The widget weight. + * {@inheritdoc} */ - public function __construct($plugin_id, array $plugin_definition, FieldInstance $instance, array $settings, $weight) { + public function __construct($plugin_id, array $plugin_definition, array $field_definition, array $settings, $weight) { // Identify the function used to set the default value. - $instance['default_value_function'] = $this->defaultValueFunction(); - parent::__construct($plugin_id, $plugin_definition, $instance, $settings, $weight); + $field_definition['default_value_function'] = $this->defaultValueFunction(); + parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $weight); } /** @@ -60,13 +48,9 @@ public function defaultValueFunction() { } /** - * Implements \Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement(). - * + * {@inheritdoc} */ public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) { - - $field = $this->field; - $instance = $this->instance; $format_type = datetime_default_format_type(); // We are nesting some sub-elements inside the parent, so we need a wrapper. @@ -80,7 +64,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr $element['#element_validate'][] = 'datetime_datetime_widget_validate'; // Identify the type of date and time elements to use. - switch ($field['settings']['datetime_type']) { + switch ($this->field_definition['settings']['datetime_type']) { case 'date': $date_type = 'date'; $time_type = 'none'; @@ -115,7 +99,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr ); // Set the storage and widget options so the validation can use them. The - // validator will not have access to field or instance settings. + // validator will not have access to the field definition. $element['value']['#date_element_format'] = $element_format; $element['value']['#date_storage_format'] = $storage_format; @@ -124,7 +108,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr // The date was created and verified during field_load(), so it is safe to // use without further inspection. $date->setTimezone(new \DateTimeZone($element['value']['#date_timezone'])); - if ($field['settings']['datetime_type'] == 'date') { + if ($this->field_definition['settings']['datetime_type'] == 'date') { // A date without time will pick up the current time, use the default // time. datetime_date_default_time($date); diff --git a/core/modules/entity_reference/entity_reference.module b/core/modules/entity_reference/entity_reference.module index 3c68c46..f8f1b5b 100644 --- a/core/modules/entity_reference/entity_reference.module +++ b/core/modules/entity_reference/entity_reference.module @@ -80,10 +80,9 @@ function entity_reference_field_widget_info_alter(&$info) { * * @return \Drupal\entity_reference\Plugin\Type\Selection\SelectionInterface */ -function entity_reference_get_selection_handler($field, $instance, EntityInterface $entity = NULL) { +function entity_reference_get_selection_handler(array $field_definition, EntityInterface $entity = NULL) { $options = array( - 'field' => $field, - 'instance' => $instance, + 'field_definition' => $field_definition, 'entity' => $entity, ); return drupal_container()->get('plugin.manager.entity_reference.selection')->getInstance($options); @@ -149,7 +148,8 @@ function entity_reference_field_validate(EntityInterface $entity = NULL, $field, } if ($ids) { - $valid_ids = entity_reference_get_selection_handler($field, $instance, $entity)->validateReferencableEntities(array_keys($ids)); + $field_definition = $field->getFieldDefinition($instance); + $valid_ids = entity_reference_get_selection_handler($field_definition, $entity)->validateReferencableEntities(array_keys($ids)); $invalid_entities = array_diff_key($ids, array_flip($valid_ids)); if ($invalid_entities) { @@ -290,7 +290,8 @@ function entity_reference_field_instance_settings_form($field, $instance, $form_ '#attributes' => array('class' => array('entity_reference-settings')), ); - $handler = entity_reference_get_selection_handler($field, $instance); + $field_definition = $field->getFieldDefinition($instance); + $handler = entity_reference_get_selection_handler($field_definition); $form['handler']['handler_settings'] += $handler->settingsForm($field, $instance); return $form; @@ -386,13 +387,13 @@ function entity_reference_settings_ajax_submit($form, &$form_state) { /** * Implements hook_options_list(). */ -function entity_reference_options_list($field, $instance, $entity_type = NULL, $entity = NULL) { - if (!$options = entity_reference_get_selection_handler($field, $instance, $entity)->getReferencableEntities()) { +function entity_reference_options_list(array $field_definition, $entity_type = NULL, $entity = NULL) { + if (!$options = entity_reference_get_selection_handler($field_definition, $entity)->getReferencableEntities()) { return array(); } // Rebuild the array by changing the bundle key into the bundle label. - $target_type = $field['settings']['target_type']; + $target_type = $field_definition['settings']['target_type']; $bundles = entity_get_bundles($target_type); $return = array(); diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/EntityReferenceAutocomplete.php b/core/modules/entity_reference/lib/Drupal/entity_reference/EntityReferenceAutocomplete.php index b3fe3a0..221b4cb 100644 --- a/core/modules/entity_reference/lib/Drupal/entity_reference/EntityReferenceAutocomplete.php +++ b/core/modules/entity_reference/lib/Drupal/entity_reference/EntityReferenceAutocomplete.php @@ -71,7 +71,8 @@ public function getMatches($field, $instance, $entity_type, $entity_id = '', $pr throw new AccessDeniedHttpException(); } } - $handler = entity_reference_get_selection_handler($field, $instance, $entity); + $field_definition = $field->getFieldDefinition($instance); + $handler = entity_reference_get_selection_handler($field_definition, $entity); if (isset($string)) { // Get an array of matching entities. diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/EntityReferenceController.php b/core/modules/entity_reference/lib/Drupal/entity_reference/EntityReferenceController.php index 1301dc3..ff76de2 100644 --- a/core/modules/entity_reference/lib/Drupal/entity_reference/EntityReferenceController.php +++ b/core/modules/entity_reference/lib/Drupal/entity_reference/EntityReferenceController.php @@ -77,7 +77,8 @@ public function handleAutocomplete(Request $request, $type, $field_name, $entity throw new AccessDeniedHttpException(); } - if ($field['type'] != 'entity_reference' || !field_access('edit', $field, $entity_type)) { + $field_definition = $field->getFieldDefinition($instance); + if ($field['type'] != 'entity_reference' || !field_access('edit', $field_definition, $entity_type)) { throw new AccessDeniedHttpException(); } diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Derivative/SelectionBase.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Derivative/SelectionBase.php index 9e191bf..55dfe97 100644 --- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Derivative/SelectionBase.php +++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Derivative/SelectionBase.php @@ -46,7 +46,7 @@ public function getDerivativeDefinitions(array $base_plugin_definition) { foreach (entity_get_info() as $entity_type => $info) { if (!in_array($entity_type, $supported_entities)) { $this->derivatives[$entity_type] = $base_plugin_definition; - $this->derivatives[$entity_type]['label'] = t('@enitty_type selection', array('@entity_type' => $info['label'])); + $this->derivatives[$entity_type]['label'] = t('@entity_type selection', array('@entity_type' => $info['label'])); } } return $this->derivatives; diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Type/Selection/SelectionBroken.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Type/Selection/SelectionBroken.php index 31c1cb1..29e4d87 100644 --- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Type/Selection/SelectionBroken.php +++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Type/Selection/SelectionBroken.php @@ -17,9 +17,8 @@ class SelectionBroken implements SelectionInterface { /** * Constructs a SelectionBroken object. */ - public function __construct($field, $instance = NULL) { - $this->field = $field; - $this->instance = $instance; + public function __construct($field_definition) { + $this->field_definition = $field_definition; } /** diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Type/SelectionPluginManager.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Type/SelectionPluginManager.php index bd140a9..432b72b 100644 --- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Type/SelectionPluginManager.php +++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Type/SelectionPluginManager.php @@ -42,7 +42,7 @@ public function createInstance($plugin_id, array $configuration = array()) { return parent::createInstance($plugin_id, $configuration); } catch (PluginException $e) { - return new SelectionBroken($configuration['field'], $configuration['instance']); + return new SelectionBroken($configuration['field_definition']); } } @@ -50,8 +50,8 @@ public function createInstance($plugin_id, array $configuration = array()) { * Overrides \Drupal\Component\Plugin\PluginManagerBase::getInstance(). */ public function getInstance(array $options) { - $selection_handler = $options['instance']['settings']['handler']; - $target_entity_type = $options['field']['settings']['target_type']; + $selection_handler = $options['field_definition']['settings']['handler']; + $target_entity_type = $options['field_definition']['settings']['target_type']; // Get all available selection plugins for this entity type. $selection_handler_groups = $this->getSelectionGroups($target_entity_type); diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/entity_reference/selection/SelectionBase.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/entity_reference/selection/SelectionBase.php index ab60905..757b0d8 100644 --- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/entity_reference/selection/SelectionBase.php +++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/entity_reference/selection/SelectionBase.php @@ -30,20 +30,6 @@ class SelectionBase implements SelectionInterface { /** - * The field array. - * - * @var array - */ - protected $field; - - /** - * The instance array. - * - * @var array - */ - protected $instance; - - /** * The entity object, or NULL * * @var NULL|EntityInterface @@ -53,9 +39,8 @@ class SelectionBase implements SelectionInterface { /** * Constructs a SelectionBase object. */ - public function __construct($field, $instance, EntityInterface $entity = NULL) { - $this->field = $field; - $this->instance = $instance; + public function __construct(array $field_definition, EntityInterface $entity = NULL) { + $this->field_definition = $field_definition; $this->entity = $entity; } @@ -165,7 +150,7 @@ public static function settingsForm(&$field, &$instance) { * Implements SelectionInterface::getReferencableEntities(). */ public function getReferencableEntities($match = NULL, $match_operator = 'CONTAINS', $limit = 0) { - $target_type = $this->field['settings']['target_type']; + $target_type = $this->field_definition['settings']['target_type']; $query = $this->buildEntityQuery($match, $match_operator); if ($limit > 0) { @@ -204,7 +189,7 @@ public function countReferencableEntities($match = NULL, $match_operator = 'CONT public function validateReferencableEntities(array $ids) { $result = array(); if ($ids) { - $target_type = $this->field['settings']['target_type']; + $target_type = $this->field_definition['settings']['target_type']; $entity_info = entity_get_info($target_type); $query = $this->buildEntityQuery(); $result = $query @@ -264,7 +249,7 @@ public function validateAutocompleteInput($input, &$element, &$form_state, $form * it. */ public function buildEntityQuery($match = NULL, $match_operator = 'CONTAINS') { - $target_type = $this->field['settings']['target_type']; + $target_type = $this->field_definition['settings']['target_type']; $entity_info = entity_get_info($target_type); $query = \Drupal::entityQuery($target_type); @@ -277,17 +262,17 @@ public function buildEntityQuery($match = NULL, $match_operator = 'CONTAINS') { } // Add entity-access tag. - $query->addTag($this->field['settings']['target_type'] . '_access'); + $query->addTag($this->field_definition['settings']['target_type'] . '_access'); // Add the Selection handler for // entity_reference_query_entity_reference_alter(). $query->addTag('entity_reference'); - $query->addMetaData('field', $this->field); + $query->addMetaData('field_definition', $this->field_definition); $query->addMetaData('entity_reference_selection_handler', $this); // Add the sort option. - if (!empty($this->instance['settings']['handler_settings']['sort'])) { - $sort_settings = $this->instance['settings']['handler_settings']['sort']; + if (!empty($this->field_definition['settings']['handler_settings']['sort'])) { + $sort_settings = $this->field_definition['settings']['handler_settings']['sort']; if ($sort_settings['field'] != '_none') { $query->sort($sort_settings['field'], $sort_settings['direction']); } diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteTagsWidget.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteTagsWidget.php index a88f2ea..0e4664f 100644 --- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteTagsWidget.php +++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteTagsWidget.php @@ -34,14 +34,14 @@ class AutocompleteTagsWidget extends AutocompleteWidgetBase { /** - * Overrides \Drupal\entity_reference\Plugin\field\widget\AutocompleteWidgetBase::elementValidate() + * {@inheritdoc} */ public function elementValidate($element, &$form_state, $form) { $value = array(); // If a value was entered into the autocomplete. - $handler = entity_reference_get_selection_handler($this->field, $this->instance); - $bundles = entity_get_bundles($this->field['settings']['target_type']); - $auto_create = isset($this->instance['settings']['handler_settings']['auto_create']) ? $this->instance['settings']['handler_settings']['auto_create'] : FALSE; + $handler = entity_reference_get_selection_handler($this->field_definition); + $bundles = entity_get_bundles($this->field_definition['settings']['target_type']); + $auto_create = isset($this->field_definition['settings']['handler_settings']['auto_create']) ? $this->field_definition['settings']['handler_settings']['auto_create'] : FALSE; if (!empty($element['#value'])) { $entities = drupal_explode_tags($element['#value']); @@ -62,7 +62,7 @@ public function elementValidate($element, &$form_state, $form) { if ($match) { $value[] = array('target_id' => $match); } - elseif ($auto_create && (count($this->instance['settings']['handler_settings']['target_bundles']) == 1 || count($bundles) == 1)) { + elseif ($auto_create && (count($this->field_definition['settings']['handler_settings']['target_bundles']) == 1 || count($bundles) == 1)) { // Auto-create item. see entity_reference_field_presave(). $value[] = array('target_id' => 'auto_create', 'label' => $entity); } diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidget.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidget.php index 57c4b7b..db8e9cd 100644 --- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidget.php +++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidget.php @@ -38,7 +38,7 @@ class AutocompleteWidget extends AutocompleteWidgetBase { /** - * Overrides \Drupal\entity_reference\Plugin\field\widget\AutocompleteWidgetBase::formElement(). + * {@inheritdoc} */ public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) { // We let the Field API handles multiple values for us, only take care of @@ -54,10 +54,10 @@ public function formElement(array $items, $delta, array $element, $langcode, arr } /** - * Overrides \Drupal\entity_reference\Plugin\field\widget\AutocompleteWidgetBase::elementValidate() + * {@inheritdoc} */ public function elementValidate($element, &$form_state, $form) { - $auto_create = isset($this->instance['settings']['handler_settings']['auto_create']) ? $this->instance['settings']['handler_settings']['auto_create'] : FALSE; + $auto_create = isset($this->field_definition['settings']['handler_settings']['auto_create']) ? $this->field_definition['settings']['handler_settings']['auto_create'] : FALSE; // If a value was entered into the autocomplete. $value = ''; @@ -69,11 +69,11 @@ public function elementValidate($element, &$form_state, $form) { else { // Try to get a match from the input string when the user didn't use the // autocomplete but filled in a value manually. - $handler = entity_reference_get_selection_handler($this->field, $this->instance); + $handler = entity_reference_get_selection_handler($this->field_definition); $value = $handler->validateAutocompleteInput($element['#value'], $element, $form_state, $form, !$auto_create); } - if (!$value && $auto_create && (count($this->instance['settings']['handler_settings']['target_bundles']) == 1)) { + if (!$value && $auto_create && (count($this->field_definition['settings']['handler_settings']['target_bundles']) == 1)) { // Auto-create item. see entity_reference_field_presave(). $value = array( 'target_id' => 'auto_create', diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidgetBase.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidgetBase.php index 6a8df6f..9d52a85 100644 --- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidgetBase.php +++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/field/widget/AutocompleteWidgetBase.php @@ -17,7 +17,7 @@ abstract class AutocompleteWidgetBase extends WidgetBase { /** - * Overrides \Drupal\field\Plugin\Type\Widget\WidgetBase::settingsForm(). + * {@inheritdoc} */ public function settingsForm(array $form, array &$form_state) { $element['match_operator'] = array( @@ -50,16 +50,15 @@ public function settingsForm(array $form, array &$form_state) { } /** - * Implements \Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement(). + * {@inheritdoc} */ public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) { - $instance = $this->instance; - $field = $this->field; + $field_definition = $this->field_definition; $entity = isset($element['#entity']) ? $element['#entity'] : NULL; // Prepare the autocomplete path. $autocomplete_path = $this->getSetting('autocomplete_path'); - $autocomplete_path .= '/' . $field['field_name'] . '/' . $instance['entity_type'] . '/' . $instance['bundle'] . '/'; + $autocomplete_path .= '/' . $field_definition['field_name'] . '/' . $field_definition['entity_type'] . '/' . $field_definition['bundle'] . '/'; // Use as a placeholder in the URL when we don't have an entity. // Most web servers collapse two consecutive slashes. @@ -83,7 +82,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr } /** - * Overrides \Drupal\field\Plugin\Type\Widget\WidgetBase::errorElement(). + * {@inheritdoc} */ public function errorElement(array $element, array $error, array $form, array &$form_state) { return $element['target_id']; @@ -107,7 +106,7 @@ protected function getLabels(array $items) { } // Load those entities and loop through them to extract their labels. - $entities = entity_load_multiple($this->field['settings']['target_type'], $entity_ids); + $entities = entity_load_multiple($this->field_definition['settings']['target_type'], $entity_ids); foreach ($entities as $entity_id => $entity_item) { $label = $entity_item->label(); diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionAccessTest.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionAccessTest.php index cf1c619..849a16d 100644 --- a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionAccessTest.php +++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionAccessTest.php @@ -31,8 +31,8 @@ function setUp() { $this->drupalCreateContentType(array('type' => 'article', 'name' => 'Article')); } - protected function assertReferencable($field, $instance, $tests, $handler_name) { - $handler = entity_reference_get_selection_handler($field, $instance); + protected function assertReferencable(array $field_definition, $tests, $handler_name) { + $handler = entity_reference_get_selection_handler($field_definition); foreach ($tests as $test) { foreach ($test['arguments'] as $arguments) { @@ -57,19 +57,15 @@ protected function assertReferencable($field, $instance, $tests, $handler_name) * Test the node-specific overrides of the entity handler. */ public function testNodeHandler() { - // Build a fake field instance. - $field = array( + // Build a fake field definition. + $field_definition = array( 'translatable' => FALSE, 'entity_types' => array(), - 'settings' => array( - 'target_type' => 'node', - ), 'field_name' => 'test_field', 'type' => 'entity_reference', 'cardinality' => '1', - ); - $instance = array( 'settings' => array( + 'target_type' => 'node', 'handler' => 'default', 'handler_settings' => array( 'target_bundles' => array(), @@ -159,7 +155,7 @@ public function testNodeHandler() { 'result' => array(), ), ); - $this->assertReferencable($field, $instance, $referencable_tests, 'Node handler'); + $this->assertReferencable($field_definition, $referencable_tests, 'Node handler'); // Test as an admin. $admin_user = $this->drupalCreateUser(array('access content', 'bypass node access')); @@ -188,26 +184,22 @@ public function testNodeHandler() { ), ), ); - $this->assertReferencable($field, $instance, $referencable_tests, 'Node handler (admin)'); + $this->assertReferencable($field_definition, $referencable_tests, 'Node handler (admin)'); } /** * Test the user-specific overrides of the entity handler. */ public function testUserHandler() { - // Build a fake field instance. - $field = array( + // Build a fake field definition. + $field_definition = array( 'translatable' => FALSE, 'entity_types' => array(), - 'settings' => array( - 'target_type' => 'user', - ), 'field_name' => 'test_field', 'type' => 'entity_reference', 'cardinality' => '1', - ); - $instance = array( 'settings' => array( + 'target_type' => 'user', 'handler' => 'default', 'handler_settings' => array( 'target_bundles' => array(), @@ -289,7 +281,7 @@ public function testUserHandler() { 'result' => array(), ), ); - $this->assertReferencable($field, $instance, $referencable_tests, 'User handler'); + $this->assertReferencable($field_definition, $referencable_tests, 'User handler'); $GLOBALS['user'] = $users['admin']; $referencable_tests = array( @@ -328,26 +320,22 @@ public function testUserHandler() { ), ), ); - $this->assertReferencable($field, $instance, $referencable_tests, 'User handler (admin)'); + $this->assertReferencable($field_definition, $referencable_tests, 'User handler (admin)'); } /** * Test the comment-specific overrides of the entity handler. */ public function testCommentHandler() { - // Build a fake field instance. - $field = array( + // Build a fake field definition. + $field_definition = array( 'translatable' => FALSE, 'entity_types' => array(), - 'settings' => array( - 'target_type' => 'comment', - ), 'field_name' => 'test_field', 'type' => 'entity_reference', 'cardinality' => '1', - ); - $instance = array( 'settings' => array( + 'target_type' => 'comment', 'handler' => 'default', 'handler_settings' => array( 'target_bundles' => array(), @@ -453,7 +441,7 @@ public function testCommentHandler() { 'result' => array(), ), ); - $this->assertReferencable($field, $instance, $referencable_tests, 'Comment handler'); + $this->assertReferencable($field_definition, $referencable_tests, 'Comment handler'); // Test as a comment admin. $admin_user = $this->drupalCreateUser(array('access content', 'access comments', 'administer comments')); @@ -471,7 +459,7 @@ public function testCommentHandler() { ), ), ); - $this->assertReferencable($field, $instance, $referencable_tests, 'Comment handler (comment admin)'); + $this->assertReferencable($field_definition, $referencable_tests, 'Comment handler (comment admin)'); // Test as a node and comment admin. $admin_user = $this->drupalCreateUser(array('access content', 'access comments', 'administer comments', 'bypass node access')); @@ -490,6 +478,6 @@ public function testCommentHandler() { ), ), ); - $this->assertReferencable($field, $instance, $referencable_tests, 'Comment handler (comment + node admin)'); + $this->assertReferencable($field_definition, $referencable_tests, 'Comment handler (comment + node admin)'); } } diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionSortTest.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionSortTest.php index d3245e0..a20c3b7 100644 --- a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionSortTest.php +++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceSelectionSortTest.php @@ -54,20 +54,15 @@ public function testSort() { field_create_instance($instance_info); - // Build a fake field instance. - $field = array( + // Build a fake field definition. + $field_definition = array( 'translatable' => FALSE, 'entity_types' => array(), - 'settings' => array( - 'target_type' => 'node', - ), 'field_name' => 'test_field', 'type' => 'entity_reference', 'cardinality' => 1, - ); - - $instance = array( 'settings' => array( + 'target_type' => 'node', 'handler' => 'default', 'handler_settings' => array( 'target_bundles' => array(), @@ -119,7 +114,7 @@ public function testSort() { $normal_user = $this->drupalCreateUser(array('access content')); $GLOBALS['user'] = $normal_user; - $handler = entity_reference_get_selection_handler($field, $instance); + $handler = entity_reference_get_selection_handler($field_definition); // Not only assert the result, but make sure the keys are sorted as // expected. @@ -131,11 +126,11 @@ public function testSort() { $this->assertIdentical($result['article'], $expected_result, 'Query sorted by field returned expected values.'); // Assert sort by property. - $instance['settings']['handler_settings']['sort'] = array( + $field_definition['settings']['handler_settings']['sort'] = array( 'field' => 'nid', 'direction' => 'ASC', ); - $handler = entity_reference_get_selection_handler($field, $instance); + $handler = entity_reference_get_selection_handler($field_definition); $result = $handler->getReferencableEntities(); $expected_result = array( $nodes['published1']->nid => $node_labels['published1'], diff --git a/core/modules/field/field.form.inc b/core/modules/field/field.form.inc index 203a112..2100332 100644 --- a/core/modules/field/field.form.inc +++ b/core/modules/field/field.form.inc @@ -158,8 +158,8 @@ function field_add_more_js($form, $form_state) { $field_state = field_form_get_state($parents, $field_name, $langcode, $form_state); - $field = $field_state['field']; - if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED) { + $field_definition = $field_state['field_definition']; + if ($field_definition['cardinality'] != FIELD_CARDINALITY_UNLIMITED) { return; } @@ -260,48 +260,21 @@ function _field_form_state_parents($parents, $field_name, $langcode) { * Retrieves the field definition for a widget's helper callbacks. * * Widget helper element callbacks (such as #process, #element_validate, - * #value_callback, ...) should use field_widget_field() and - * field_widget_instance() instead of field_info_field() and - * field_info_instance() when they need to access field or instance properties. - * See hook_field_widget_form() for more details. + * #value_callback, ...) should use field_widget_field_definition() instead of + * field_info_field() and field_info_instance() when they need to access field + * or instance properties. See hook_field_widget_form() for more details. * * @param $element * The structured array for the widget. * @param $form_state * The form state. * - * @return - * The $field definition array for the current widget. - * - * @see field_widget_instance() - * @see hook_field_widget_form() - */ -function field_widget_field($element, $form_state) { - $field_state = field_form_get_state($element['#field_parents'], $element['#field_name'], $element['#language'], $form_state); - return $field_state['field']; -} - -/** - * Retrieves the instance definition array for a widget's helper callbacks. - * - * Widgets helper element callbacks (such as #process, #element_validate, - * #value_callback, ...) should use field_widget_field() and - * field_widget_instance() instead of field_info_field() and - * field_info_instance() when they need to access field or instance properties. - * See hook_field_widget_form() for more details. - * - * @param $element - * The structured array for the widget. - * @param $form_state - * The form state. - * - * @return - * The $instance definition array for the current widget. + * @return array + * The field definition array for the current widget. * - * @see field_widget_field() * @see hook_field_widget_form() */ -function field_widget_instance($element, $form_state) { +function field_widget_field_definition($element, $form_state) { $field_state = field_form_get_state($element['#field_parents'], $element['#field_name'], $element['#language'], $form_state); - return $field_state['instance']; + return $field_state['field_definition']; } diff --git a/core/modules/field/lib/Drupal/field/Plugin/Core/Entity/Field.php b/core/modules/field/lib/Drupal/field/Plugin/Core/Entity/Field.php index 5529ed9..8ca1910 100644 --- a/core/modules/field/lib/Drupal/field/Plugin/Core/Entity/Field.php +++ b/core/modules/field/lib/Drupal/field/Plugin/Core/Entity/Field.php @@ -504,8 +504,13 @@ public function getBundles() { * - label * - translatable * - settings - * - * @todo Figure out which additional keys are needed. + * - cardinality + * - required + * - description + * - columns + * - module + * - entity_type + * - bundle */ public function getFieldDefinition(FieldInstance $instance = NULL) { $field_definition = array( @@ -515,6 +520,13 @@ public function getFieldDefinition(FieldInstance $instance = NULL) { 'label' => $instance ? $instance->label() : $this->label(), 'translatable' => $this->translatable, 'settings' => $instance ? NestedArray::mergeDeep($this->settings, $instance->settings) : $this->settings, + 'cardinality' => $this->cardinality, + 'required' => $instance ? $instance->required : 1, + 'description' => $instance ? $instance->description : '', + 'columns' => $this['columns'], + 'module' => $this->module, + 'entity_type' => $instance ? $instance->entity_type : NULL, + 'bundle' => $instance ? $instance->bundle: NULL, ); return $field_definition; } diff --git a/core/modules/field/lib/Drupal/field/Plugin/Core/Entity/FieldInstance.php b/core/modules/field/lib/Drupal/field/Plugin/Core/Entity/FieldInstance.php index 2942fd4..2945704 100644 --- a/core/modules/field/lib/Drupal/field/Plugin/Core/Entity/FieldInstance.php +++ b/core/modules/field/lib/Drupal/field/Plugin/Core/Entity/FieldInstance.php @@ -465,8 +465,7 @@ public function getWidget() { $context = array( 'entity_type' => $this->entity_type, 'bundle' => $this->bundle, - 'field' => $this->field, - 'instance' => $this, + 'field_definition' => $this->field->getFieldDefinition($this), ); // Invoke hook_field_widget_properties_alter() and // hook_field_widget_properties_ENTITY_TYPE_alter(). diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterBase.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterBase.php index d6e12cb..f0924bd 100644 --- a/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterBase.php +++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterBase.php @@ -52,7 +52,7 @@ * @param string $view_mode * The view mode. */ - public function __construct($plugin_id, array $plugin_definition, $field_definition, array $settings, $label, $view_mode) { + public function __construct($plugin_id, array $plugin_definition, array $field_definition, array $settings, $label, $view_mode) { parent::__construct(array(), $plugin_id, $plugin_definition); $this->field_definition = $field_definition; diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php index 64c83a2..3329c92 100644 --- a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php +++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetBase.php @@ -2,7 +2,7 @@ /** * @file - * Definition of Drupal\field\Plugin\Type\Widget\WidgetBase. + * Contains \Drupal\field\Plugin\Type\Widget\WidgetBase. */ namespace Drupal\field\Plugin\Type\Widget; @@ -10,7 +10,6 @@ use Drupal\Component\Utility\NestedArray; use Drupal\Core\Entity\EntityInterface; use Drupal\field\Plugin\PluginSettingsBase; -use Drupal\field\Plugin\Core\Entity\FieldInstance; /** * Base class for 'Field widget' plugin implementations. @@ -18,20 +17,6 @@ abstract class WidgetBase extends PluginSettingsBase implements WidgetInterface { /** - * The field definition. - * - * @var array - */ - protected $field; - - /** - * The field instance definition. - * - * @var \Drupal\field\Plugin\Core\Entity\FieldInstance - */ - protected $instance; - - /** * The widget settings. * * @var array @@ -52,29 +37,26 @@ * The plugin_id for the widget. * @param array $plugin_definition * The plugin implementation definition. - * @param \Drupal\field\Plugin\Core\Entity\FieldInstance $instance - * The field instance to which the widget is associated. + * @param array $field_definition + * The definition of the field to which the widget is associated. * @param array $settings * The widget settings. * @param int $weight * The widget weight. */ - public function __construct($plugin_id, array $plugin_definition, FieldInstance $instance, array $settings, $weight) { + public function __construct($plugin_id, array $plugin_definition, array $field_definition, array $settings, $weight) { parent::__construct(array(), $plugin_id, $plugin_definition); - $this->instance = $instance; - $this->field = field_info_field($instance['field_name']); + $this->field_definition = $field_definition; $this->settings = $settings; $this->weight = $weight; } /** - * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::form(). + * {@inheritdoc} */ public function form(EntityInterface $entity, $langcode, array $items, array &$form, array &$form_state, $get_delta = NULL) { - $field = $this->field; - $instance = $this->instance; - $field_name = $field['field_name']; + $field_name = $this->field_definition['field_name']; $parents = $form['#parents']; @@ -85,11 +67,10 @@ public function form(EntityInterface $entity, $langcode, array $items, array &$f // Store field information in $form_state. if (!field_form_get_state($parents, $field_name, $langcode, $form_state)) { $field_state = array( - 'field' => $field, - 'instance' => $instance, - 'items_count' => count($items), - 'array_parents' => array(), - 'errors' => array(), + 'field_definition' => $this->field_definition, + 'items_count' => count($items), + 'array_parents' => array(), + 'errors' => array(), ); field_form_set_state($parents, $field_name, $langcode, $form_state, $field_state); } @@ -104,8 +85,8 @@ public function form(EntityInterface $entity, $langcode, array $items, array &$f if (isset($get_delta) || $definition['multiple_values']) { $delta = isset($get_delta) ? $get_delta : 0; $element = array( - '#title' => check_plain($instance['label']), - '#description' => field_filter_xss(\Drupal::token()->replace($instance['description'])), + '#title' => check_plain($this->field_definition['label']), + '#description' => field_filter_xss(\Drupal::token()->replace($this->field_definition['description'])), ); $element = $this->formSingleElement($entity, $items, $delta, $langcode, $element, $form, $form_state); @@ -135,7 +116,7 @@ public function form(EntityInterface $entity, $langcode, array $items, array &$f '#type' => 'container', '#attributes' => array( 'class' => array( - 'field-type-' . drupal_html_class($field['type']), + 'field-type-' . drupal_html_class($this->field_definition['type']), 'field-name-' . drupal_html_class($field_name), 'field-widget-' . drupal_html_class($this->getPluginId()), ), @@ -157,7 +138,7 @@ public function form(EntityInterface $entity, $langcode, array $items, array &$f // when $langcode is unknown. '#language' => $langcode, $langcode => $elements, - '#access' => field_access('edit', $field, $entity->entityType(), $entity), + '#access' => field_access('edit', $this->field_definition, $entity->entityType(), $entity), ); return $addition; @@ -172,14 +153,11 @@ public function form(EntityInterface $entity, $langcode, array $items, array &$f * - table display and drag-n-drop value reordering */ protected function formMultipleElements(EntityInterface $entity, array $items, $langcode, array &$form, array &$form_state) { - $field = $this->field; - $instance = $this->instance; - $field_name = $field['field_name']; - + $field_name = $this->field_definition['field_name']; $parents = $form['#parents']; // Determine the number of widgets to display. - switch ($field['cardinality']) { + switch ($this->field_definition['cardinality']) { case FIELD_CARDINALITY_UNLIMITED: $field_state = field_form_get_state($parents, $field_name, $langcode, $form_state); $max = $field_state['items_count']; @@ -187,16 +165,16 @@ protected function formMultipleElements(EntityInterface $entity, array $items, $ break; default: - $max = $field['cardinality'] - 1; - $is_multiple = ($field['cardinality'] > 1); + $max = $this->field_definition['cardinality'] - 1; + $is_multiple = ($this->field_definition['cardinality'] > 1); break; } $id_prefix = implode('-', array_merge($parents, array($field_name))); $wrapper_id = drupal_html_id($id_prefix . '-add-more-wrapper'); - $title = check_plain($instance['label']); - $description = field_filter_xss(\Drupal::token()->replace($instance['description'])); + $title = check_plain($this->field_definition['label']); + $description = field_filter_xss(\Drupal::token()->replace($this->field_definition['description'])); $elements = array(); @@ -232,9 +210,9 @@ protected function formMultipleElements(EntityInterface $entity, array $items, $ if ($elements) { $elements += array( '#theme' => 'field_multiple_value_form', - '#field_name' => $field['field_name'], - '#cardinality' => $field['cardinality'], - '#required' => $instance['required'], + '#field_name' => $this->field_definition['field_name'], + '#cardinality' => $this->field_definition['cardinality'], + '#required' => $this->field_definition['required'], '#title' => $title, '#description' => $description, '#prefix' => '
', @@ -243,7 +221,7 @@ protected function formMultipleElements(EntityInterface $entity, array $items, $ ); // Add 'add more' button, if not working with a programmed form. - if ($field['cardinality'] == FIELD_CARDINALITY_UNLIMITED && empty($form_state['programmed'])) { + if ($this->field_definition['cardinality'] == FIELD_CARDINALITY_UNLIMITED && empty($form_state['programmed'])) { $elements['add_more'] = array( '#type' => 'submit', '#name' => strtr($id_prefix, '-', '_') . '_add_more', @@ -267,19 +245,16 @@ protected function formMultipleElements(EntityInterface $entity, array $items, $ * Generates the form element for a single copy of the widget. */ protected function formSingleElement(EntityInterface $entity, array $items, $delta, $langcode, array $element, array &$form, array &$form_state) { - $instance = $this->instance; - $field = $this->field; - $element += array( '#entity_type' => $entity->entityType(), '#bundle' => $entity->bundle(), '#entity' => $entity, - '#field_name' => $field['field_name'], + '#field_name' => $this->field_definition['field_name'], '#language' => $langcode, '#field_parents' => $form['#parents'], - '#columns' => array_keys($field['columns']), + '#columns' => array_keys($this->field_definition['columns']), // Only the first widget should be required. - '#required' => $delta == 0 && $instance['required'], + '#required' => $delta == 0 && $this->field_definition['required'], '#delta' => $delta, '#weight' => $delta, ); @@ -290,8 +265,7 @@ protected function formSingleElement(EntityInterface $entity, array $items, $del // Allow modules to alter the field widget form element. $context = array( 'form' => $form, - 'field' => $field, - 'instance' => $instance, + 'field_definition' => $this->field_definition, 'langcode' => $langcode, 'items' => $items, 'delta' => $delta, @@ -304,10 +278,10 @@ protected function formSingleElement(EntityInterface $entity, array $items, $del } /** - * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::extractFormValues(). + * {@inheritdoc} */ public function extractFormValues(EntityInterface $entity, $langcode, array &$items, array $form, array &$form_state) { - $field_name = $this->field['field_name']; + $field_name = $this->field_definition['field_name']; // Extract the values from $form_state['values']. $path = array_merge($form['#parents'], array($field_name, $langcode)); @@ -342,7 +316,7 @@ public function extractFormValues(EntityInterface $entity, $langcode, array &$it $this->sortItems($items); // Remove empty values. - $items = _field_filter_items($this->field, $items); + $items = _field_filter_items($this->field_definition, $items); // Put delta mapping in $form_state, so that flagErrors() can use it. $field_state = field_form_get_state($form['#parents'], $field_name, $langcode, $form_state); @@ -355,10 +329,10 @@ public function extractFormValues(EntityInterface $entity, $langcode, array &$it } /** - * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::flagErrors(). + * {@inheritdoc} */ public function flagErrors(EntityInterface $entity, $langcode, array $items, array $form, array &$form_state) { - $field_name = $this->field['field_name']; + $field_name = $this->field_definition['field_name']; $field_state = field_form_get_state($form['#parents'], $field_name, $langcode, $form_state); @@ -421,7 +395,7 @@ public function massageFormValues(array $values, array $form, array &$form_state * The field values. */ protected function sortItems(array &$items) { - $is_multiple = ($this->field['cardinality'] == FIELD_CARDINALITY_UNLIMITED) || ($this->field['cardinality'] > 1); + $is_multiple = ($this->field_definition['cardinality'] == FIELD_CARDINALITY_UNLIMITED) || ($this->field_definition['cardinality'] > 1); if ($is_multiple && isset($items[0]['_weight'])) { usort($items, function ($a, $b) { $a_weight = (is_array($a) ? $a['_weight'] : 0); diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetFactory.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetFactory.php index 392ef5e..6941123 100644 --- a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetFactory.php +++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetFactory.php @@ -2,7 +2,7 @@ /** * @file - * Definition of Drupal\field\Plugin\WidgetFactory. + * Contains \Drupal\field\Plugin\WidgetFactory. */ namespace Drupal\field\Plugin\Type\Widget; @@ -15,11 +15,14 @@ class WidgetFactory extends DefaultFactory { /** - * Overrides Drupal\Component\Plugin\Factory\DefaultFactory::createInstance(). + * {@inheritdoc} */ public function createInstance($plugin_id, array $configuration) { $plugin_definition = $this->discovery->getDefinition($plugin_id); $plugin_class = static::getPluginClass($plugin_id, $plugin_definition); - return new $plugin_class($plugin_id, $plugin_definition, $configuration['instance'], $configuration['settings'], $configuration['weight']); + $instance = $configuration['instance']; + $field = field_info_field($instance['field_name']); + $field_definition = $field->getFieldDefinition($instance); + return new $plugin_class($plugin_id, $plugin_definition, $field_definition, $configuration['settings'], $configuration['weight']); } } diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetInterface.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetInterface.php index 8711bbd..55dd1a4 100644 --- a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetInterface.php +++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetInterface.php @@ -58,9 +58,9 @@ public function settingsForm(array $form, array &$form_state); * Therefore, the FAPI element callbacks (such as #process, #element_validate, * #value_callback...) used by the widget cannot use the field_info_field() * or field_info_instance() functions to retrieve the $field or $instance - * definitions they should operate on. The field_widget_field() and - * field_widget_instance() functions should be used instead to fetch the - * current working definitions from $form_state, where Field API stores them. + * definitions they should operate on. The field_widget_field_definition() + * should be used instead to fetch the current working definitions from + * $form_state, where Field API stores them. * * Alternatively, hook_field_widget_form() can extract the needed specific * properties from $field and $instance and set them as ad-hoc @@ -107,8 +107,7 @@ public function settingsForm(array $form, array &$form_state); * @return array * The form elements for a single widget for this field. * - * @see field_widget_field() - * @see field_widget_instance() + * @see field_widget_field_definition() * @see hook_field_widget_form_alter() * @see hook_field_widget_WIDGET_TYPE_form_alter() */ diff --git a/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php b/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php index 2e91a31..32cc0d6 100644 --- a/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php +++ b/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php @@ -106,7 +106,7 @@ public function init(ViewExecutable $view, DisplayPluginBase $display, array &$o */ public function access() { $base_table = $this->get_base_table(); - return field_access('view', $this->field_info, $this->definition['entity_tables'][$base_table]); + return field_access('view', $this->field_info->getFieldDefinition(), $this->definition['entity_tables'][$base_table]); } /** diff --git a/core/modules/field/tests/modules/field_test/field_test.field.inc b/core/modules/field/tests/modules/field_test/field_test.field.inc index 043fb4b..0ed0419 100644 --- a/core/modules/field/tests/modules/field_test/field_test.field.inc +++ b/core/modules/field/tests/modules/field_test/field_test.field.inc @@ -198,13 +198,13 @@ function field_test_default_value(EntityInterface $entity, $field, $instance) { * Implements hook_field_access(). */ function field_test_field_access($op, array $field_definition, $entity_type, $entity, $account) { - if ($field['field_name'] == "field_no_{$op}_access") { + if ($field_definition['field_name'] == "field_no_{$op}_access") { return FALSE; } // Only grant view access to test_view_field fields when the user has // 'view test_view_field content' permission. - if ($field['field_name'] == 'test_view_field' && $op == 'view' && !user_access('view test_view_field content')) { + if ($field_definition['field_name'] == 'test_view_field' && $op == 'view' && !user_access('view test_view_field content')) { return FALSE; } diff --git a/core/modules/field/tests/modules/field_test/field_test.module b/core/modules/field/tests/modules/field_test/field_test.module index 4ecd1a9..3de0466 100644 --- a/core/modules/field/tests/modules/field_test/field_test.module +++ b/core/modules/field/tests/modules/field_test/field_test.module @@ -200,7 +200,7 @@ function field_test_field_attach_view_alter(&$output, $context) { */ function field_test_field_widget_properties_alter(&$widget, $context) { // Make the alter_test_text field 42 characters for nodes and comments. - if (in_array($context['entity_type'], array('node', 'comment')) && ($context['field']['field_name'] == 'alter_test_text')) { + if (in_array($context['entity_type'], array('node', 'comment')) && ($context['field_definition']['field_name'] == 'alter_test_text')) { $widget['settings']['size'] = 42; } } @@ -210,7 +210,7 @@ function field_test_field_widget_properties_alter(&$widget, $context) { */ function field_test_field_widget_properties_user_alter(&$widget, $context) { // Always use buttons for the alter_test_options field on user forms. - if ($context['field']['field_name'] == 'alter_test_options') { + if ($context['field_definition']['field_name'] == 'alter_test_options') { $widget['type'] = 'options_buttons'; } } @@ -219,13 +219,17 @@ function field_test_field_widget_properties_user_alter(&$widget, $context) { * Implements hook_field_widget_form_alter(). */ function field_test_field_widget_form_alter(&$element, &$form_state, $context) { - switch ($context['field']['field_name']) { + $field_name = $context['field_definition']['field_name']; + $entity_type = $context['field_definition']['entity_type']; + $bundle = $context['field_definition']['bundle']; + $instance = field_info_instance($entity_type, $field_name, $bundle); + switch ($field_name) { case 'alter_test_text': - drupal_set_message('Field size: ' . $context['instance']->getWidget()->getSetting('size')); + drupal_set_message('Field size: ' . $instance->getWidget()->getSetting('size')); break; case 'alter_test_options': - drupal_set_message('Widget type: ' . $context['instance']->getWidget()->getPluginId()); + drupal_set_message('Widget type: ' . $instance->getWidget()->getPluginId()); break; } // Set a message if this is for the form displayed to set default value for diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldInstanceEditForm.php b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldInstanceEditForm.php index c2e42b6..252bef0 100644 --- a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldInstanceEditForm.php +++ b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldInstanceEditForm.php @@ -191,13 +191,13 @@ public function validateForm(array &$form, array &$form_state) { // Grab the field definition from $form_state. $field_state = field_form_get_state($element['#parents'], $field_name, LANGUAGE_NOT_SPECIFIED, $form_state); - $field = $field_state['field']; + $field_definition = $field_state['field_definition']; // Validate the value. $errors = array(); - $function = $field['module'] . '_field_validate'; + $function = $field_definition['module'] . '_field_validate'; if (function_exists($function)) { - $function(NULL, $field, $this->instance, LANGUAGE_NOT_SPECIFIED, $items, $errors); + $function(NULL, $field_definition, $this->instance, LANGUAGE_NOT_SPECIFIED, $items, $errors); } // Report errors. diff --git a/core/modules/file/file.field.inc b/core/modules/file/file.field.inc index de03e50..12f2c13 100644 --- a/core/modules/file/file.field.inc +++ b/core/modules/file/file.field.inc @@ -317,18 +317,18 @@ function file_field_displayed($item, $field) { /** * Retrieves the upload validators for a file field. * - * @param $field - * A field array. + * @param array $field_definition + * A field definition array. * * @return * An array suitable for passing to file_save_upload() or the file field * element's '#upload_validators' property. */ -function file_field_widget_upload_validators($field, $instance) { +function file_field_widget_upload_validators(array $field_definition) { // Cap the upload size according to the PHP limit. $max_filesize = parse_size(file_upload_max_size()); - if (!empty($instance['settings']['max_filesize']) && parse_size($instance['settings']['max_filesize']) < $max_filesize) { - $max_filesize = parse_size($instance['settings']['max_filesize']); + if (!empty($field_definition['settings']['max_filesize']) && parse_size($field_definition['settings']['max_filesize']) < $max_filesize) { + $max_filesize = parse_size($field_definition['settings']['max_filesize']); } $validators = array(); @@ -337,8 +337,8 @@ function file_field_widget_upload_validators($field, $instance) { $validators['file_validate_size'] = array($max_filesize); // Add the extension check if necessary. - if (!empty($instance['settings']['file_extensions'])) { - $validators['file_validate_extensions'] = array($instance['settings']['file_extensions']); + if (!empty($field_definition['settings']['file_extensions'])) { + $validators['file_validate_extensions'] = array($field_definition['settings']['file_extensions']); } return $validators; @@ -347,10 +347,8 @@ function file_field_widget_upload_validators($field, $instance) { /** * Determines the URI for a file field instance. * - * @param $field - * A field array. - * @param $instance - * A field instance array. + * @param array $field_definition + * A field definition array. * @param $data * An array of token objects to pass to * \Drupal\Core\Utility\Token::replace(). @@ -360,13 +358,13 @@ function file_field_widget_upload_validators($field, $instance) { * * @see \Drupal\Core\Utility\Token::replace() */ -function file_field_widget_uri($field, $instance, $data = array()) { - $destination = trim($instance['settings']['file_directory'], '/'); +function file_field_widget_uri(array $field_definition, $data = array()) { + $destination = trim($field_definition['settings']['file_directory'], '/'); // Replace tokens. $destination = Drupal::token()->replace($destination, $data); - return $field['settings']['uri_scheme'] . '://' . $destination; + return $field_definition['settings']['uri_scheme'] . '://' . $destination; } /** @@ -378,9 +376,9 @@ function file_field_widget_value($element, $input = FALSE, $form_state) { if ($input) { // Checkboxes lose their value when empty. // If the display field is present make sure its unchecked value is saved. - $field = field_widget_field($element, $form_state); + $field_definition = field_widget_field_definition($element, $form_state); if (empty($input['display'])) { - $input['display'] = $field['settings']['display_field'] ? 0 : 1; + $input['display'] = $field_definition['settings']['display_field'] ? 0 : 1; } } @@ -449,18 +447,17 @@ function file_field_widget_process($element, &$form_state, $form) { $item = $element['#value']; $item['fids'] = $element['fids']['#value']; - $field = field_widget_field($element, $form_state); - $instance = field_widget_instance($element, $form_state); - $settings = $instance['widget']['settings']; + $field_definition = field_widget_field_definition($element, $form_state); + $settings = $field_definition['settings']; $element['#theme'] = 'file_widget'; // Add the display field if enabled. - if (!empty($field['settings']['display_field']) && $item['fids']) { + if (!empty($field_definition['settings']['display_field']) && $item['fids']) { $element['display'] = array( '#type' => empty($item['fids']) ? 'hidden' : 'checkbox', '#title' => t('Include file in display'), - '#value' => isset($item['display']) ? $item['display'] : $field['settings']['display_default'], + '#value' => isset($item['display']) ? $item['display'] : $field_definition['settings']['display_default'], '#attributes' => array('class' => array('file-display')), ); } @@ -472,7 +469,7 @@ function file_field_widget_process($element, &$form_state, $form) { } // Add the description field if enabled. - if (!empty($instance['settings']['description_field']) && $item['fids']) { + if (!empty($field_definition['settings']['description_field']) && $item['fids']) { $config = config('file.settings'); $element['description'] = array( '#type' => $config->get('description.type'), @@ -485,7 +482,7 @@ function file_field_widget_process($element, &$form_state, $form) { // Adjust the Ajax settings so that on upload and remove of any individual // file, the entire group of file fields is updated together. - if ($field['cardinality'] != 1) { + if ($field_definition['cardinality'] != 1) { $parents = array_slice($element['#array_parents'], 0, -1); $new_path = 'file/ajax/' . implode('/', $parents) . '/' . $form['form_build_id']['#value']; $field_element = NestedArray::getValue($form, $parents); diff --git a/core/modules/file/file.module b/core/modules/file/file.module index 3fcd034..b345ca1 100644 --- a/core/modules/file/file.module +++ b/core/modules/file/file.module @@ -666,7 +666,7 @@ function file_file_download($uri, $field_type = 'file') { foreach ($entities as $entity) { $field = field_info_field($field_name); // Check if access to this field is not disallowed. - if (!field_access('view', $field, $entity_type, $entity)) { + if (!field_access('view', $field->getFieldDefinition(), $entity_type, $entity)) { $denied = TRUE; continue; } diff --git a/core/modules/file/lib/Drupal/file/Plugin/field/widget/FileWidget.php b/core/modules/file/lib/Drupal/file/Plugin/field/widget/FileWidget.php index 4eebf6c..362f0ad 100644 --- a/core/modules/file/lib/Drupal/file/Plugin/field/widget/FileWidget.php +++ b/core/modules/file/lib/Drupal/file/Plugin/field/widget/FileWidget.php @@ -31,7 +31,7 @@ class FileWidget extends WidgetBase { /** - * Implements \Drupal\field\Plugin\Type\Widget\WidgetInterface::settingsForm(). + * {@inheritdoc} */ public function settingsForm(array $form, array &$form_state) { $element['progress_indicator'] = array( @@ -50,14 +50,12 @@ public function settingsForm(array $form, array &$form_state) { } /** - * Overrides \Drupal\field\Plugin\Type\Widget\WidgetBase::formMultipleElements(). + * {@inheritdoc} * * Special handling for draggable multiple widgets and 'add more' button. */ protected function formMultipleElements(EntityInterface $entity, array $items, $langcode, array &$form, array &$form_state) { - $field = $this->field; - $instance = $this->instance; - $field_name = $field['field_name']; + $field_name = $this->field_definition['field_name']; $parents = $form['#parents']; @@ -70,23 +68,23 @@ protected function formMultipleElements(EntityInterface $entity, array $items, $ } // Determine the number of widgets to display. - switch ($field['cardinality']) { + switch ($this->field_definition['cardinality']) { case FIELD_CARDINALITY_UNLIMITED: $max = count($items); $is_multiple = TRUE; break; default: - $max = $field['cardinality'] - 1; - $is_multiple = ($field['cardinality'] > 1); + $max = $this->field_definition['cardinality'] - 1; + $is_multiple = ($this->field_definition['cardinality'] > 1); break; } $id_prefix = implode('-', array_merge($parents, array($field_name))); $wrapper_id = drupal_html_id($id_prefix . '-add-more-wrapper'); - $title = check_plain($instance['label']); - $description = field_filter_xss($instance['description']); + $title = check_plain($this->field_definition['label']); + $description = field_filter_xss($this->field_definition['description']); $elements = array(); @@ -120,8 +118,8 @@ protected function formMultipleElements(EntityInterface $entity, array $items, $ } } - $empty_single_allowed = ($this->field['cardinality'] == 1 && $delta == 0); - $empty_multiple_allowed = ($this->field['cardinality'] == FIELD_CARDINALITY_UNLIMITED || $delta < $this->field['cardinality']) && empty($form_state['programmed']); + $empty_single_allowed = ($this->field_definition['cardinality'] == 1 && $delta == 0); + $empty_multiple_allowed = ($this->field_definition['cardinality'] == FIELD_CARDINALITY_UNLIMITED || $delta < $this->field_definition['cardinality']) && empty($form_state['programmed']); // Add one more empty row for new uploads except when this is a programmed // multiple form as it is not necessary. @@ -150,25 +148,25 @@ protected function formMultipleElements(EntityInterface $entity, array $items, $ $elements['#description'] = $description; $elements['#field_name'] = $element['#field_name']; $elements['#language'] = $element['#language']; - $elements['#display_field'] = !empty($this->field['settings']['display_field']); + $elements['#display_field'] = !empty($this->field_definition['settings']['display_field']); // Add some properties that will eventually be added to the file upload // field. These are added here so that they may be referenced easily // through a hook_form_alter(). $elements['#file_upload_title'] = t('Add a new file'); - $elements['#file_upload_description'] = theme('file_upload_help', array('description' => '', 'upload_validators' => $elements[0]['#upload_validators'], 'cardinality' => $this->field['cardinality'])); + $elements['#file_upload_description'] = theme('file_upload_help', array('description' => '', 'upload_validators' => $elements[0]['#upload_validators'], 'cardinality' => $this->field_definition['cardinality'])); } return $elements; } /** - * Implements \Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement(). + * {@inheritdoc} */ public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) { $defaults = array( 'fids' => array(), - 'display' => !empty($this->field['settings']['display_default']), + 'display' => !empty($this->field_definition['settings']['display_default']), 'description' => '', ); @@ -177,8 +175,8 @@ public function formElement(array $items, $delta, array $element, $langcode, arr $element_info = element_info('managed_file'); $element += array( '#type' => 'managed_file', - '#upload_location' => file_field_widget_uri($this->field, $this->instance), - '#upload_validators' => file_field_widget_upload_validators($this->field, $this->instance), + '#upload_location' => file_field_widget_uri($this->field_definition), + '#upload_validators' => file_field_widget_upload_validators($this->field_definition), '#value_callback' => 'file_field_widget_value', '#process' => array_merge($element_info['#process'], array('file_field_widget_process')), '#progress_indicator' => $this->getSetting('progress_indicator'), @@ -197,7 +195,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr $default_fids = $element['#extended'] ? $element['#default_value']['fids'] : $element['#default_value']; if (empty($default_fids)) { - $cardinality = isset($this->field['cardinality']) ? $this->field['cardinality'] : 1; + $cardinality = isset($this->field_definition['cardinality']) ? $this->field_definition['cardinality'] : 1; $element['#description'] = theme('file_upload_help', array('description' => $element['#description'], 'upload_validators' => $element['#upload_validators'], 'cardinality' => $cardinality)); $element['#multiple'] = $cardinality != 1 ? TRUE : FALSE; if ($cardinality != 1 && $cardinality != -1) { @@ -209,7 +207,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr } /** - * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::massageFormValues(). + * {@inheritdoc} */ public function massageFormValues(array $values, array $form, array &$form_state) { // Since file upload widget now supports uploads of more than one file at a diff --git a/core/modules/image/image.field.inc b/core/modules/image/image.field.inc index a287620..3331ff4 100644 --- a/core/modules/image/image.field.inc +++ b/core/modules/image/image.field.inc @@ -361,8 +361,8 @@ function image_field_widget_process($element, &$form_state, $form) { } // Get field settings. - $instance = field_widget_instance($element, $form_state); - $settings = $instance['settings']; + $field_definition = field_widget_field_definition($element, $form_state); + $settings = $field_definition['settings']; // Add the additional alt and title fields. $element['alt'] = array( diff --git a/core/modules/image/lib/Drupal/image/Plugin/field/widget/ImageWidget.php b/core/modules/image/lib/Drupal/image/Plugin/field/widget/ImageWidget.php index 8062ff6..77ab4e0 100644 --- a/core/modules/image/lib/Drupal/image/Plugin/field/widget/ImageWidget.php +++ b/core/modules/image/lib/Drupal/image/Plugin/field/widget/ImageWidget.php @@ -52,33 +52,33 @@ public function settingsForm(array $form, array &$form_state) { } /** - * Overrides \Drupal\file\Plugin\field\widget\FileWidget::formMultipleElements(). + * {@inheritdoc} * * Special handling for draggable multiple widgets and 'add more' button. */ protected function formMultipleElements(EntityInterface $entity, array $items, $langcode, array &$form, array &$form_state) { $elements = parent::formMultipleElements($entity, $items, $langcode, $form, $form_state); - if ($this->field['cardinality'] == 1) { + if ($this->field_definition['cardinality'] == 1) { // If there's only one field, return it as delta 0. if (empty($elements[0]['#default_value']['fids'])) { - $elements[0]['#description'] = theme('file_upload_help', array('description' => $this->instance['description'], 'upload_validators' => $elements[0]['#upload_validators'], 'cardinality' => $this->field['cardinality'])); + $elements[0]['#description'] = theme('file_upload_help', array('description' => $this->field_definition['description'], 'upload_validators' => $elements[0]['#upload_validators'], 'cardinality' => $this->field_definition['cardinality'])); } } else { - $elements['#file_upload_description'] = theme('file_upload_help', array('upload_validators' => $elements[0]['#upload_validators'], 'cardinality' => $this->field['cardinality'])); + $elements['#file_upload_description'] = theme('file_upload_help', array('upload_validators' => $elements[0]['#upload_validators'], 'cardinality' => $this->field_definition['cardinality'])); } return $elements; } /** - * Overrides \Drupal\file\Plugin\field\widget\FileWidget::formElement(). + * {@inheritdoc} */ public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) { $element = parent::formElement($items, $delta, $element, $langcode, $form, $form_state); - $settings = $this->instance['settings']; + $settings = $this->field_definition['settings']; // Add upload resolution validation. if ($settings['max_resolution'] || $settings['min_resolution']) { diff --git a/core/modules/link/lib/Drupal/link/Plugin/field/widget/LinkWidget.php b/core/modules/link/lib/Drupal/link/Plugin/field/widget/LinkWidget.php index 8a1aebb..5d6d1f2 100644 --- a/core/modules/link/lib/Drupal/link/Plugin/field/widget/LinkWidget.php +++ b/core/modules/link/lib/Drupal/link/Plugin/field/widget/LinkWidget.php @@ -33,8 +33,6 @@ class LinkWidget extends WidgetBase { * {@inheritdoc} */ public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) { - $instance = $this->instance; - $element['url'] = array( '#type' => 'url', '#title' => t('URL'), @@ -49,13 +47,13 @@ public function formElement(array $items, $delta, array $element, $langcode, arr '#placeholder' => $this->getSetting('placeholder_title'), '#default_value' => isset($items[$delta]['title']) ? $items[$delta]['title'] : NULL, '#maxlength' => 255, - '#access' => $instance['settings']['title'] != DRUPAL_DISABLED, + '#access' => $this->field_definition['settings']['title'] != DRUPAL_DISABLED, ); // Post-process the title field to make it conditionally required if URL is // non-empty. Omit the validation on the field edit form, since the field // settings cannot be saved otherwise. $is_field_edit_form = ($element['#entity'] === NULL); - if (!$is_field_edit_form && $instance['settings']['title'] == DRUPAL_REQUIRED) { + if (!$is_field_edit_form && $this->field_definition['settings']['title'] == DRUPAL_REQUIRED) { $element['#element_validate'] = array(array($this, 'validateTitle')); } @@ -70,7 +68,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr // If cardinality is 1, ensure a label is output for the field by wrapping it // in a details element. - if ($this->field['cardinality'] == 1) { + if ($this->field_definition['cardinality'] == 1) { $element += array( '#type' => 'fieldset', ); diff --git a/core/modules/number/lib/Drupal/number/Plugin/field/widget/NumberWidget.php b/core/modules/number/lib/Drupal/number/Plugin/field/widget/NumberWidget.php index 37c857f..4d4f87a 100644 --- a/core/modules/number/lib/Drupal/number/Plugin/field/widget/NumberWidget.php +++ b/core/modules/number/lib/Drupal/number/Plugin/field/widget/NumberWidget.php @@ -2,7 +2,7 @@ /** * @file - * Definition of Drupal\number\Plugin\field\widget\NumberWidget. + * Contains \Drupal\number\Plugin\field\widget\NumberWidget. */ namespace Drupal\number\Plugin\field\widget; @@ -31,7 +31,7 @@ class NumberWidget extends WidgetBase { /** - * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::settingsForm(). + * {@inheritdoc} */ public function settingsForm(array $form, array &$form_state) { $element['placeholder'] = array( @@ -44,12 +44,9 @@ public function settingsForm(array $form, array &$form_state) { } /** - * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement(). + * {@inheritdoc} */ public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) { - $field = $this->field; - $instance = $this->instance; - $value = isset($items[$delta]['value']) ? $items[$delta]['value'] : NULL; $element += array( @@ -59,9 +56,9 @@ public function formElement(array $items, $delta, array $element, $langcode, arr ); // Set the step for floating point and decimal numbers. - switch ($field['type']) { + switch ($this->field_definition['type']) { case 'number_decimal': - $element['#step'] = pow(0.1, $field['settings']['scale']); + $element['#step'] = pow(0.1, $this->field_definition['settings']['scale']); break; case 'number_float': @@ -70,20 +67,20 @@ public function formElement(array $items, $delta, array $element, $langcode, arr } // Set minimum and maximum. - if (is_numeric($instance['settings']['min'])) { - $element['#min'] = $instance['settings']['min']; + if (is_numeric($this->field_definition['settings']['min'])) { + $element['#min'] = $this->field_definition['settings']['min']; } - if (is_numeric($instance['settings']['max'])) { - $element['#max'] = $instance['settings']['max']; + if (is_numeric($this->field_definition['settings']['max'])) { + $element['#max'] = $this->field_definition['settings']['max']; } // Add prefix and suffix. - if (!empty($instance['settings']['prefix'])) { - $prefixes = explode('|', $instance['settings']['prefix']); + if (!empty($this->field_definition['settings']['prefix'])) { + $prefixes = explode('|', $this->field_definition['settings']['prefix']); $element['#field_prefix'] = field_filter_xss(array_pop($prefixes)); } - if (!empty($instance['settings']['suffix'])) { - $suffixes = explode('|', $instance['settings']['suffix']); + if (!empty($this->field_definition['settings']['suffix'])) { + $suffixes = explode('|', $this->field_definition['settings']['suffix']); $element['#field_suffix'] = field_filter_xss(array_pop($suffixes)); } @@ -91,7 +88,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr } /** - * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::errorElement(). + * {@inheritdoc} */ public function errorElement(array $element, array $error, array $form, array &$form_state) { return $element['value']; diff --git a/core/modules/options/lib/Drupal/options/Plugin/field/widget/OnOffWidget.php b/core/modules/options/lib/Drupal/options/Plugin/field/widget/OnOffWidget.php index 7e6b4a5..dceee88 100644 --- a/core/modules/options/lib/Drupal/options/Plugin/field/widget/OnOffWidget.php +++ b/core/modules/options/lib/Drupal/options/Plugin/field/widget/OnOffWidget.php @@ -57,7 +57,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr // Override the title from the incoming $element. if ($this->getSetting('display_label')) { - $element['#title'] = $this->instance['label']; + $element['#title'] = $this->field_definition['label']; } else { $element['#title'] = isset($options[1]) ? $options[1] : ''; diff --git a/core/modules/options/lib/Drupal/options/Plugin/field/widget/OptionsWidgetBase.php b/core/modules/options/lib/Drupal/options/Plugin/field/widget/OptionsWidgetBase.php index 40f24df..a558453 100644 --- a/core/modules/options/lib/Drupal/options/Plugin/field/widget/OptionsWidgetBase.php +++ b/core/modules/options/lib/Drupal/options/Plugin/field/widget/OptionsWidgetBase.php @@ -36,12 +36,12 @@ /** * {@inheritdoc} */ - public function __construct($plugin_id, array $plugin_definition, FieldInstance $instance, array $settings, $weight) { - parent::__construct($plugin_id, $plugin_definition, $instance, $settings, $weight); + public function __construct($plugin_id, array $plugin_definition, array $field_definition, array $settings, $weight) { + parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $weight); // Reset internal pointer since we're dealing with objects now. - reset($this->field['columns']); - $this->column = key($this->field['columns']); + reset($this->field_definition['columns']); + $this->column = key($this->field_definition['columns']); } /** @@ -52,7 +52,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr // element. $this->entity = $element['#entity']; $this->required = $element['#required']; - $this->multiple = ($this->field['cardinality'] == FIELD_CARDINALITY_UNLIMITED) || ($this->field['cardinality'] > 1); + $this->multiple = ($this->field_definition['cardinality'] == FIELD_CARDINALITY_UNLIMITED) || ($this->field_definition['cardinality'] > 1); $this->has_value = isset($items[0][$this->column]); // Add our custom validator. @@ -113,7 +113,7 @@ public static function validateElement(array $element, array &$form_state) { protected function getOptions() { if (!isset($this->options)) { // Get the list of options from the field type module, and sanitize them. - $options = (array) module_invoke($this->field['module'], 'options_list', $this->field, $this->instance, $this->entity); + $options = (array) module_invoke($this->field_definition['module'], 'options_list', $this->field_definition, $this->entity); array_walk_recursive($options, array($this, 'sanitizeLabel')); // Options might be nested ("optgroups"). If the widget does not support @@ -124,7 +124,7 @@ protected function getOptions() { // Add an empty option if the widget needs one. if ($empty_option = $this->getEmptyOption()) { - $label = theme('options_none', array('option' => $empty_option, 'widget' => $this, 'instance' => $this->instance)); + $label = theme('options_none', array('option' => $empty_option, 'widget' => $this, 'field_definition' => $this->field_definition)); $options = array('_none' => $label) + $options; } diff --git a/core/modules/options/options.api.php b/core/modules/options/options.api.php index f3d0f7d..a1b9c1f 100644 --- a/core/modules/options/options.api.php +++ b/core/modules/options/options.api.php @@ -13,12 +13,8 @@ * implement this hook to specify the list of options to display in the * widgets. * - * @param $field - * The field definition. - * @param $instance - * The instance definition. It is recommended to only use instance level - * properties to filter out values from a list defined by field level - * properties. + * @param array $field + * The field definition array. * @param \Drupal\Core\Entity\EntityInterface $entity * The entity object the field is attached to. * @@ -31,7 +27,7 @@ * widget. The HTML tags defined in _field_filter_xss_allowed_tags() are * allowed, other tags will be filtered. */ -function hook_options_list($field, $instance, $entity) { +function hook_options_list(array $field_definition, $entity) { // Sample structure. $options = array( 0 => t('Zero'), @@ -57,7 +53,7 @@ function hook_options_list($field, $instance, $entity) { // In actual implementations, the array of options will most probably depend // on properties of the field. Example from taxonomy.module: $options = array(); - foreach ($field['settings']['allowed_values'] as $tree) { + foreach ($field_definition['settings']['allowed_values'] as $tree) { $terms = taxonomy_get_tree($tree['vid'], $tree['parent'], NULL, TRUE); if ($terms) { foreach ($terms as $term) { diff --git a/core/modules/options/options.module b/core/modules/options/options.module index 61c36d5..30db7d3 100644 --- a/core/modules/options/options.module +++ b/core/modules/options/options.module @@ -29,7 +29,7 @@ function options_help($path, $arg) { function options_theme() { return array( 'options_none' => array( - 'variables' => array('instance' => NULL, 'option' => NULL), + 'variables' => array('field_definition' => NULL, 'option' => NULL), ), ); } @@ -251,7 +251,7 @@ function options_field_update_field($field, $prior_field, $has_data) { function options_allowed_values(array $field_definition, EntityInterface $entity = NULL) { $allowed_values = &drupal_static(__FUNCTION__, array()); - if (!isset($allowed_values[$field_definition['uuid']])) { + if (!isset($allowed_values[$field_definition['cache_id']])) { $function = $field_definition['settings']['allowed_values_function']; // If $cacheable is FALSE, then the allowed values are not statically // cached. See options_test_dynamic_values_callback() for an example of @@ -265,14 +265,14 @@ function options_allowed_values(array $field_definition, EntityInterface $entity } if ($cacheable) { - $allowed_values[$field_definition['uuid']] = $values; + $allowed_values[$field_definition['cache_id']] = $values; } else { return $values; } } - return $allowed_values[$field_definition['uuid']]; + return $allowed_values[$field_definition['cache_id']]; } /** @@ -412,7 +412,8 @@ function _options_values_in_use($field, $values) { * - 'list_illegal_value': The value is not part of the list of allowed values. */ function options_field_validate(EntityInterface $entity = NULL, $field, $instance, $langcode, $items, &$errors) { - $allowed_values = options_allowed_values($field, $instance, $entity); + $field_definition = $field->getFieldDefinition($instance); + $allowed_values = options_allowed_values($field_definition, $entity); foreach ($items as $delta => $item) { if (!empty($item['value'])) { if (!empty($allowed_values) && !isset($allowed_values[$item['value']])) { @@ -438,8 +439,8 @@ function options_field_is_empty($item, $field) { /** * Implements hook_options_list(). */ -function options_options_list($field, $instance, $entity) { - return options_allowed_values($field, $instance, $entity); +function options_options_list(array $field_definition, $entity) { + return options_allowed_values($field_definition, $entity); } /** @@ -455,7 +456,7 @@ function options_options_list($field, $instance, $entity) { * or * \Drupal\options\Plugin\field\widget\OptionsWidgetBase::OPTIONS_EMPTY_SELECT. * - widget: The widget object requesting the option. - * - instance: The instance definition. + * - field_definition: The field definition array. * * @ingroup themeable */ diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/field/widget/TaxonomyAutocompleteWidget.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/field/widget/TaxonomyAutocompleteWidget.php index 9624d43..6c673ae 100644 --- a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/field/widget/TaxonomyAutocompleteWidget.php +++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/field/widget/TaxonomyAutocompleteWidget.php @@ -2,7 +2,7 @@ /** * @file - * Definition of Drupal\taxonomy\Plugin\field\widget\TaxonomyAutocompleteWidget. + * Contains \Drupal\taxonomy\Plugin\field\widget\TaxonomyAutocompleteWidget. */ namespace Drupal\taxonomy\Plugin\field\widget; @@ -32,7 +32,7 @@ class TaxonomyAutocompleteWidget extends WidgetBase { /** - * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::settingsForm(). + * {@inheritdoc} */ public function settingsForm(array $form, array &$form_state) { $element['placeholder'] = array( @@ -45,11 +45,9 @@ public function settingsForm(array $form, array &$form_state) { } /** - * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement(). + * {@inheritdoc} */ public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) { - $field = $this->field; - $tags = array(); foreach ($items as $item) { $tags[$item['tid']] = isset($item['taxonomy_term']) ? $item['taxonomy_term'] : taxonomy_term_load($item['tid']); @@ -57,7 +55,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr $element += array( '#type' => 'textfield', '#default_value' => taxonomy_implode_tags($tags), - '#autocomplete_path' => $this->getSetting('autocomplete_path') . '/' . $field['field_name'], + '#autocomplete_path' => $this->getSetting('autocomplete_path') . '/' . $this->field_definition['field_name'], '#size' => $this->getSetting('size'), '#placeholder' => $this->getSetting('placeholder'), '#maxlength' => 1024, @@ -68,16 +66,15 @@ public function formElement(array $items, $delta, array $element, $langcode, arr } /** - * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::massageFormValues() + * {@inheritdoc} */ public function massageFormValues(array $values, array $form, array &$form_state) { // Autocomplete widgets do not send their tids in the form, so we must detect // them here and process them independently. $items = array(); - $field = $this->field; // Collect candidate vocabularies. - foreach ($field['settings']['allowed_values'] as $tree) { + foreach ($this->field_definition['settings']['allowed_values'] as $tree) { if ($vocabulary = entity_load('taxonomy_vocabulary', $tree['vocabulary'])) { $vocabularies[$vocabulary->id()] = $vocabulary; } diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module index e10e9ea..3c0991d 100644 --- a/core/modules/taxonomy/taxonomy.module +++ b/core/modules/taxonomy/taxonomy.module @@ -1005,9 +1005,9 @@ function taxonomy_field_widget_info_alter(&$info) { /** * Implements hook_options_list(). */ -function taxonomy_options_list($field, $instance, $entity) { - $function = !empty($field['settings']['options_list_callback']) ? $field['settings']['options_list_callback'] : 'taxonomy_allowed_values'; - return $function($field, $instance, $entity); +function taxonomy_options_list(array $field_definition, $entity) { + $function = !empty($field_definition['settings']['options_list_callback']) ? $field_definition['settings']['options_list_callback'] : 'taxonomy_allowed_values'; + return $function($field_definition, $entity); } /** @@ -1079,21 +1079,17 @@ function taxonomy_field_is_empty($item, $field) { /** * Returns the set of valid terms for a taxonomy field. * - * @param $field - * The field definition. - * @param $instance - * The instance definition. It is recommended to only use instance level - * properties to filter out values from a list defined by field level - * properties. + * @param array $field_definition + * The field definition array. * @param \Drupal\Core\Entity\EntityInterface $entity * The entity object the field is attached to. * * @return * The array of valid terms for this field, keyed by term id. */ -function taxonomy_allowed_values($field, $instance, EntityInterface $entity) { +function taxonomy_allowed_values(array $field_definition, EntityInterface $entity) { $options = array(); - foreach ($field['settings']['allowed_values'] as $tree) { + foreach ($field_definition['settings']['allowed_values'] as $tree) { if ($vocabulary = taxonomy_vocabulary_load($tree['vocabulary'])) { if ($terms = taxonomy_get_tree($vocabulary->id(), $tree['parent'], NULL, TRUE)) { foreach ($terms as $term) { diff --git a/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWidget.php b/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWidget.php index 496ea12..3e29b53 100644 --- a/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWidget.php +++ b/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWidget.php @@ -2,7 +2,7 @@ /** * @file - * Definition of Drupal\text\Plugin\field\widget\TextareaWidget. + * Contains \Drupal\text\Plugin\field\widget\TextareaWidget. */ namespace Drupal\text\Plugin\field\widget; @@ -30,7 +30,7 @@ class TextareaWidget extends WidgetBase { /** - * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::settingsForm(). + * {@inheritdoc} */ public function settingsForm(array $form, array &$form_state) { $element['rows'] = array( @@ -50,7 +50,7 @@ public function settingsForm(array $form, array &$form_state) { } /** - * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement(). + * {@inheritdoc} */ public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) { $main_widget = $element + array( @@ -61,7 +61,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr '#attributes' => array('class' => array('text-full')), ); - if ($this->instance['settings']['text_processing']) { + if ($this->field_definition['settings']['text_processing']) { $element = $main_widget; $element['#type'] = 'text_format'; $element['#format'] = isset($items[$delta]['format']) ? $items[$delta]['format'] : NULL; diff --git a/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWithSummaryWidget.php b/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWithSummaryWidget.php index b3a68ac..46e9455 100644 --- a/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWithSummaryWidget.php +++ b/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextareaWithSummaryWidget.php @@ -2,7 +2,7 @@ /** * @file - * Definition of Drupal\text\Plugin\field\widget\TextareaWithSummaryWidget. + * Contains \Drupal\text\Plugin\field\widget\TextareaWithSummaryWidget. */ namespace Drupal\text\Plugin\field\widget; @@ -30,12 +30,12 @@ class TextareaWithSummaryWidget extends TextareaWidget { /** - * Overrides TextareaWidget::formElement(). + * {@inheritdoc} */ function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) { $element = parent::formElement($items, $delta, $element, $langcode, $form, $form_state); - $display_summary = !empty($items[$delta]['summary']) || $this->instance['settings']['display_summary']; + $display_summary = !empty($items[$delta]['summary']) || $this->field_definition['settings']['display_summary']; $element['summary'] = array( '#type' => $display_summary ? 'textarea' : 'value', '#default_value' => isset($items[$delta]['summary']) ? $items[$delta]['summary'] : NULL, @@ -55,7 +55,7 @@ function formElement(array $items, $delta, array $element, $langcode, array &$fo } /** - * Overrides TextareaWidget::errorElement(). + * {@inheritdoc} */ public function errorElement(array $element, array $error, array $form, array &$form_state) { switch ($error['error']) { diff --git a/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextfieldWidget.php b/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextfieldWidget.php index a6e26b7..ef1accf 100644 --- a/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextfieldWidget.php +++ b/core/modules/text/lib/Drupal/text/Plugin/field/widget/TextfieldWidget.php @@ -2,7 +2,7 @@ /** * @file - * Definition of Drupal\text\Plugin\field\widget\TextfieldWidget. + * Contains \Drupal\text\Plugin\field\widget\TextfieldWidget. */ namespace Drupal\text\Plugin\field\widget; @@ -30,7 +30,7 @@ class TextfieldWidget extends WidgetBase { /** - * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::settingsForm(). + * {@inheritdoc} */ public function settingsForm(array $form, array &$form_state) { $element['size'] = array( @@ -50,7 +50,7 @@ public function settingsForm(array $form, array &$form_state) { } /** - * Implements Drupal\field\Plugin\Type\Widget\WidgetInterface::formElement(). + * {@inheritdoc} */ public function formElement(array $items, $delta, array $element, $langcode, array &$form, array &$form_state) { $main_widget = $element + array( @@ -58,11 +58,11 @@ public function formElement(array $items, $delta, array $element, $langcode, arr '#default_value' => isset($items[$delta]['value']) ? $items[$delta]['value'] : NULL, '#size' => $this->getSetting('size'), '#placeholder' => $this->getSetting('placeholder'), - '#maxlength' => $this->field['settings']['max_length'], + '#maxlength' => $this->field_definition['settings']['max_length'], '#attributes' => array('class' => array('text-full')), ); - if ($this->instance['settings']['text_processing']) { + if ($this->field_definition['settings']['text_processing']) { $element = $main_widget; $element['#type'] = 'text_format'; $element['#format'] = isset($items[$delta]['format']) ? $items[$delta]['format'] : NULL;