diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldItemBase.php b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldItemBase.php index eeb06de..fbe028d 100644 --- a/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldItemBase.php +++ b/core/modules/field/lib/Drupal/field/Plugin/Type/FieldType/ConfigFieldItemBase.php @@ -50,10 +50,10 @@ public function instanceSettingsForm(array $form, array &$form_state) { * {@inheritdoc} */ public function defaultValuesForm(array &$form, array &$form_state) { - $entity = $form['#entity']; + $entity = $this->getParent()->getParent(); $default_value = $this->getFieldDefinition()->default_value; $field_name = $this->getFieldDefinition()->getFieldName(); - $widget = $this->defaultValueWidget(); + $widget = $this->defaultValueWidget($form_state); $this->getFieldDefinition()->required = 0; @@ -82,8 +82,8 @@ public function defaultValuesForm(array &$form, array &$form_state) { * {@inheritdoc} */ public function defaultValuesFormValidate(array $element, array &$form, array &$form_state) { - $entity = $form['#entity']; - $widget = $this->defaultValueWidget(); + $entity = $this->getParent()->getParent(); + $widget = $this->defaultValueWidget($form_state); $field_name = $this->getFieldDefinition()->getFieldName(); // Extract the 'default value'. @@ -106,8 +106,8 @@ public function defaultValuesFormValidate(array $element, array &$form, array &$ * {@inheritdoc} */ public function defaultValuesFormSubmit(array $element, array &$form, array &$form_state) { - $entity = $form['#entity']; - $widget = $this->defaultValueWidget(); + $entity = $this->getParent()->getParent(); + $widget = $this->defaultValueWidget($form_state); $field_name = $this->getFieldDefinition()->getFieldName(); // Extract field values. @@ -117,25 +117,27 @@ public function defaultValuesFormSubmit(array $element, array &$form, array &$fo return $items->getValue() ?: NULL; } - protected function defaultValueWidget() { - static $widget = NULL; - - if (!isset($widget)) { + /** + * Returns the widget object used in default value form. + * + * @param array $form_state + * The form_state array + * + * @return \Drupal\field\Plugin\Type\Widget\WidgetInterface + * A Widget object. + */ + protected function defaultValueWidget(array &$form_state) { + if (!isset($form_state['default_value_widget'])) { $field_name = $this->getFieldDefinition()->getFieldName(); - $entity_form_display = entity_get_form_display($this->getFieldDefinition()->entity_type, $this->getFieldDefinition()->bundle, 'default'); + $entity = $this->getParent()->getParent(); + $entity_form_display = entity_get_form_display($entity->entityType(), $entity->bundle(), 'default'); // When field is hidden, use the default widget and store it in the form - if (!$widget = $entity_form_display->getRenderer($field_name)) { - $field_type = \Drupal::service('plugin.manager.entity.field.field_type')->getDefinition($this->getFieldDefinition()->getFieldType()); - $widget = \Drupal::service('plugin.manager.field.widget')->getDefinition($field_type['default_widget']); - $configuration = array( - 'field_definition' => $this->getFieldDefinition(), - 'settings' => $widget['settings'] - ); - $widget = \Drupal::service('plugin.manager.field.widget')->createInstance($field_type['default_widget'], $configuration); + if (!$form_state['default_value_widget'] = $entity_form_display->getRenderer($field_name)) { + $form_state['default_value_widget'] = \Drupal::service('plugin.manager.field.widget')->getInstance(array('field_definition' => $this->getFieldDefinition())); } } - return $widget; + return $form_state['default_value_widget']; } } diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetPluginManager.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetPluginManager.php index 12bb296..cf7332c 100644 --- a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetPluginManager.php +++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetPluginManager.php @@ -87,7 +87,7 @@ public function __construct(\Traversable $namespaces, CacheBackendInterface $cac * A Widget object. */ public function getInstance(array $options) { - $configuration = $options['configuration']; + $configuration = isset($options['configuration']) ? $options['configuration'] : array(); $field_definition = $options['field_definition']; $field_type = $field_definition->getFieldType(); 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 59c02a7..ec9f906 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 @@ -160,9 +160,7 @@ public function buildForm(array $form, array &$form_state, FieldInstanceInterfac * {@inheritdoc} */ public function validateForm(array &$form, array &$form_state) { - if (isset($form['instance']['default_value_widget'])) { $this->getFieldItem($form['#entity'], $this->instance['field_name'])->defaultValuesFormValidate($form['instance']['default_value_widget'], $form, $form_state); - } } /** @@ -170,9 +168,7 @@ public function validateForm(array &$form, array &$form_state) { */ public function submitForm(array &$form, array &$form_state) { // Handle the default value. - if (isset($form['instance']['default_value_widget'])) { $this->instance['default_value'] = $this->getFieldItem($form['#entity'], $this->instance['field_name'])->defaultValuesFormSubmit($form['instance']['default_value_widget'], $form, $form_state); - } // Merge incoming values into the instance. foreach ($form_state['values']['instance'] as $key => $value) { diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageFieldsTest.php b/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageFieldsTest.php index 69be9ec..b651118 100644 --- a/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageFieldsTest.php +++ b/core/modules/field_ui/lib/Drupal/field_ui/Tests/ManageFieldsTest.php @@ -321,16 +321,6 @@ function testDefaultValue() { field_info_cache_clear(); $instance = field_info_instance('node', $field_name, $this->type); $this->assertEqual($instance['default_value'], NULL, 'The default value was correctly saved.'); - - // Change the widget to TestFieldWidgetNoDefault. - entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default') - ->setComponent($field_name, array( - 'type' => 'test_field_widget_no_default', - )) - ->save(); - - $this->drupalGet($admin_path); - $this->assertNoFieldById($element_id, '', 'No default value was possible for widget that disables default value.'); } /**