diff --git a/core/includes/entity.inc b/core/includes/entity.inc index 708706e..b65dfa3 100644 --- a/core/includes/entity.inc +++ b/core/includes/entity.inc @@ -670,7 +670,7 @@ function entity_get_display($entity_type, $bundle, $view_mode) { $display = entity_create('entity_display', array( 'targetEntityType' => $entity_type, 'bundle' => $bundle, - 'viewMode' => $view_mode, + 'displayMode' => $view_mode, )); } @@ -712,12 +712,72 @@ function entity_get_render_display(EntityInterface $entity, $view_mode) { $render_view_mode = !empty($view_mode_settings[$view_mode]['custom_settings']) ? $view_mode : 'default'; $display = entity_get_display($entity_type, $bundle, $render_view_mode); - $display->originalViewMode = $view_mode; + $display->originalDisplayMode = $view_mode; return $display; } /** + * Returns the entity_form_display object associated to a bundle and form mode. + * + * Use this function when assigning suggested widget options for a component + * in a given form mode. Note that they will only be actually used at render + * time if the form mode itself is configured to use dedicated widget settings + * for the bundle; if not, the 'default' form is used instead. + * + * The function reads the entity_form_display object from the current + * configuration, or returns a ready-to-use empty one if configuration entry + * exists yet for this bundle and form mode. This streamlines manipulation of + * EntityFormDisplay objects by always returning a consistent object that + * reflects the current state of the configuration. + * + * Example usage: + * - Set the 'body' field to be displayed and the 'field_image' field to be + * hidden on article nodes in the 'default' form mode. + * @code + * entity_get_form_display('node', 'article', 'default') + * ->setComponent('body', array( + * 'type' => 'text_textarea_with_summary', + * 'weight' => 1, + * )) + * ->removeComponent('field_image') + * ->save(); + * @endcode + * + * @param string $entity_type + * The entity type. + * @param string $bundle + * The bundle. + * @param string $form_mode + * (optional) The form mode. Defaults to 'default'. + * + * @todo Make the $form_mode parameter non-optional by introducing the form + * modes concept. + * + * @return \Drupal\entity\Plugin\Core\Entity\EntityFormDisplay + * The EntityFormDisplay object associated to the form mode. + */ +function entity_get_form_display($entity_type, $bundle, $form_mode = 'default') { + // Try loading the entity from configuration. + $entity_form_display = entity_load('entity_form_display', $entity_type . '.' . $bundle . '.' . $form_mode); + + // If not found, create a fresh entity object. We do not preemptively create + // new EntityFormDisplay configuration entries for each existing entity type + // and bundle whenever a new form mode becomes available. Instead, + // configuration entries are only created when a EntityFormDisplay object is + // explicitly configured and saved. + if (!$entity_form_display) { + $entity_form_display = entity_create('entity_form_display', array( + 'targetEntityType' => $entity_type, + 'bundle' => $bundle, + 'displayMode' => $form_mode, + )); + } + + return $entity_form_display; +} + +/** * Returns the entity query object for this entity type. * * @param $entity_type diff --git a/core/modules/block/block.install b/core/modules/block/block.install index b1fc925..1eee21e 100644 --- a/core/modules/block/block.install +++ b/core/modules/block/block.install @@ -270,11 +270,19 @@ function block_update_8008() { 'entity_type' => 'custom_block', 'bundle' => 'basic', 'label' => 'Block body', - 'widget' => array('type' => 'text_textarea_with_summary'), 'settings' => array('display_summary' => FALSE), ); _update_7000_field_create_instance($body_field, $instance); + module_load_install('entity'); + // Assign form settings for the 'default' form mode. + $form_display = _update_8000_entity_get_form_display('custom_block', 'basic', 'default'); + $form_display->set('content.user_picture', array( + 'type' => 'text_textarea_with_summary', + )) + ->save(); + update_config_manifest_add('entity.form_display', array($form_display->get('id'))); + // Initialize state for future calls. $sandbox['last'] = 0; $sandbox['count'] = 0; diff --git a/core/modules/block/custom_block/custom_block.module b/core/modules/block/custom_block/custom_block.module index a3ce18c..2f69788 100644 --- a/core/modules/block/custom_block/custom_block.module +++ b/core/modules/block/custom_block/custom_block.module @@ -237,11 +237,17 @@ function custom_block_add_body_field($block_type_id, $label = 'Block body') { 'entity_type' => 'custom_block', 'bundle' => $block_type_id, 'label' => $label, - 'widget' => array('type' => 'text_textarea_with_summary'), 'settings' => array('display_summary' => FALSE), ); $instance = field_create_instance($instance); + // Assign widget settings for the 'default' form mode. + entity_get_form_display('custom_block', $block_type_id, 'default') + ->setComponent('block_body', array( + 'type' => 'text_textarea_with_summary', + )) + ->save(); + // Assign display settings for 'default' view mode. entity_get_display('custom_block', $block_type_id, 'default') ->setComponent('block_body', array( diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module index dd87b29..604111b 100644 --- a/core/modules/comment/comment.module +++ b/core/modules/comment/comment.module @@ -386,6 +386,15 @@ function _comment_body_field_create($info) { 'required' => TRUE, ); field_create_instance($instance); + + // Assign widget settings for the 'default' form mode. + entity_get_form_display('comment', 'comment_node_' . $info->type, 'default') + ->setComponent('comment_body', array( + 'type' => 'text_textarea', + )) + ->save(); + + // Assign display settings for the 'default' view mode. entity_get_display('comment', 'comment_node_' . $info->type, 'default') ->setComponent('comment_body', array( 'label' => 'hidden', diff --git a/core/modules/datetime/datetime.module b/core/modules/datetime/datetime.module index 79905f8..b545c36 100644 --- a/core/modules/datetime/datetime.module +++ b/core/modules/datetime/datetime.module @@ -134,9 +134,7 @@ function datetime_field_settings_form($field, $instance, $has_data) { * Implements hook_field_instance_settings_form(). */ function datetime_field_instance_settings_form($field, $instance) { - $widget = $instance['widget']; $settings = $instance['settings']; - $widget_settings = $instance['widget']['settings']; $form['default_value'] = array( '#type' => 'select', diff --git a/core/modules/datetime/lib/Drupal/datetime/Tests/DateTimeFieldTest.php b/core/modules/datetime/lib/Drupal/datetime/Tests/DateTimeFieldTest.php index 232d019..081c191 100644 --- a/core/modules/datetime/lib/Drupal/datetime/Tests/DateTimeFieldTest.php +++ b/core/modules/datetime/lib/Drupal/datetime/Tests/DateTimeFieldTest.php @@ -58,15 +58,19 @@ function setUp() { 'field_name' => $this->field['field_name'], 'entity_type' => 'test_entity', 'bundle' => 'test_bundle', - 'widget' => array( - 'type' => 'datetime_default', - ), 'settings' => array( 'default_value' => 'blank', ), ); field_create_instance($this->instance); + $this->form_display_options = array( + 'type' => 'datetime_default', + ); + entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default') + ->setComponent($this->field['field_name'], $this->form_display_options) + ->save(); + $this->display_options = array( 'type' => 'datetime_default', 'label' => 'hidden', @@ -219,17 +223,17 @@ function testDatelistWidget() { field_update_field($this->field); // Change the widget to a datelist widget. - $increment = 1; - $date_order = 'YMD'; - $time_type = '12'; - - $this->instance['widget']['type'] = 'datetime_datelist'; - $this->instance['widget']['settings'] = array( - 'increment' => $increment, - 'date_order' => $date_order, - 'time_type' => $time_type, + $this->form_display_options = array( + 'type' => 'datetime_datelist', + 'settings' => array( + 'increment' => 1, + 'date_order' => 'YMD', + 'time_type' => '12', + ), ); - field_update_instance($this->instance); + entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default') + ->setComponent($this->instance['field_name'], $this->form_display_options) + ->save(); field_cache_clear(); // Display creation form. diff --git a/core/modules/edit/lib/Drupal/edit/Tests/EditTestBase.php b/core/modules/edit/lib/Drupal/edit/Tests/EditTestBase.php index 6ac8b3b..0a3704c 100644 --- a/core/modules/edit/lib/Drupal/edit/Tests/EditTestBase.php +++ b/core/modules/edit/lib/Drupal/edit/Tests/EditTestBase.php @@ -74,13 +74,16 @@ function createFieldWithInstance($field_name, $type, $cardinality, $label, $inst 'description' => $label, 'weight' => mt_rand(0, 127), 'settings' => $instance_settings, - 'widget' => array( + ); + field_create_instance($this->$instance); + + entity_get_form_display('entity_test', 'entity_test', 'default') + ->setComponent($field_name, array( 'type' => $widget_type, 'label' => $label, 'settings' => $widget_settings, - ), - ); - field_create_instance($this->$instance); + )) + ->save(); entity_get_display('entity_test', 'entity_test', 'default') ->setComponent($field_name, array( diff --git a/core/modules/email/lib/Drupal/email/Tests/EmailFieldTest.php b/core/modules/email/lib/Drupal/email/Tests/EmailFieldTest.php index c719c97..dbb2bed 100644 --- a/core/modules/email/lib/Drupal/email/Tests/EmailFieldTest.php +++ b/core/modules/email/lib/Drupal/email/Tests/EmailFieldTest.php @@ -54,14 +54,18 @@ function testEmailField() { 'field_name' => $this->field['field_name'], 'entity_type' => 'test_entity', 'bundle' => 'test_bundle', - 'widget' => array( + ); + field_create_instance($this->instance); + + // Create a form display for the default form mode. + entity_get_form_display('test_entity', 'test_bundle', 'default') + ->setComponent($this->field['field_name'], array( 'type' => 'email_default', 'settings' => array( 'placeholder' => 'example@example.com', ), - ), - ); - field_create_instance($this->instance); + )) + ->save(); // Create a display for the full view mode. entity_get_display('test_entity', 'test_bundle', 'full') ->setComponent($this->field['field_name'], array( diff --git a/core/modules/email/lib/Drupal/email/Tests/EmailItemTest.php b/core/modules/email/lib/Drupal/email/Tests/EmailItemTest.php index def99f1..1555b8d 100644 --- a/core/modules/email/lib/Drupal/email/Tests/EmailItemTest.php +++ b/core/modules/email/lib/Drupal/email/Tests/EmailItemTest.php @@ -44,11 +44,15 @@ public function setUp() { 'entity_type' => 'entity_test', 'field_name' => 'field_email', 'bundle' => 'entity_test', - 'widget' => array( - 'type' => 'email_default', - ), ); field_create_instance($this->instance); + + // Create a form display for the default form mode. + entity_get_form_display('entity_test', 'entity_test', 'default') + ->setComponent('field_email', array( + 'type' => 'email_default', + )) + ->save(); } /** diff --git a/core/modules/entity/entity.install b/core/modules/entity/entity.install index 2e1efd7..cd28c73 100644 --- a/core/modules/entity/entity.install +++ b/core/modules/entity/entity.install @@ -37,7 +37,46 @@ function _update_8000_entity_get_display($entity_type, $bundle, $view_mode) { 'uuid' => $uuid->generate(), 'targetEntityType' => $entity_type, 'bundle' => $bundle, - 'viewMode' => $view_mode, + 'displayMode' => $view_mode, + 'content' => array(), + ); + foreach ($properties as $key => $value) { + $config->set($key, $value); + } + return $config; +} + +/** + * Returns the raw configuration object for an EntityFormDisplay entity. + * + * The function returns the existing configuration entry if it exists, or + * creates a fresh structure. + * + * @param string $entity_type + * The entity type. + * @param string $bundle + * The bundle name. + * @param string $form_mode + * The form mode. + * + * @return \Drupal\Core\Config\Config + * The configuration object. + */ +function _update_8000_entity_get_form_display($entity_type, $bundle, $form_mode) { + $id = $entity_type . '.' . $bundle . '.' . $form_mode; + $config = config("entity.form_display.$id"); + if ($config->get()) { + return $config; + } + + // Initialize a fresh structure. + $uuid = new Uuid(); + $properties = array( + 'id' => $id, + 'uuid' => $uuid->generate(), + 'targetEntityType' => $entity_type, + 'bundle' => $bundle, + 'displayMode' => $form_mode, 'content' => array(), ); foreach ($properties as $key => $value) { diff --git a/core/modules/entity/entity.module b/core/modules/entity/entity.module index efb7e44..aa71c1d 100644 --- a/core/modules/entity/entity.module +++ b/core/modules/entity/entity.module @@ -7,3 +7,39 @@ * The module is mostly an anchor point for configuration items owned by the * entity system. */ + +use Drupal\Core\Config\Entity\ConfigStorageController; + +/** + * Implements hook_field_attach_rename_bundle(). + */ +function entity_field_attach_rename_bundle($entity_type, $bundle_old, $bundle_new) { + $entity_info = entity_get_info('entity_form_display'); + + // Rename entity displays. + if ($bundle_old !== $bundle_new) { + $ids = config_get_storage_names_with_prefix('entity.form_display.' . $entity_type . '.' . $bundle_old); + foreach ($ids as $id) { + $id = ConfigStorageController::getIDFromConfigName($id, $entity_info['config_prefix']); + $form_display = entity_load('entity_form_display', $id); + $new_id = $entity_type . '.' . $bundle_new . '.' . $form_display->displayMode; + $form_display->id = $new_id; + $form_display->bundle = $bundle_new; + $form_display->save(); + } + } +} + +/** + * Implements hook_field_attach_delete_bundle(). + */ +function entity_field_attach_delete_bundle($entity_type, $bundle, $instances) { + $entity_info = entity_get_info('entity_form_display'); + + // Remove entity displays of the deleted bundle. + $ids = config_get_storage_names_with_prefix('entity.form_display.' . $entity_type . '.' . $bundle); + foreach ($ids as &$id) { + $id = ConfigStorageController::getIDFromConfigName($id, $entity_info['config_prefix']); + } + entity_delete_multiple('entity_form_display', $ids); +} diff --git a/core/modules/entity/lib/Drupal/entity/Plugin/Core/Entity/EntityDisplay.php b/core/modules/entity/lib/Drupal/entity/EntityDisplayBase.php similarity index 68% copy from core/modules/entity/lib/Drupal/entity/Plugin/Core/Entity/EntityDisplay.php copy to core/modules/entity/lib/Drupal/entity/EntityDisplayBase.php index d88967f..1130dd1 100644 --- a/core/modules/entity/lib/Drupal/entity/Plugin/Core/Entity/EntityDisplay.php +++ b/core/modules/entity/lib/Drupal/entity/EntityDisplayBase.php @@ -2,32 +2,18 @@ /** * @file - * Contains \Drupal\entity\Plugin\Core\Entity\EntityDisplay. + * Contains \Drupal\entity\EntityDisplayBase. */ -namespace Drupal\entity\Plugin\Core\Entity; +namespace Drupal\entity; use Drupal\Core\Config\Entity\ConfigEntityBase; -use Drupal\Component\Annotation\Plugin; -use Drupal\Core\Annotation\Translation; /** - * Configuration entity that contains display options for all components of a - * rendered entity in a given view mode.. - * - * @Plugin( - * id = "entity_display", - * label = @Translation("Entity display"), - * module = "entity", - * controller_class = "Drupal\Core\Config\Entity\ConfigStorageController", - * config_prefix = "entity.display", - * entity_keys = { - * "id" = "id", - * "uuid" = "uuid" - * } - * ) + * Base class for config entity types that store configuration for entity forms + * and displays. */ -class EntityDisplay extends ConfigEntityBase { +abstract class EntityDisplayBase extends ConfigEntityBase { /** * Unique ID for the config entity. @@ -58,11 +44,11 @@ class EntityDisplay extends ConfigEntityBase { public $bundle; /** - * View mode to be displayed. + * View or form mode to be displayed. * * @var string */ - public $viewMode; + public $displayMode; /** * List of component display options, keyed by component name. @@ -72,19 +58,33 @@ class EntityDisplay extends ConfigEntityBase { protected $content = array(); /** - * The original view mode that was requested (case of view modes being - * configured to fall back to the 'default' display). + * The original view or form mode that was requested (case of view/form modes + * being configured to fall back to the 'default' display). * * @var string */ - public $originalViewMode; + public $originalDisplayMode; /** - * The formatter objects used for this display, keyed by field name. + * The plugin objects used for this display, keyed by field name. * * @var array */ - protected $formatters = array(); + protected $plugins = array(); + + /** + * Context in which this entity will be used (e.g. 'display', 'form'). + * + * @var string + */ + protected $displayContext; + + /** + * The plugin manager used by this entity type. + * + * @var \Drupal\Component\Plugin\PluginManagerBase + */ + protected $pluginManager; /** * Overrides \Drupal\Core\Config\Entity\ConfigEntityBase::__construct(). @@ -94,19 +94,28 @@ public function __construct(array $values, $entity_type) { // currently produces invalid entities with a NULL bundle in some cases. // Add the validity checks back when http://drupal.org/node/1856556 is // fixed. - // if (!isset($values['targetEntityType']) || !isset($values['bundle']) || !isset($values['viewMode'])) { - // throw new \InvalidArgumentException('Missing required properties for an EntiyDisplay entity.'); + // if (!isset($values['targetEntityType']) || !isset($values['bundle']) || !isset($values['displayMode'])) { + // throw new \InvalidArgumentException('Missing required properties for an EntityDisplay entity.'); // } + + // A plugin manager and a context type needs to be set by extending classes. + if (!isset($this->pluginManager)) { + throw new \RuntimeException('Missing plugin manager.'); + } + if (!isset($this->displayContext)) { + throw new \RuntimeException('Missing display context type.'); + } + parent::__construct($values, $entity_type); - $this->originalViewMode = $this->viewMode; + $this->originalDisplayMode = $this->displayMode; } /** * Overrides \Drupal\Core\Entity\Entity::id(). */ public function id() { - return $this->targetEntityType . '.' . $this->bundle . '.' . $this->viewMode; + return $this->targetEntityType . '.' . $this->bundle . '.' . $this->displayMode; } /** @@ -129,7 +138,7 @@ public function getExportProperties() { 'uuid', 'targetEntityType', 'bundle', - 'viewMode', + 'displayMode', 'content', ); $properties = array(); @@ -140,20 +149,20 @@ public function getExportProperties() { } /** - * Creates a duplicate of the EntityDisplay object on a different view mode. + * Creates a duplicate object on a different display mode. * * The new object necessarily has the same $targetEntityType and $bundle * properties than the original one. * - * @param $view_mode - * The view mode for the new object. + * @param $display_mode + * The display mode for the new object. * - * @return \Drupal\entity\Plugin\Core\Entity\EntityDisplay + * @return \Drupal\entity\EntityDisplayBase * The new object. */ - public function createCopy($view_mode) { + public function createCopy($display_mode) { $display = $this->createDuplicate(); - $display->viewMode = $display->originalViewMode = $view_mode; + $display->displayMode = $display->originalDisplayMode = $display_mode; return $display; } @@ -186,7 +195,7 @@ public function getComponents() { */ public function getComponent($name) { // We always store 'extra fields', whether they are visible or hidden. - $extra_fields = field_info_extra_fields($this->targetEntityType, $this->bundle, 'display'); + $extra_fields = field_info_extra_fields($this->targetEntityType, $this->bundle, $this->displayContext); if (isset($extra_fields[$name])) { // If we have explicit settings, return an array or NULL depending on // visibility. @@ -239,14 +248,14 @@ public function setComponent($name, array $options = array()) { if ($instance = field_info_instance($this->targetEntityType, $name, $this->bundle)) { $field = field_info_field($instance['field_name']); - $options = drupal_container()->get('plugin.manager.field.formatter')->prepareConfiguration($field['type'], $options); + $options = $this->pluginManager->prepareConfiguration($field['type'], $options); // Clear the persisted formatter, if any. - unset($this->formatters[$name]); + unset($this->plugins[$name]); } // We always store 'extra fields', whether they are visible or hidden. - $extra_fields = field_info_extra_fields($this->targetEntityType, $this->bundle, 'display'); + $extra_fields = field_info_extra_fields($this->targetEntityType, $this->bundle, $this->displayContext); if (isset($extra_fields[$name])) { $options['visible'] = TRUE; } @@ -266,7 +275,7 @@ public function setComponent($name, array $options = array()) { * The EntityDisplay object. */ public function removeComponent($name) { - $extra_fields = field_info_extra_fields($this->targetEntityType, $this->bundle, 'display'); + $extra_fields = field_info_extra_fields($this->targetEntityType, $this->bundle, $this->displayContext); if (isset($extra_fields[$name])) { // 'Extra fields' are exposed in hooks and can appear at any given time. // Therefore we store extra fields that are explicitly being hidden, so @@ -278,7 +287,7 @@ public function removeComponent($name) { } else { unset($this->content[$name]); - unset($this->formatters[$name]); + unset($this->plugins[$name]); } return $this; @@ -302,44 +311,8 @@ public function getHighestWeight() { } // Let other modules feedback about their own additions. - $weights = array_merge($weights, module_invoke_all('field_info_max_weight', $this->targetEntityType, $this->bundle, $this->viewMode)); + $weights = array_merge($weights, module_invoke_all('field_info_max_weight', $this->targetEntityType, $this->bundle, $this->displayContext, $this->displayMode)); return $weights ? max($weights) : NULL; } - - /** - * Returns the Formatter plugin for a field. - * - * @param string $field_name - * The field name. - * - * @return \Drupal\field\Plugin\Type\Formatter\FormatterInterface - * If the field is not hidden, the Formatter plugin to use for rendering - * it. - */ - public function getFormatter($field_name) { - if (isset($this->formatters[$field_name])) { - return $this->formatters[$field_name]; - } - - // Instantiate the formatter object from the stored display properties. - if ($configuration = $this->getComponent($field_name)) { - $instance = field_info_instance($this->targetEntityType, $field_name, $this->bundle); - $formatter = drupal_container()->get('plugin.manager.field.formatter')->getInstance(array( - 'instance' => $instance, - 'view_mode' => $this->originalViewMode, - // No need to prepare, defaults have been merged in setComponent(). - 'prepare' => FALSE, - 'configuration' => $configuration - )); - } - else { - $formatter = NULL; - } - - // Persist the formatter object. - $this->formatters[$field_name] = $formatter; - return $formatter; - } - } diff --git a/core/modules/entity/lib/Drupal/entity/Plugin/Core/Entity/EntityDisplay.php b/core/modules/entity/lib/Drupal/entity/Plugin/Core/Entity/EntityDisplay.php index d88967f..9d59852 100644 --- a/core/modules/entity/lib/Drupal/entity/Plugin/Core/Entity/EntityDisplay.php +++ b/core/modules/entity/lib/Drupal/entity/Plugin/Core/Entity/EntityDisplay.php @@ -7,13 +7,14 @@ namespace Drupal\entity\Plugin\Core\Entity; -use Drupal\Core\Config\Entity\ConfigEntityBase; +use Drupal; use Drupal\Component\Annotation\Plugin; use Drupal\Core\Annotation\Translation; +use Drupal\entity\EntityDisplayBase; /** * Configuration entity that contains display options for all components of a - * rendered entity in a given view mode.. + * rendered entity in a given view mode. * * @Plugin( * id = "entity_display", @@ -27,284 +28,16 @@ * } * ) */ -class EntityDisplay extends ConfigEntityBase { +class EntityDisplay extends EntityDisplayBase { /** - * Unique ID for the config entity. - * - * @var string - */ - public $id; - - /** - * Unique UUID for the config entity. - * - * @var string - */ - public $uuid; - - /** - * Entity type to be displayed. - * - * @var string - */ - public $targetEntityType; - - /** - * Bundle to be displayed. - * - * @var string - */ - public $bundle; - - /** - * View mode to be displayed. - * - * @var string - */ - public $viewMode; - - /** - * List of component display options, keyed by component name. - * - * @var array - */ - protected $content = array(); - - /** - * The original view mode that was requested (case of view modes being - * configured to fall back to the 'default' display). - * - * @var string - */ - public $originalViewMode; - - /** - * The formatter objects used for this display, keyed by field name. - * - * @var array - */ - protected $formatters = array(); - - /** - * Overrides \Drupal\Core\Config\Entity\ConfigEntityBase::__construct(). + * Overrides \Drupal\entity\EntityDisplayBase::__construct(). */ public function __construct(array $values, $entity_type) { - // @todo See http://drupal.org/node/1825044#comment-6847792: contact.module - // currently produces invalid entities with a NULL bundle in some cases. - // Add the validity checks back when http://drupal.org/node/1856556 is - // fixed. - // if (!isset($values['targetEntityType']) || !isset($values['bundle']) || !isset($values['viewMode'])) { - // throw new \InvalidArgumentException('Missing required properties for an EntiyDisplay entity.'); - // } - parent::__construct($values, $entity_type); - - $this->originalViewMode = $this->viewMode; - } - - /** - * Overrides \Drupal\Core\Entity\Entity::id(). - */ - public function id() { - return $this->targetEntityType . '.' . $this->bundle . '.' . $this->viewMode; - } - - /** - * Overrides \Drupal\config\ConfigEntityBase::save(). - */ - public function save() { - // Build an ID if none is set. - if (empty($this->id)) { - $this->id = $this->id(); - } - return parent::save(); - } + $this->pluginManager = Drupal::service('plugin.manager.field.formatter'); + $this->displayContext = 'display'; - /** - * Overrides \Drupal\config\ConfigEntityBase::getExportProperties(); - */ - public function getExportProperties() { - $names = array( - 'id', - 'uuid', - 'targetEntityType', - 'bundle', - 'viewMode', - 'content', - ); - $properties = array(); - foreach ($names as $name) { - $properties[$name] = $this->get($name); - } - return $properties; - } - - /** - * Creates a duplicate of the EntityDisplay object on a different view mode. - * - * The new object necessarily has the same $targetEntityType and $bundle - * properties than the original one. - * - * @param $view_mode - * The view mode for the new object. - * - * @return \Drupal\entity\Plugin\Core\Entity\EntityDisplay - * The new object. - */ - public function createCopy($view_mode) { - $display = $this->createDuplicate(); - $display->viewMode = $display->originalViewMode = $view_mode; - return $display; - } - - /** - * Gets the display options for all components. - * - * @return array - * The array of display options, keyed by component name. - */ - public function getComponents() { - $result = array(); - foreach ($this->content as $name => $options) { - if (!isset($options['visible']) || $options['visible'] === TRUE) { - unset($options['visible']); - $result[$name] = $options; - } - } - return $result; - } - - /** - * Gets the display options set for a component. - * - * @param string $name - * The name of the component. - * - * @return array|null - * The display options for the component, or NULL if the component is not - * displayed. - */ - public function getComponent($name) { - // We always store 'extra fields', whether they are visible or hidden. - $extra_fields = field_info_extra_fields($this->targetEntityType, $this->bundle, 'display'); - if (isset($extra_fields[$name])) { - // If we have explicit settings, return an array or NULL depending on - // visibility. - if (isset($this->content[$name])) { - if ($this->content[$name]['visible']) { - return array( - 'weight' => $this->content[$name]['weight'], - ); - } - else { - return NULL; - } - } - - // If no explicit settings for the extra field, look at the default - // visibility in its definition. - $definition = $extra_fields[$name]; - if (!isset($definition['visible']) || $definition['visible'] == TRUE) { - return array( - 'weight' => $definition['weight'] - ); - } - else { - return NULL; - } - } - - if (isset($this->content[$name])) { - return $this->content[$name]; - } - } - - /** - * Sets the display options for a component. - * - * @param string $name - * The name of the component. - * @param array $options - * The display options. - * - * @return \Drupal\entity\Plugin\Core\Entity\EntityDisplay - * The EntityDisplay object. - */ - public function setComponent($name, array $options = array()) { - // If no weight specified, make sure the field sinks at the bottom. - if (!isset($options['weight'])) { - $max = $this->getHighestWeight(); - $options['weight'] = isset($max) ? $max + 1 : 0; - } - - if ($instance = field_info_instance($this->targetEntityType, $name, $this->bundle)) { - $field = field_info_field($instance['field_name']); - $options = drupal_container()->get('plugin.manager.field.formatter')->prepareConfiguration($field['type'], $options); - - // Clear the persisted formatter, if any. - unset($this->formatters[$name]); - } - - // We always store 'extra fields', whether they are visible or hidden. - $extra_fields = field_info_extra_fields($this->targetEntityType, $this->bundle, 'display'); - if (isset($extra_fields[$name])) { - $options['visible'] = TRUE; - } - - $this->content[$name] = $options; - - return $this; - } - - /** - * Sets a component to be hidden. - * - * @param string $name - * The name of the component. - * - * @return \Drupal\entity\Plugin\Core\Entity\EntityDisplay - * The EntityDisplay object. - */ - public function removeComponent($name) { - $extra_fields = field_info_extra_fields($this->targetEntityType, $this->bundle, 'display'); - if (isset($extra_fields[$name])) { - // 'Extra fields' are exposed in hooks and can appear at any given time. - // Therefore we store extra fields that are explicitly being hidden, so - // that we can differenciate with those that are simply not configured - // yet. - $this->content[$name] = array( - 'visible' => FALSE, - ); - } - else { - unset($this->content[$name]); - unset($this->formatters[$name]); - } - - return $this; - } - - /** - * Returns the highest weight of the components in the display. - * - * @return int|null - * The highest weight of the components in the display, or NULL if the - * display is empty. - */ - public function getHighestWeight() { - $weights = array(); - - // Collect weights for the components in the display. - foreach ($this->content as $options) { - if (isset($options['weight'])) { - $weights[] = $options['weight']; - } - } - - // Let other modules feedback about their own additions. - $weights = array_merge($weights, module_invoke_all('field_info_max_weight', $this->targetEntityType, $this->bundle, $this->viewMode)); - - return $weights ? max($weights) : NULL; + parent::__construct($values, $entity_type); } /** @@ -318,16 +51,16 @@ public function getHighestWeight() { * it. */ public function getFormatter($field_name) { - if (isset($this->formatters[$field_name])) { - return $this->formatters[$field_name]; + if (isset($this->plugins[$field_name])) { + return $this->plugins[$field_name]; } // Instantiate the formatter object from the stored display properties. if ($configuration = $this->getComponent($field_name)) { $instance = field_info_instance($this->targetEntityType, $field_name, $this->bundle); - $formatter = drupal_container()->get('plugin.manager.field.formatter')->getInstance(array( + $formatter = $this->pluginManager->getInstance(array( 'instance' => $instance, - 'view_mode' => $this->originalViewMode, + 'view_mode' => $this->originalDisplayMode, // No need to prepare, defaults have been merged in setComponent(). 'prepare' => FALSE, 'configuration' => $configuration @@ -338,8 +71,7 @@ public function getFormatter($field_name) { } // Persist the formatter object. - $this->formatters[$field_name] = $formatter; + $this->plugins[$field_name] = $formatter; return $formatter; } - } diff --git a/core/modules/entity/lib/Drupal/entity/Plugin/Core/Entity/EntityFormDisplay.php b/core/modules/entity/lib/Drupal/entity/Plugin/Core/Entity/EntityFormDisplay.php new file mode 100644 index 0000000..eb9a280 --- /dev/null +++ b/core/modules/entity/lib/Drupal/entity/Plugin/Core/Entity/EntityFormDisplay.php @@ -0,0 +1,86 @@ +pluginManager = Drupal::service('plugin.manager.field.widget'); + $this->displayContext = 'form'; + + parent::__construct($values, $entity_type); + } + + /** + * Returns the Widget plugin for a field. + * + * @param string $field_name + * The field name. + * + * @return \Drupal\field\Plugin\Type\Widget\WidgetInterface|null + * A Widget plugin or NULL if the field does not exist. + */ + public function getWidget($field_name) { + if (isset($this->plugins[$field_name])) { + return $this->plugins[$field_name]; + } + + // Check if this field actually exists. + if ($instance = field_info_instance($this->targetEntityType, $field_name, $this->bundle)) { + // Try to get the widget configuration from the stored display properties. + if (!$configuration = $this->getComponent($field_name)) { + // We don't store hidden fields but we need to use the 'Hidden' widget + // for them. + $configuration = array( + 'type' => 'hidden', + 'settings' => array(), + 'weight' => 0, + ); + } + + $widget = $this->pluginManager->getInstance(array( + 'instance' => $instance, + 'form_mode' => $this->originalDisplayMode, + // No need to prepare, defaults have been merged in setComponent(). + 'prepare' => FALSE, + 'configuration' => $configuration + )); + } + else { + $widget = NULL; + } + + // Persist the widget object. + $this->plugins[$field_name] = $widget; + return $widget; + } +} diff --git a/core/modules/entity/lib/Drupal/entity/Tests/EntityDisplayTest.php b/core/modules/entity/lib/Drupal/entity/Tests/EntityDisplayTest.php index 3396f89..7ea876a 100644 --- a/core/modules/entity/lib/Drupal/entity/Tests/EntityDisplayTest.php +++ b/core/modules/entity/lib/Drupal/entity/Tests/EntityDisplayTest.php @@ -37,7 +37,7 @@ public function testEntityDisplayCRUD() { $display = entity_create('entity_display', array( 'targetEntityType' => 'entity_test', 'bundle' => 'entity_test', - 'viewMode' => 'default', + 'displayMode' => 'default', )); $expected = array(); @@ -82,7 +82,7 @@ public function testEntityDisplayCRUD() { $new_display = entity_load('entity_display', $new_display->id()); $this->assertEqual($new_display->targetEntityType, $display->targetEntityType); $this->assertEqual($new_display->bundle, $display->bundle); - $this->assertEqual($new_display->viewMode, 'other_view_mode'); + $this->assertEqual($new_display->displayMode, 'other_view_mode'); $this->assertEqual($new_display->getComponents(), $display->getComponents()); } @@ -113,7 +113,7 @@ public function testExtraFieldComponent() { $display = entity_create('entity_display', array( 'targetEntityType' => 'entity_test', 'bundle' => 'entity_test', - 'viewMode' => 'default', + 'displayMode' => 'default', )); // Check that the default visibility taken into account for extra fields @@ -137,7 +137,7 @@ public function testFieldComponent() { $display = entity_create('entity_display', array( 'targetEntityType' => 'entity_test', 'bundle' => 'entity_test', - 'viewMode' => 'default', + 'displayMode' => 'default', )); // Create a field and an instance. 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 a5b41af..e46a349 100644 --- a/core/modules/entity_reference/lib/Drupal/entity_reference/EntityReferenceAutocomplete.php +++ b/core/modules/entity_reference/lib/Drupal/entity_reference/EntityReferenceAutocomplete.php @@ -77,7 +77,8 @@ public function getMatches($field, $instance, $entity_type, $entity_id = '', $pr if (isset($string)) { // Get an array of matching entities. - $match_operator = !empty($instance['widget']['settings']['match_operator']) ? $instance['widget']['settings']['match_operator'] : 'CONTAINS'; + $widget = entity_get_form_display($instance['entity_type'], $instance['bundle'])->getComponent($instance['field_name']); + $match_operator = !empty($widget['settings']['match_operator']) ? $widget['settings']['match_operator'] : 'CONTAINS'; $entity_labels = $handler->getReferencableEntities($string, $match_operator, 10); // Loop through the entities and convert them into autocomplete output. diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAutoCreateTest.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAutoCreateTest.php index d7b2d84..bcf3763 100644 --- a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAutoCreateTest.php +++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAutoCreateTest.php @@ -66,6 +66,12 @@ function setUp() { ); field_create_instance($instance); + + entity_get_form_display('node', $referencing->type, 'default') + ->setComponent('test_field', array( + 'type' => 'entity_reference_autocomplete', + )) + ->save(); } /** diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAutocompleteTest.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAutocompleteTest.php index 70961b0..8f22ce6 100644 --- a/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAutocompleteTest.php +++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Tests/EntityReferenceAutocompleteTest.php @@ -44,9 +44,6 @@ function setUp() { 'field_name' => $this->field_name, 'bundle' => 'article', 'entity_type' => 'node', - 'widget' => array( - 'type' => 'options_select', - ), 'settings' => array( 'handler' => 'default', 'handler_settings' => array( diff --git a/core/modules/field/field.api.php b/core/modules/field/field.api.php index 1cf252d..d50fc8a 100644 --- a/core/modules/field/field.api.php +++ b/core/modules/field/field.api.php @@ -24,7 +24,7 @@ * @see _field_extra_fields_pre_render() * @see hook_field_extra_fields_alter() * - * @return + * @return array * A nested array of 'pseudo-field' components. Each list is nested within the * following keys: entity type, bundle name, context (either 'form' or * 'display'). The keys are the name of the elements as appearing in the @@ -33,8 +33,7 @@ * - label: The human readable name of the component. * - description: A short description of the component contents. * - weight: The default weight of the element. - * - visible: The default visibility of the element. Only for 'display' - * context. + * - visible: The default visibility of the element. */ function hook_field_extra_fields() { $extra = array(); @@ -777,38 +776,6 @@ function hook_field_widget_WIDGET_TYPE_form_alter(&$element, &$form_state, $cont } /** - * Alters the widget properties of a field instance before it gets displayed. - * - * Note that instead of hook_field_widget_properties_alter(), which is called - * for all fields on all entity types, - * hook_field_widget_properties_ENTITY_TYPE_alter() may be used to alter widget - * properties for fields on a specific entity type only. - * - * This hook is called once per field per added or edit entity. If the result - * of the hook involves reading from the database, it is highly recommended to - * statically cache the information. - * - * @param array $widget_properties - * The instance's widget properties. - * @param array $context - * An associative array containing: - * - entity_type: The entity type, e.g., 'node' or 'user'. - * - bundle: The bundle, e.g., 'page' or 'article'. - * - field: The field that the widget belongs to. - * - instance: The instance of the field. - * - * @see hook_field_widget_properties_ENTITY_TYPE_alter() - */ -function hook_field_widget_properties_alter(array &$widget_properties, array $context) { - // Change a widget's type according to the time of day. - $field = $context['field']; - if ($context['entity_type'] == 'node' && $field['field_name'] == 'field_foo') { - $time = date('H'); - $widget_properties['type'] = $time < 12 ? 'widget_am' : 'widget_pm'; - } -} - -/** * @} End of "defgroup field_widget". */ @@ -1873,21 +1840,24 @@ function hook_field_storage_pre_update(\Drupal\Core\Entity\EntityInterface $enti * Field API takes care of fields and 'extra_fields'. This hook is intended for * third-party modules adding other entity components (e.g. field_group). * - * @param $entity_type + * @param string $entity_type * The type of entity; e.g. 'node' or 'user'. - * @param $bundle + * @param string $bundle * The bundle name. - * @param $context - * The context for which the maximum weight is requested. Either 'form', or - * the name of a view mode. - * @return + * @param string $context + * The context for which the maximum weight is requested. Either 'form' or + * 'display'. + * @param string $context_mode + * The view or form mode name. + * + * @return int * The maximum weight of the entity's components, or NULL if no components * were found. */ -function hook_field_info_max_weight($entity_type, $bundle, $context) { +function hook_field_info_max_weight($entity_type, $bundle, $context, $context_mode) { $weights = array(); - foreach (my_module_entity_additions($entity_type, $bundle, $context) as $addition) { + foreach (my_module_entity_additions($entity_type, $bundle, $context, $context_mode) as $addition) { $weights[] = $addition['weight']; } diff --git a/core/modules/field/field.attach.inc b/core/modules/field/field.attach.inc index 69102f4..20389e5 100644 --- a/core/modules/field/field.attach.inc +++ b/core/modules/field/field.attach.inc @@ -8,6 +8,7 @@ use Drupal\field\FieldValidationException; use Drupal\Core\Entity\EntityInterface; use Drupal\entity\Plugin\Core\Entity\EntityDisplay; +use Drupal\entity\Plugin\Core\Entity\EntityFormDisplay; /** * @defgroup field_storage Field Storage API @@ -704,12 +705,15 @@ function _field_invoke_get_instances($entity_type, $bundle, $options) { * * Used to invoke methods on an instance's widget. * + * @param \Drupal\entity\Plugin\Core\Entity\EntityFormDisplay $entity_form_display + * An EntityFormDisplay object. + * * @return callable $target_function * A 'target function' for field_invoke_method(). */ -function _field_invoke_widget_target() { - return function ($instance) { - return $instance->getWidget(); +function _field_invoke_widget_target($entity_form_display) { + return function ($instance) use ($entity_form_display) { + return $entity_form_display->getWidget($instance['field_name']); }; } @@ -824,9 +828,12 @@ function field_attach_form(EntityInterface $entity, &$form, &$form_state, $langc // Set #parents to 'top-level' by default. $form += array('#parents' => array()); + // Get the entity_form_display object for this bundle. + $entity_form_display = entity_get_form_display($entity->entityType(), $entity->bundle()); + // If no language is provided use the default site language. $options['langcode'] = field_valid_language($langcode); - $form += (array) field_invoke_method('form', _field_invoke_widget_target(), $entity, $form, $form_state, $options); + $form += (array) field_invoke_method('form', _field_invoke_widget_target($entity_form_display), $entity, $form, $form_state, $options); // Add custom weight handling. $form['#pre_render'][] = '_field_extra_fields_pre_render'; @@ -1091,7 +1098,8 @@ function field_attach_form_validate(EntityInterface $entity, $form, &$form_state field_form_set_state($form['#parents'], $field_name, $langcode, $form_state, $field_state); } } - field_invoke_method('flagErrors', _field_invoke_widget_target(), $entity, $form, $form_state, $options); + $entity_form_display = entity_get_form_display($entity->entityType(), $entity->bundle()); + field_invoke_method('flagErrors', _field_invoke_widget_target($entity_form_display), $entity, $form, $form_state, $options); } } @@ -1115,7 +1123,8 @@ function field_attach_form_validate(EntityInterface $entity, $form, &$form_state */ function field_attach_extract_form_values(EntityInterface $entity, $form, &$form_state, array $options = array()) { // Extract field values from submitted values. - field_invoke_method('extractFormValues', _field_invoke_widget_target(), $entity, $form, $form_state, $options); + $entity_form_display = entity_get_form_display($entity->entityType(), $entity->bundle()); + field_invoke_method('extractFormValues', _field_invoke_widget_target($entity_form_display), $entity, $form, $form_state, $options); // Let other modules act on submitting the entity. // Avoid module_invoke_all() to let $form_state be taken by reference. @@ -1431,7 +1440,7 @@ function field_attach_view(EntityInterface $entity, EntityDisplay $display, $lan $entity = $entity->getOriginalEntity(); // Let other modules alter the renderable array. - $view_mode = $display->originalViewMode; + $view_mode = $display->originalDisplayMode; $context = array( 'entity' => $entity, 'view_mode' => $view_mode, diff --git a/core/modules/field/field.crud.inc b/core/modules/field/field.crud.inc index f6ee8a2..0ae76b1 100644 --- a/core/modules/field/field.crud.inc +++ b/core/modules/field/field.crud.inc @@ -576,7 +576,6 @@ function field_update_instance($instance) { */ function _field_write_instance(&$instance, $update = FALSE) { $field = field_read_field($instance['field_name']); - $field_type = field_info_field_types($field['type']); // Temporary workaround to allow incoming $instance as arrays or classed // objects. @@ -589,7 +588,6 @@ function _field_write_instance(&$instance, $update = FALSE) { // Set defaults. $instance += array( 'settings' => array(), - 'widget' => array(), 'required' => FALSE, 'label' => $instance['field_name'], 'description' => '', @@ -599,22 +597,6 @@ function _field_write_instance(&$instance, $update = FALSE) { // Set default instance settings. $instance['settings'] += field_info_instance_settings($field['type']); - // Set default widget and settings. - $instance['widget'] += array( - // TODO: what if no 'default_widget' specified ? - 'type' => $field_type['default_widget'], - 'settings' => array(), - ); - // If no weight specified, make sure the field sinks at the bottom. - if (!isset($instance['widget']['weight'])) { - $max_weight = field_info_max_weight($instance['entity_type'], $instance['bundle'], 'form'); - $instance['widget']['weight'] = isset($max_weight) ? $max_weight + 1 : 0; - } - // Check widget module. - $widget_type = field_info_widget_types($instance['widget']['type']); - $instance['widget']['module'] = $widget_type['module']; - $instance['widget']['settings'] += field_info_widget_settings($instance['widget']['type']); - // The serialized 'data' column contains everything from $instance that does // not have its own column and is not automatically populated when the // instance is read. diff --git a/core/modules/field/field.info.inc b/core/modules/field/field.info.inc index b422b47..c144b37 100644 --- a/core/modules/field/field.info.inc +++ b/core/modules/field/field.info.inc @@ -59,6 +59,8 @@ function field_info_cache_clear() { // functions are moved to the entity API. entity_info_cache_clear(); + entity_get_controller('entity_form_display')->resetCache(); + _field_info_collate_types_reset(); _field_info_field_cache()->flush(); } @@ -153,20 +155,23 @@ function _field_info_collate_types_reset() { /** * Determines the behavior of a widget with respect to an operation. * - * @param $op - * The name of the operation. Currently supported: 'default value', 'multiple - * values'. - * @param $instance + * @param string $op + * The name of the operation. Currently supported: 'default_value', + * 'multiple_values'. + * @param array $instance * The field instance array. * - * @return + * @return int * One of these values: * - FIELD_BEHAVIOR_NONE: Do nothing for this operation. * - FIELD_BEHAVIOR_CUSTOM: Use the widget's callback function. * - FIELD_BEHAVIOR_DEFAULT: Use field.module default behavior. */ function field_behaviors_widget($op, $instance) { - $info = field_info_widget_types($instance['widget']['type']); + $info = array(); + if ($component = entity_get_form_display($instance['entity_type'], $instance['bundle'])->getComponent($instance['field_name'])) { + $info = field_info_widget_types($component['type']); + } return isset($info[$op]) ? $info[$op] : FIELD_BEHAVIOR_DEFAULT; } @@ -497,40 +502,6 @@ function field_info_extra_fields($entity_type, $bundle, $context) { } /** - * Returns the maximum weight of all the components in a form entity. - * - * This includes fields, 'extra_fields', and other components added by - * third-party modules (e.g. field_group). - * - * @param $entity_type - * The type of entity; e.g. 'node' or 'user'. - * @param $bundle - * The bundle name. - * - * @return - * The maximum weight of the entity's components, or NULL if no components - * were found. - */ -function field_info_max_weight($entity_type, $bundle) { - $weights = array(); - - // Collect weights for fields. - foreach (field_info_instances($entity_type, $bundle) as $instance) { - $weights[] = $instance['widget']['weight']; - } - // Collect weights for extra fields. - foreach (field_info_extra_fields($entity_type, $bundle, 'form') as $extra) { - $weights[] = $extra['weight']; - } - - // Let other modules feedback about their own additions. - $weights = array_merge($weights, module_invoke_all('field_info_max_weight', $entity_type, $bundle, 'form')); - $max_weight = $weights ? max($weights) : NULL; - - return $max_weight; -} - -/** * Returns a field type's default settings. * * @param $type diff --git a/core/modules/field/field.install b/core/modules/field/field.install index 695fd89..bbe1877 100644 --- a/core/modules/field/field.install +++ b/core/modules/field/field.install @@ -394,12 +394,12 @@ function field_update_8001() { } /** - * Migrate all instance display settings to configuration. + * Migrate all instance widget and display settings to configuration. * * @ingroup config_upgrade */ function field_update_8002() { - $displays = array(); + $form_displays = $displays = array(); module_load_install('entity'); $query = db_select('field_config_instance', 'fc')->fields('fc'); @@ -410,10 +410,23 @@ function field_update_8002() { // Skip field instances that were created directly with the new API earlier // in the upgrade path. - if (!isset($data['display'])) { + if (!isset($data['widget']) && !isset($data['display'])) { continue; } + // Migrate 'widget' settings. + $widget_options = $data['widget']; + // Determine name and create initial entry in the $form_displays array. + $form_display_id = $record->entity_type . '.' . $record->bundle . '.default'; + if (!isset($form_displays[$form_display_id])) { + $form_displays[$form_display_id] = _update_8000_entity_get_display($record->entity_type, $record->bundle, 'default'); + } + + // We do not need the 'module' key anymore. + unset($widget_options['module']); + $form_displays[$form_display_id]->set("content.$record->field_name", $widget_options); + + // Migrate 'display' settings. foreach ($data['display'] as $view_mode => $display_options) { // Determine name and create initial entry in the $displays array if it // does not exist yet. @@ -430,8 +443,9 @@ function field_update_8002() { } } - // Remove the 'display' key and save the record back into the table. - unset($data['display']); + // Remove the 'widget' and 'display' keys and save the record back into the + // table. + unset($data['display'], $data['widget']); db_update('field_config_instance') ->condition('id', $record->id) ->fields(array( @@ -448,6 +462,19 @@ function field_update_8002() { if (preg_match('/field_bundle_settings_(.*)__(.*)/', $variable_name, $matches)) { $entity_type = $matches[1]; $bundle = $matches[2]; + + if (isset($variable_value['extra_fields']['form'])) { + foreach ($variable_value['extra_fields']['form'] as $field_name => $field_settings) { + // Determine name and create initial entry in the $form_displays + // array if it does not exist yet. + $form_display_id = $record->entity_type . '.' . $record->bundle . '.default'; + if (!isset($form_displays[$form_display_id])) { + $form_displays[$form_display_id] = _update_8000_entity_get_display($record->entity_type, $record->bundle, 'default'); + } + $form_displays[$form_display_id]->set("content.$field_name", $variable_value['extra_fields']['form']); + } + } + if (isset($variable_value['extra_fields']['display'])) { foreach ($variable_value['extra_fields']['display'] as $field_name => $field_settings) { foreach ($field_settings as $view_mode => $display_options) { @@ -476,6 +503,12 @@ function field_update_8002() { } } + // Save the form displays to configuration. + foreach ($form_displays as $config) { + $config->save(); + } + update_config_manifest_add('entity.form_display', array_keys($form_displays)); + // Save the displays to configuration. foreach ($displays as $config) { $config->save(); diff --git a/core/modules/field/field.module b/core/modules/field/field.module index 3435e73..176be31 100644 --- a/core/modules/field/field.module +++ b/core/modules/field/field.module @@ -705,10 +705,6 @@ function field_bundle_settings($entity_type, $bundle, $settings = NULL) { $settings = variable_get('field_bundle_settings_' . $entity_type . '__' . $bundle, array()); $settings += array( 'view_modes' => array(), - 'extra_fields' => array(), - ); - $settings['extra_fields'] += array( - 'form' => array(), ); return $settings; diff --git a/core/modules/field/lib/Drupal/field/FieldInfo.php b/core/modules/field/lib/Drupal/field/FieldInfo.php index 7ff6850..054e699 100644 --- a/core/modules/field/lib/Drupal/field/FieldInfo.php +++ b/core/modules/field/lib/Drupal/field/FieldInfo.php @@ -513,7 +513,7 @@ public function prepareInstance($instance, $field_type) { $instance['settings'] += field_info_instance_settings($field_type); // Set a default value for the instance. - if (field_behaviors_widget('default value', $instance) == FIELD_BEHAVIOR_DEFAULT && !isset($instance['default_value'])) { + if (!isset($instance['default_value']) && field_behaviors_widget('default_value', $instance) == FIELD_BEHAVIOR_DEFAULT) { $instance['default_value'] = NULL; } diff --git a/core/modules/field/lib/Drupal/field/FieldInstance.php b/core/modules/field/lib/Drupal/field/FieldInstance.php index ba6ea44..8d40439 100644 --- a/core/modules/field/lib/Drupal/field/FieldInstance.php +++ b/core/modules/field/lib/Drupal/field/FieldInstance.php @@ -37,37 +37,6 @@ public function __construct(array $definition) { } /** - * Returns the Widget plugin for the instance. - * - * @return Drupal\field\Plugin\Type\Widget\WidgetInterface - * The Widget plugin to be used for the instance. - */ - public function getWidget() { - if (empty($this->widget)) { - $widget_properties = $this->definition['widget']; - - // Let modules alter the widget properties. - $context = array( - 'entity_type' => $this->definition['entity_type'], - 'bundle' => $this->definition['bundle'], - 'field' => field_info_field($this->definition['field_name']), - 'instance' => $this, - ); - drupal_alter(array('field_widget_properties', 'field_widget_properties_' . $this->definition['entity_type']), $widget_properties, $context); - - $options = array( - 'instance' => $this, - 'type' => $widget_properties['type'], - 'settings' => $widget_properties['settings'], - 'weight' => $widget_properties['weight'], - ); - $this->widget = drupal_container()->get('plugin.manager.field.widget')->getInstance($options); - } - - return $this->widget; - } - - /** * Implements ArrayAccess::offsetExists(). */ public function offsetExists($offset) { @@ -90,12 +59,6 @@ public function offsetSet($offset, $value) { return; } $this->definition[$offset] = $value; - - // If the widget or formatter properties changed, the corrsponding plugins - // need to be re-instanciated. - if ($offset == 'widget') { - unset($this->widget); - } } /** @@ -103,12 +66,6 @@ public function offsetSet($offset, $value) { */ public function offsetUnset($offset) { unset($this->definition[$offset]); - - // If the widget or formatter properties changed, the corrsponding plugins - // need to be re-instanciated. - if ($offset == 'widget') { - unset($this->widget); - } } /** 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 b60552e..6f328c8 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 @@ -292,6 +292,7 @@ protected function formSingleElement(EntityInterface $entity, array $items, $del 'form' => $form, 'field' => $field, 'instance' => $instance, + 'entity_form_display' => entity_get_form_display($instance['entity_type'], $instance['bundle']), 'langcode' => $langcode, 'items' => $items, 'delta' => $delta, 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 7014acc..1f1a97c 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 @@ -46,30 +46,80 @@ public function __construct($namespaces) { } /** - * Overrides Drupal\Component\Plugin\PluginManagerBase::getInstance(). + * Overrides PluginManagerBase::getInstance(). + * + * @param array $options + * An array with the following key/value pairs: + * - instance: (FieldInstance) The field instance. + * - form_mode: (string) The form mode. + * - prepare: (bool, optional) Whether default values should get merged in + * the 'configuration' array. Defaults to TRUE. + * - configuration: (array) the configuration for the widget. The + * following key value pairs are allowed, and are all optional if + * 'prepare' is TRUE: + * - type: (string) The widget to use. Defaults to the + * 'default_widget' for the field type, specified in + * hook_field_info(). The default widget will also be used if the + * requested widget is not available. + * - settings: (array) Settings specific to the widget. Each setting + * defaults to the default value specified in the widget definition. + * + * @return \Drupal\field\Plugin\Type\Widget\WidgetInterface + * A Widget object. */ public function getInstance(array $options) { + $configuration = $options['configuration']; $instance = $options['instance']; - $type = $options['type']; - - $definition = $this->getDefinition($type); $field = field_info_field($instance['field_name']); + // Fill in default configuration if needed. + if (!isset($options['prepare']) || $options['prepare'] == TRUE) { + $configuration = $this->prepareConfiguration($field['type'], $configuration); + } + + $plugin_id = $configuration['type']; + // Switch back to default widget if either: // - $type_info doesn't exist (the widget type is unknown), // - the field type is not allowed for the widget. + $definition = $this->getDefinition($configuration['type']); if (!isset($definition['class']) || !in_array($field['type'], $definition['field_types'])) { // Grab the default widget for the field type. $field_type_definition = field_info_field_types($field['type']); - $type = $field_type_definition['default_widget']; + $plugin_id = $field_type_definition['default_widget']; } - $configuration = array( + $configuration += array( 'instance' => $instance, - 'settings' => $options['settings'], - 'weight' => $options['weight'], + 'form_mode' => $options['form_mode'], ); - return $this->createInstance($type, $configuration); + return $this->createInstance($plugin_id, $configuration); } + /** + * Merges default values for widget configuration. + * + * @param string $field_type + * The field type. + * @param array $configuration + * An array of widget configuration. + * + * @return array + * The display properties with defaults added. + */ + public function prepareConfiguration($field_type, array $configuration) { + // Fill in defaults for missing properties. + $configuration += array( + 'settings' => array(), + ); + // If no widget is specified, use the default widget. + if (!isset($configuration['type'])) { + $field_type = field_info_field_types($field_type); + $configuration['type'] = $field_type['default_widget']; + } + // Fill in default settings values for the widget. + $configuration['settings'] += field_info_widget_settings($configuration['type']); + + return $configuration; + } } diff --git a/core/modules/field/lib/Drupal/field/Plugin/field/widget/LegacyWidget.php b/core/modules/field/lib/Drupal/field/Plugin/field/widget/LegacyWidget.php index a03cb5e..f99023a 100644 --- a/core/modules/field/lib/Drupal/field/Plugin/field/widget/LegacyWidget.php +++ b/core/modules/field/lib/Drupal/field/Plugin/field/widget/LegacyWidget.php @@ -47,13 +47,7 @@ public function formElement(array $items, $delta, array $element, $langcode, arr $function = $definition['module'] . '_field_widget_form'; if (function_exists($function)) { - // hook_field_widget_form() implementations read widget properties directly - // from $instance. Put the actual properties we use here, which might have - // been altered by hook_field_widget_property(). $instance = clone $this->instance; - $instance['widget']['type'] = $this->getPluginId(); - $instance['widget']['settings'] = $this->getSettings(); - return $function($form, $form_state, $this->field, $instance, $langcode, $items, $delta, $element); } return array(); 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 c73260f..500a156 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 @@ -435,20 +435,8 @@ function fakeFieldInstance($formatter, $formatter_settings) { 'entity_type' => 'views_fake', 'bundle' => 'views_fake', - // Use the default field settings for settings and widget. + // Use the default field settings. 'settings' => field_info_instance_settings($field['type']), - 'widget' => array( - 'type' => $field_type['default_widget'], - 'settings' => array(), - ), - - // Build a dummy display mode. - 'display' => array( - '_custom' => array( - 'type' => $formatter, - 'settings' => $formatter_settings, - ), - ), // Set the other fields to their default values. // @see _field_write_instance(). diff --git a/core/modules/field/lib/Drupal/field/Tests/BulkDeleteTest.php b/core/modules/field/lib/Drupal/field/Tests/BulkDeleteTest.php index 0635f38..f1679e6 100644 --- a/core/modules/field/lib/Drupal/field/Tests/BulkDeleteTest.php +++ b/core/modules/field/lib/Drupal/field/Tests/BulkDeleteTest.php @@ -115,9 +115,6 @@ function setUp() { 'field_name' => $field['field_name'], 'entity_type' => $this->entity_type, 'bundle' => $bundle, - 'widget' => array( - 'type' => 'test_field_widget', - ) ); $this->instances[] = field_create_instance($instance); } diff --git a/core/modules/field/lib/Drupal/field/Tests/CrudTest.php b/core/modules/field/lib/Drupal/field/Tests/CrudTest.php index f7c3a9c..da8dae1 100644 --- a/core/modules/field/lib/Drupal/field/Tests/CrudTest.php +++ b/core/modules/field/lib/Drupal/field/Tests/CrudTest.php @@ -287,9 +287,6 @@ function testDeleteField() { 'field_name' => $this->field['field_name'], 'entity_type' => 'test_entity', 'bundle' => 'test_bundle', - 'widget' => array( - 'type' => 'test_field_widget', - ), ); field_create_instance($this->instance_definition); $this->another_instance_definition = $this->instance_definition; diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldAccessTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldAccessTest.php index 86f1f34..b63d48d 100644 --- a/core/modules/field/lib/Drupal/field/Tests/FieldAccessTest.php +++ b/core/modules/field/lib/Drupal/field/Tests/FieldAccessTest.php @@ -46,9 +46,6 @@ function setUp() { 'field_name' => $this->field['field_name'], 'entity_type' => 'node', 'bundle' => $this->content_type, - 'widget' => array( - 'type' => 'text_textfield', - ), ); field_create_instance($this->instance); diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldAttachStorageTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldAttachStorageTest.php index 6c7df44..e2f352e 100644 --- a/core/modules/field/lib/Drupal/field/Tests/FieldAttachStorageTest.php +++ b/core/modules/field/lib/Drupal/field/Tests/FieldAttachStorageTest.php @@ -495,11 +495,7 @@ function testFieldAttachDeleteBundle() { 'label' => $this->randomName() . '_label', 'description' => $this->randomName() . '_description', 'weight' => mt_rand(0, 127), - // test_field has no instance settings - 'widget' => array( - 'type' => 'test_field_widget', - 'settings' => array( - 'size' => mt_rand(0, 255)))); + ); field_create_instance($instance); // Save an entity with data for both fields diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php index f9a1031..85c3065 100644 --- a/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php +++ b/core/modules/field/lib/Drupal/field/Tests/FieldInfoTest.php @@ -79,11 +79,7 @@ function testFieldInfo() { 'label' => $this->randomName(), 'description' => $this->randomName(), 'weight' => mt_rand(0, 127), - // test_field has no instance settings - 'widget' => array( - 'type' => 'test_field_widget', - 'settings' => array( - 'test_setting' => 999))); + ); field_create_instance($instance); $info = entity_get_info('test_entity'); @@ -170,14 +166,16 @@ function testInstancePrepare() { ); field_create_instance($instance_definition); + $entity_form_display = entity_get_form_display('test_entity', 'test_bundle') + ->setComponent($field_definition['field_name']) + ->save(); + // Simulate a stored instance definition missing various settings (e.g. a // third-party module adding instance or widget settings has been enabled, // but existing instances do not know the new settings). $data = db_query('SELECT data FROM {field_config_instance} WHERE field_name = :field_name AND bundle = :bundle', array(':field_name' => $instance_definition['field_name'], ':bundle' => $instance_definition['bundle']))->fetchField(); $data = unserialize($data); $data['settings'] = array(); - $data['widget']['settings'] = 'unavailable_widget'; - $data['widget']['settings'] = array(); db_update('field_config_instance') ->fields(array('data' => serialize($data))) ->condition('field_name', $instance_definition['field_name']) @@ -194,7 +192,7 @@ function testInstancePrepare() { $this->assertIdentical($instance['settings'], $field_type['instance_settings'] , 'All expected instance settings are present.'); // Check that the default widget is used and expected settings are in place. - $widget = $instance->getWidget(); + $widget = entity_get_form_display('test_entity', 'test_bundle')->getWidget($instance_definition['field_name']); $this->assertIdentical($widget->getPluginId(), $field_type['default_widget'], 'Unavailable widget replaced with default widget.'); $widget_type = $widget->getDefinition(); $this->assertIdentical($widget->getSettings(), $widget_type['settings'] , 'All expected widget settings are present.'); diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldInstanceCrudTest.php b/core/modules/field/lib/Drupal/field/Tests/FieldInstanceCrudTest.php index ee30cf1..d88a89b 100644 --- a/core/modules/field/lib/Drupal/field/Tests/FieldInstanceCrudTest.php +++ b/core/modules/field/lib/Drupal/field/Tests/FieldInstanceCrudTest.php @@ -63,11 +63,9 @@ function testCreateFieldInstance() { $this->assertIdentical($record['data']['required'], FALSE, 'Required defaults to false.'); $this->assertIdentical($record['data']['label'], $this->instance_definition['field_name'], 'Label defaults to field name.'); $this->assertIdentical($record['data']['description'], '', 'Description defaults to empty string.'); - $this->assertIdentical($record['data']['widget']['type'], $field_type['default_widget'], 'Default widget has been written.'); // Check that default settings are set. $this->assertIdentical($record['data']['settings'], $field_type['instance_settings'] , 'Default instance settings have been written.'); - $this->assertIdentical($record['data']['widget']['settings'], $widget_type['settings'] , 'Default widget settings have been written.'); // Guarantee that the field/bundle combination is unique. try { @@ -147,26 +145,12 @@ function testUpdateFieldInstance() { $instance['label'] = $this->randomName(); $instance['description'] = $this->randomName(); $instance['settings']['test_instance_setting'] = $this->randomName(); - $instance['widget']['settings']['test_widget_setting'] =$this->randomName(); - $instance['widget']['weight']++; field_update_instance($instance); $instance_new = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']); $this->assertEqual($instance['required'], $instance_new['required'], '"required" change is saved'); $this->assertEqual($instance['label'], $instance_new['label'], '"label" change is saved'); $this->assertEqual($instance['description'], $instance_new['description'], '"description" change is saved'); - $this->assertEqual($instance['widget']['settings']['test_widget_setting'], $instance_new['widget']['settings']['test_widget_setting'], 'Widget setting change is saved'); - $this->assertEqual($instance['widget']['weight'], $instance_new['widget']['weight'], 'Widget weight change is saved'); - - // Check that changing the widget type updates the default settings. - $instance = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']); - $instance['widget']['type'] = 'test_field_widget_multiple'; - field_update_instance($instance); - - $instance_new = field_read_instance('test_entity', $this->instance_definition['field_name'], $this->instance_definition['bundle']); - $this->assertEqual($instance['widget']['type'], $instance_new['widget']['type'] , 'Widget type change is saved.'); - $settings = field_info_widget_settings($instance_new['widget']['type']); - $this->assertIdentical($settings, array_intersect_key($instance_new['widget']['settings'], $settings) , 'Widget type change updates default settings.'); // TODO: test failures. } diff --git a/core/modules/field/lib/Drupal/field/Tests/FieldUnitTestBase.php b/core/modules/field/lib/Drupal/field/Tests/FieldUnitTestBase.php index 94b068d..6062e3d 100644 --- a/core/modules/field/lib/Drupal/field/Tests/FieldUnitTestBase.php +++ b/core/modules/field/lib/Drupal/field/Tests/FieldUnitTestBase.php @@ -71,15 +71,18 @@ function createFieldWithInstance($suffix = '') { 'settings' => array( 'test_instance_setting' => $this->randomName(), ), - 'widget' => array( + ); + field_create_instance($this->$instance); + + entity_get_form_display('test_entity', 'test_bundle') + ->setComponent($this->$field_name, array( 'type' => 'test_field_widget', 'label' => 'Test Field', 'settings' => array( 'test_widget_setting' => $this->randomName(), ) - ) - ); - field_create_instance($this->$instance); + )) + ->save(); } /** diff --git a/core/modules/field/lib/Drupal/field/Tests/FormTest.php b/core/modules/field/lib/Drupal/field/Tests/FormTest.php index fcda223..79d3c65 100644 --- a/core/modules/field/lib/Drupal/field/Tests/FormTest.php +++ b/core/modules/field/lib/Drupal/field/Tests/FormTest.php @@ -43,13 +43,6 @@ function setUp() { 'settings' => array( 'test_instance_setting' => $this->randomName(), ), - 'widget' => array( - 'type' => 'test_field_widget', - 'label' => 'Test Field', - 'settings' => array( - 'test_widget_setting' => $this->randomName(), - ) - ) ); } @@ -59,6 +52,9 @@ function testFieldFormSingle() { $this->instance['field_name'] = $this->field_name; field_create_field($this->field); field_create_instance($this->instance); + entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default') + ->setComponent($this->field_name) + ->save(); $langcode = LANGUAGE_NOT_SPECIFIED; // Display creation form. @@ -125,6 +121,9 @@ function testFieldFormDefaultValue() { $this->instance['default_value'] = array(array('value' => $default)); field_create_field($this->field); field_create_instance($this->instance); + entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default') + ->setComponent($this->field_name) + ->save(); $langcode = LANGUAGE_NOT_SPECIFIED; // Display creation form. @@ -149,6 +148,9 @@ function testFieldFormSingleRequired() { $this->instance['required'] = TRUE; field_create_field($this->field); field_create_instance($this->instance); + entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default') + ->setComponent($this->field_name) + ->save(); $langcode = LANGUAGE_NOT_SPECIFIED; // Submit with missing required value. @@ -187,6 +189,9 @@ function testFieldFormUnlimited() { $this->instance['field_name'] = $this->field_name; field_create_field($this->field); field_create_instance($this->instance); + entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default') + ->setComponent($this->field_name) + ->save(); $langcode = LANGUAGE_NOT_SPECIFIED; // Display creation form -> 1 widget. @@ -267,6 +272,9 @@ function testFieldFormMultivalueWithRequiredRadio() { $this->instance['field_name'] = $this->field_name; field_create_field($this->field); field_create_instance($this->instance); + entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default') + ->setComponent($this->field_name) + ->save(); $langcode = LANGUAGE_NOT_SPECIFIED; // Add a required radio field. @@ -282,11 +290,13 @@ function testFieldFormMultivalueWithRequiredRadio() { 'entity_type' => 'test_entity', 'bundle' => 'test_bundle', 'required' => TRUE, - 'widget' => array( - 'type' => 'options_buttons', - ), ); field_create_instance($instance); + entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default') + ->setComponent($instance['field_name'], array( + 'type' => 'options_buttons', + )) + ->save(); // Display creation form. $this->drupalGet('test-entity/add/test_bundle'); @@ -309,6 +319,9 @@ function testFieldFormJSAddMore() { $this->instance['field_name'] = $this->field_name; field_create_field($this->field); field_create_instance($this->instance); + entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default') + ->setComponent($this->field_name) + ->save(); $langcode = LANGUAGE_NOT_SPECIFIED; // Display creation form -> 1 widget. @@ -366,9 +379,13 @@ function testFieldFormMultipleWidget() { $this->field = $this->field_multiple; $this->field_name = $this->field['field_name']; $this->instance['field_name'] = $this->field_name; - $this->instance['widget']['type'] = 'test_field_widget_multiple'; field_create_field($this->field); field_create_instance($this->instance); + entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default') + ->setComponent($this->field_name, array( + 'type' => 'test_field_widget_multiple', + )) + ->save(); $langcode = LANGUAGE_NOT_SPECIFIED; // Display creation form. @@ -408,6 +425,9 @@ function testFieldFormAccess() { $instance['field_name'] = $field_name; field_create_field($field); field_create_instance($instance); + entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default') + ->setComponent($field_name) + ->save(); // Create a field with no edit access - see field_test_field_access(). $field_no_access = array( @@ -423,6 +443,9 @@ function testFieldFormAccess() { ); field_create_field($field_no_access); field_create_instance($instance_no_access); + entity_get_form_display($instance_no_access['entity_type'], $instance_no_access['bundle'], 'default') + ->setComponent($field_name_no_access) + ->save(); $langcode = LANGUAGE_NOT_SPECIFIED; @@ -479,9 +502,15 @@ function testNestedFieldForm() { $this->instance['field_name'] = 'field_single'; $this->instance['label'] = 'Single field'; field_create_instance($this->instance); + entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default') + ->setComponent($this->instance['field_name']) + ->save(); $this->instance['field_name'] = 'field_unlimited'; $this->instance['label'] = 'Unlimited field'; field_create_instance($this->instance); + entity_get_form_display($this->instance['entity_type'], $this->instance['bundle'], 'default') + ->setComponent($this->instance['field_name']) + ->save(); // Create two entities. $entity_1 = field_test_create_entity(1, 1); diff --git a/core/modules/field/lib/Drupal/field/Tests/ShapeItemTest.php b/core/modules/field/lib/Drupal/field/Tests/ShapeItemTest.php index 2628256..4e92d7e 100644 --- a/core/modules/field/lib/Drupal/field/Tests/ShapeItemTest.php +++ b/core/modules/field/lib/Drupal/field/Tests/ShapeItemTest.php @@ -43,9 +43,6 @@ public function setUp() { 'entity_type' => 'entity_test', 'field_name' => 'field_shape', 'bundle' => 'entity_test', - 'widget' => array( - 'type' => 'test_field_widget', - ), ); field_create_instance($this->instance); } diff --git a/core/modules/field/lib/Drupal/field/Tests/TestItemTest.php b/core/modules/field/lib/Drupal/field/Tests/TestItemTest.php index 198be2a..c8ff8fa 100644 --- a/core/modules/field/lib/Drupal/field/Tests/TestItemTest.php +++ b/core/modules/field/lib/Drupal/field/Tests/TestItemTest.php @@ -43,9 +43,6 @@ public function setUp() { 'entity_type' => 'entity_test', 'field_name' => 'field_test', 'bundle' => 'entity_test', - 'widget' => array( - 'type' => 'test_field_widget', - ), ); field_create_instance($this->instance); } diff --git a/core/modules/field/lib/Drupal/field/Tests/TranslationWebTest.php b/core/modules/field/lib/Drupal/field/Tests/TranslationWebTest.php index 40447f1..a32cc81 100644 --- a/core/modules/field/lib/Drupal/field/Tests/TranslationWebTest.php +++ b/core/modules/field/lib/Drupal/field/Tests/TranslationWebTest.php @@ -53,6 +53,10 @@ function setUp() { field_create_instance($instance); $this->instance = field_read_instance('test_entity', $this->field_name, 'test_bundle'); + entity_get_form_display($this->entity_type, 'test_bundle', 'default') + ->setComponent($this->field_name) + ->save(); + for ($i = 0; $i < 3; ++$i) { $language = new Language(array( 'langcode' => 'l' . $i, 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..0cbbcb1 100644 --- a/core/modules/field/tests/modules/field_test/field_test.module +++ b/core/modules/field/tests/modules/field_test/field_test.module @@ -196,36 +196,18 @@ function field_test_field_attach_view_alter(&$output, $context) { } /** - * Implements hook_field_widget_properties_alter(). - */ -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')) { - $widget['settings']['size'] = 42; - } -} - -/** - * Implements hook_field_widget_properties_ENTITY_TYPE_alter(). - */ -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') { - $widget['type'] = 'options_buttons'; - } -} - -/** * Implements hook_field_widget_form_alter(). */ function field_test_field_widget_form_alter(&$element, &$form_state, $context) { + $instance = $context['instance']; + $entity_form_display = entity_get_form_display($instance['entity_type'], $instance['bundle']); switch ($context['field']['field_name']) { case 'alter_test_text': - drupal_set_message('Field size: ' . $context['instance']->getWidget()->getSetting('size')); + drupal_set_message('Field size: ' . $entity_form_display->getWidget($context['field']['field_name'])->getSetting('size')); break; case 'alter_test_options': - drupal_set_message('Widget type: ' . $context['instance']->getWidget()->getPluginId()); + drupal_set_message('Widget type: ' . $entity_form_display->getWidget($context['field']['field_name'])->getPluginId()); break; } // Set a message if this is for the form displayed to set default value for diff --git a/core/modules/field_ui/field_ui.admin.inc b/core/modules/field_ui/field_ui.admin.inc index 566959b..74c0cb8 100644 --- a/core/modules/field_ui/field_ui.admin.inc +++ b/core/modules/field_ui/field_ui.admin.inc @@ -70,11 +70,14 @@ function field_ui_inactive_message($entity_type, $bundle) { $widget_types = field_info_widget_types(); foreach ($inactive_instances as $field_name => $instance) { + $entity_form_display = entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default'); + $widget = $entity_form_display->getComponent($instance['field_name']); + $widget_definition = $entity_form_display->getWidget($instance['field_name'])->getDefinition(); $list[] = t('%field (@field_name) field requires the %widget_type widget provided by %widget_module module', array( '%field' => $instance['label'], '@field_name' => $instance['field_name'], - '%widget_type' => isset($widget_types[$instance['widget']['type']]) ? $widget_types[$instance['widget']['type']]['label'] : $instance['widget']['type'], - '%widget_module' => $instance['widget']['module'], + '%widget_type' => isset($widget_types[$widget['type']]) ? $widget_types[$widget['type']]['label'] : $widget['type'], + '%widget_module' => $widget_definition['module'], )); } drupal_set_message(t('Inactive fields are not shown unless their providing modules are enabled. The following fields are not enabled: !list', array('!list' => theme('item_list', array('items' => $list)))), 'error'); @@ -462,6 +465,7 @@ function field_ui_existing_field_options($entity_type, $bundle) { if (!($existing_bundle == $bundle && $existing_entity_type == $entity_type)) { foreach ($instances as $instance) { $field = field_info_field($instance['field_name']); + $widget = entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')->getComponent($instance['field_name']); // Don't show // - locked fields, // - fields already in the current bundle, @@ -477,7 +481,7 @@ function field_ui_existing_field_options($entity_type, $bundle) { 'type_label' => $field_types[$field['type']]['label'], 'field' => $field['field_name'], 'label' => $instance['label'], - 'widget_type' => $instance['widget']['type'], + 'widget_type' => $widget['type'], ); } } @@ -547,7 +551,7 @@ function field_ui_field_settings_form($form, &$form_state, $instance) { ), ), ); - if (field_behaviors_widget('multiple values', $instance) == FIELD_BEHAVIOR_DEFAULT) { + if (field_behaviors_widget('multiple_values', $instance) == FIELD_BEHAVIOR_DEFAULT) { $form['field']['container']['#description'] = t('%unlimited will provide an %add-more button so users can add as many values as they like.', array( '%unlimited' => t('Unlimited'), '%add-more' => t('Add another item'), @@ -641,6 +645,7 @@ function field_ui_widget_type_form($form, &$form_state, FieldInstance $instance) $entity_type = $instance['entity_type']; $field_name = $instance['field_name']; + $entity_form_display = entity_get_form_display($entity_type, $bundle); $field = field_info_field($field_name); $bundles = entity_get_bundles(); $bundle_label = $bundles[$entity_type][$bundle]['label']; @@ -649,6 +654,7 @@ function field_ui_widget_type_form($form, &$form_state, FieldInstance $instance) '#bundle' => $bundle, '#entity_type' => $entity_type, '#field_name' => $field_name, + '#instance' => $instance, ); $form['widget_type'] = array( @@ -656,7 +662,7 @@ function field_ui_widget_type_form($form, &$form_state, FieldInstance $instance) '#title' => t('Widget type'), '#required' => TRUE, '#options' => field_ui_widget_type_options($field['type']), - '#default_value' => $instance->getWidget()->getPluginId(), + '#default_value' => $entity_form_display->getWidget($field_name)->getPluginId(), '#description' => t('The type of form element you would like to present to the user when creating this field in the %type type.', array('%type' => $bundle_label)), ); @@ -677,19 +683,16 @@ function field_ui_widget_type_form_submit($form, &$form_state) { $bundle = $form['#bundle']; $entity_type = $form['#entity_type']; $field_name = $form['#field_name']; + $instance = $form['#instance']; - // Retrieve the stored instance settings to merge with the incoming values. - $instance = field_read_instance($entity_type, $field_name, $bundle); - - // Set the right module information. - $widget_type = field_info_widget_types($form_values['widget_type']); - $widget_module = $widget_type['module']; - - $instance['widget']['type'] = $form_values['widget_type']; - $instance['widget']['module'] = $widget_module; + // Update the stored instance with the incoming values. + $entity_form_display = entity_get_form_display($entity_type, $bundle) + ->setComponent($field_name, array( + 'type' => $form_values['widget_type'], + )); try { - field_update_instance($instance); + $entity_form_display->save(); drupal_set_message(t('Changed the widget for field %label.', array('%label' => $instance['label']))); } catch (Exception $e) { @@ -792,6 +795,7 @@ function field_ui_field_edit_form($form, &$form_state, $instance) { $form['#field'] = $field; $form['#instance'] = $instance; + $form['#entity_form_display'] = $entity_form_display = entity_get_form_display($entity_type, $bundle); // Create an arbitrary entity object (used by the 'default value' widget). $ids = (object) array('entity_type' => $instance['entity_type'], 'bundle' => $instance['bundle'], 'entity_id' => NULL); $form['#entity'] = _field_create_entity_from_ids($ids); @@ -804,7 +808,8 @@ function field_ui_field_edit_form($form, &$form_state, $instance) { return $form; } - $widget_type = field_info_widget_types($instance['widget']['type']); + $widget_configuration = $entity_form_display->getComponent($instance['field_name']); + $widget = $entity_form_display->getWidget($instance['field_name']); // Create a form structure for the instance values. $form['instance'] = array( @@ -824,10 +829,6 @@ function field_ui_field_edit_form($form, &$form_state, $instance) { '#type' => 'value', '#value' => $bundle, ); - $form['instance']['widget']['weight'] = array( - '#type' => 'value', - '#value' => !empty($instance['widget']['weight']) ? $instance['widget']['weight'] : 0, - ); // Build the configurable instance values. $form['instance']['label'] = array( @@ -857,15 +858,7 @@ function field_ui_field_edit_form($form, &$form_state, $instance) { // Build the widget component of the instance. $form['instance']['widget']['type'] = array( '#type' => 'value', - '#value' => $instance['widget']['type'], - ); - $form['instance']['widget']['module'] = array( - '#type' => 'value', - '#value' => $widget_type['module'], - ); - $form['instance']['widget']['active'] = array( - '#type' => 'value', - '#value' => !empty($field['instance']['widget']['active']) ? 1 : 0, + '#value' => $widget_configuration['type'], ); // Add additional field instance settings from the field module. @@ -876,7 +869,7 @@ function field_ui_field_edit_form($form, &$form_state, $instance) { } // Add widget settings for the widget type. - $additions = $instance->getWidget()->settingsForm($form, $form_state); + $additions = $widget->settingsForm($form, $form_state); $form['instance']['widget']['settings'] = $additions ? $additions : array('#type' => 'value', '#value' => array()); $form['instance']['widget']['#weight'] = 20; @@ -915,7 +908,6 @@ function field_ui_field_edit_form_delete_submit($form, &$form_state) { * Builds the default value widget for a given field instance. */ function field_ui_default_value_widget($field, $instance, &$form, &$form_state) { - $field_name = $field['field_name']; $entity = $form['#entity']; $element = array( @@ -937,7 +929,7 @@ function field_ui_default_value_widget($field, $instance, &$form, &$form_state) // Insert the widget. Since we do not use the "official" instance definition, // the whole flow cannot use field_invoke_method(). $items = (array) $instance['default_value']; - $element += $instance->getWidget()->form($entity, LANGUAGE_NOT_SPECIFIED, $items, $element, $form_state); + $element += entity_get_form_display($instance['entity_type'], $instance['bundle'])->getWidget($instance['field_name'])->form($entity, LANGUAGE_NOT_SPECIFIED, $items, $element, $form_state); return $element; } @@ -953,13 +945,14 @@ function field_ui_field_edit_form_validate($form, &$form_state) { $instance = $form['#instance']; $field_name = $instance['field_name']; $entity = $form['#entity']; + $entity_form_display = $form['#entity_form_display']; if (isset($form['instance']['default_value_widget'])) { $element = $form['instance']['default_value_widget']; // Extract the 'default value'. $items = array(); - $instance->getWidget()->extractFormValues($entity, LANGUAGE_NOT_SPECIFIED, $items, $element, $form_state); + $entity_form_display->getWidget($instance['field_name'])->extractFormValues($entity, LANGUAGE_NOT_SPECIFIED, $items, $element, $form_state); // Grab the field definition from $form_state. $field_state = field_form_get_state($element['#parents'], $field_name, LANGUAGE_NOT_SPECIFIED, $form_state); @@ -979,7 +972,7 @@ function field_ui_field_edit_form_validate($form, &$form_state) { field_form_set_state($element['#parents'], $field_name, LANGUAGE_NOT_SPECIFIED, $form_state, $field_state); // Assign reported errors to the correct form element. - $instance->getWidget()->flagErrors($entity, LANGUAGE_NOT_SPECIFIED, $items, $element, $form_state); + $entity_form_display->getWidget($instance['field_name'])->flagErrors($entity, LANGUAGE_NOT_SPECIFIED, $items, $element, $form_state); } } } @@ -991,8 +984,8 @@ function field_ui_field_edit_form_validate($form, &$form_state) { */ function field_ui_field_edit_form_submit($form, &$form_state) { $instance = $form['#instance']; - $field = $form['#field']; $entity = $form['#entity']; + $entity_form_display = $form['#entity_form_display']; // Handle the default value. if (isset($form['instance']['default_value_widget'])) { @@ -1000,11 +993,15 @@ function field_ui_field_edit_form_submit($form, &$form_state) { // Extract field values. $items = array(); - $instance->getWidget()->extractFormValues($entity, LANGUAGE_NOT_SPECIFIED, $items, $element, $form_state); + $entity_form_display->getWidget($instance['field_name'])->extractFormValues($entity, LANGUAGE_NOT_SPECIFIED, $items, $element, $form_state); $instance['default_value'] = $items ? $items : NULL; } + // Handle widget settings. + $entity_form_display->setComponent($instance['field_name'], $form_state['values']['instance']['widget'])->save(); + unset($form_state['values']['instance']['widget']); + // Merge incoming values into the instance. foreach ($form_state['values']['instance'] as $key => $value) { $instance[$key] = $value; diff --git a/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php b/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php index 925caef..02c406d 100644 --- a/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php +++ b/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php @@ -63,6 +63,7 @@ public function buildForm(array $form, array &$form_state) { $field_types = field_info_field_types(); $widget_types = field_info_widget_types(); $extra_fields = field_info_extra_fields($this->entity_type, $this->bundle, 'form'); + $entity_form_display = entity_get_form_display($this->entity_type, $this->bundle); $form += array( '#entity_type' => $this->entity_type, @@ -94,6 +95,7 @@ public function buildForm(array $form, array &$form_state) { // Fields. foreach ($instances as $name => $instance) { $field = field_info_field($instance['field_name']); + $widget_configuration = entity_get_form_display($instance['entity_type'], $instance['bundle'])->getComponent($instance['field_name']); $admin_field_path = $this->adminPath . '/fields/' . $instance['field_name']; $table[$name] = array( '#attributes' => array('class' => array('draggable', 'tabledrag-leaf')), @@ -106,7 +108,7 @@ public function buildForm(array $form, array &$form_state) { '#type' => 'textfield', '#title' => t('Weight for @title', array('@title' => $instance['label'])), '#title_display' => 'invisible', - '#default_value' => $instance['widget']['weight'], + '#default_value' => $widget_configuration['weight'], '#size' => 3, '#attributes' => array('class' => array('field-weight')), ), @@ -137,7 +139,7 @@ public function buildForm(array $form, array &$form_state) { ), 'widget_type' => array( '#type' => 'link', - '#title' => t($widget_types[$instance['widget']['type']]['label']), + '#title' => t($widget_types[$widget_configuration['type']]['label']), '#href' => $admin_field_path . '/widget-type', '#options' => array('attributes' => array('title' => t('Change widget type.'))), ), @@ -212,7 +214,7 @@ public function buildForm(array $form, array &$form_state) { } // Additional row: add new field. - $max_weight = field_info_max_weight($this->entity_type, $this->bundle, 'form'); + $max_weight = $entity_form_display->getHighestWeight(); $field_type_options = field_ui_field_type_options(); $widget_type_options = field_ui_widget_type_options(NULL, TRUE); if ($field_type_options && $widget_type_options) { @@ -528,27 +530,9 @@ protected function validateAddExisting(array $form, array &$form_state) { */ public function submitForm(array &$form, array &$form_state) { $form_values = $form_state['values']['fields']; - - $bundle_settings = field_bundle_settings($this->entity_type, $this->bundle); - - // Update field weights. - foreach ($form_values as $key => $values) { - if (in_array($key, $form['#fields'])) { - $instance = field_read_instance($this->entity_type, $key, $this->bundle); - $instance['widget']['weight'] = $values['weight']; - field_update_instance($instance); - } - elseif (in_array($key, $form['#extra'])) { - $bundle_settings['extra_fields']['form'][$key]['weight'] = $values['weight']; - } - } - - field_bundle_settings($this->entity_type, $this->bundle, $bundle_settings); - $destinations = array(); // Create new field. - $field = array(); if (!empty($form_values['_add_new_field']['field_name'])) { $values = $form_values['_add_new_field']; @@ -562,10 +546,6 @@ public function submitForm(array &$form, array &$form_state) { 'entity_type' => $this->entity_type, 'bundle' => $this->bundle, 'label' => $values['label'], - 'widget' => array( - 'type' => $values['widget_type'], - 'weight' => $values['weight'], - ), ); // Create the field and instance. @@ -573,6 +553,15 @@ public function submitForm(array &$form, array &$form_state) { field_create_field($field); field_create_instance($instance); + // Make sure the field is displayed in the 'default' form mode (using + // the configured widget and default settings). + entity_get_form_display($this->entity_type, $this->bundle, 'default') + ->setComponent($field['field_name'], array( + 'type' => $values['widget_type'], + 'weight' => $values['weight'], + )) + ->save(); + // Make sure the field is displayed in the 'default' view mode (using // default formatter and settings). It stays hidden for other view // modes until it is explicitly configured. @@ -588,7 +577,7 @@ public function submitForm(array &$form, array &$form_state) { // Store new field information for any additional submit handlers. $form_state['fields_added']['_add_new_field'] = $field['field_name']; } - catch (Exception $e) { + catch (\Exception $e) { drupal_set_message(t('There was a problem creating field %label: !message', array('%label' => $instance['label'], '!message' => $e->getMessage())), 'error'); } } @@ -606,15 +595,20 @@ public function submitForm(array &$form, array &$form_state) { 'entity_type' => $this->entity_type, 'bundle' => $this->bundle, 'label' => $values['label'], - 'widget' => array( - 'type' => $values['widget_type'], - 'weight' => $values['weight'], - ), ); try { field_create_instance($instance); + // Make sure the field is displayed in the 'default' form mode (using + // the configured widget and default settings). + entity_get_form_display($this->entity_type, $this->bundle, 'default') + ->setComponent($field['field_name'], array( + 'type' => $values['widget_type'], + 'weight' => $values['weight'], + )) + ->save(); + // Make sure the field is displayed in the 'default' view mode (using // default formatter and settings). It stays hidden for other view // modes until it is explicitly configured. @@ -626,7 +620,7 @@ public function submitForm(array &$form, array &$form_state) { // Store new field information for any additional submit handlers. $form_state['fields_added']['_add_existing_field'] = $instance['field_name']; } - catch (Exception $e) { + catch (\Exception $e) { drupal_set_message(t('There was a problem creating field instance %label: @message.', array('%label' => $instance['label'], '@message' => $e->getMessage())), 'error'); } } diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Tests/AlterTest.php b/core/modules/field_ui/lib/Drupal/field_ui/Tests/AlterTest.php deleted file mode 100644 index 016b9d0..0000000 --- a/core/modules/field_ui/lib/Drupal/field_ui/Tests/AlterTest.php +++ /dev/null @@ -1,112 +0,0 @@ - 'Widget customization', - 'description' => 'Test custom field widget hooks and callbacks on field administration pages.', - 'group' => 'Field UI', - ); - } - - function setUp() { - parent::setUp(); - - // Create Article node type. - $this->drupalCreateContentType(array('type' => 'page', 'name' => 'Basic page')); - $this->drupalCreateContentType(array('type' => 'article', 'name' => 'Article')); - - // Create test user. - $admin_user = $this->drupalCreateUser(array('access content', 'administer content types', 'administer node fields', 'administer users', 'administer user fields')); - $this->drupalLogin($admin_user); - } - - /** - * Tests hook_field_widget_properties_alter() on the default field widget. - * - * @see field_test_field_widget_properties_alter() - * @see field_test_field_widget_properties_user_alter() - * @see field_test_field_widget_form_alter() - */ - function testDefaultWidgetPropertiesAlter() { - // Create the alter_test_text field and an instance on article nodes. - field_create_field(array( - 'field_name' => 'alter_test_text', - 'type' => 'text', - )); - $instance = array( - 'field_name' => 'alter_test_text', - 'entity_type' => 'node', - 'bundle' => 'article', - 'widget' => array( - 'type' => 'text_textfield', - 'size' => 60, - ), - ); - field_create_instance($instance); - - // Test that field_test_field_widget_properties_alter() sets the size to - // 42 and that field_test_field_widget_form_alter() reports the correct - // size when the form is displayed. - $this->drupalGet('admin/structure/types/manage/article/fields/alter_test_text'); - $this->assertText('Field size: 42', 'Altered field size is found in hook_field_widget_form_alter().'); - // Test that hook_field_widget_form_alter() registers this is the default - // value form and sets a message. - $this->assertText('From hook_field_widget_form_alter(): Default form is true.', 'Default value form detected in hook_field_widget_form_alter().'); - - // Create the alter_test_options field. - field_create_field(array( - 'field_name' => 'alter_test_options', - 'type' => 'list_text' - )); - // Create instances on users and page nodes. - $instance = array( - 'field_name' => 'alter_test_options', - 'entity_type' => 'user', - 'bundle' => 'user', - 'widget' => array( - 'type' => 'options_select', - ) - ); - field_create_instance($instance); - $instance = array( - 'field_name' => 'alter_test_options', - 'entity_type' => 'node', - 'bundle' => 'page', - 'widget' => array( - 'type' => 'options_select', - ) - ); - field_create_instance($instance); - - // Test that field_test_field_widget_properties_user_alter() replaces - // the widget and that field_test_field_widget_form_alter() reports the - // correct widget name when the form is displayed. - $this->drupalGet('admin/config/people/accounts/fields/alter_test_options'); - $this->assertText('Widget type: options_buttons', 'Widget type is altered for users in hook_field_widget_form_alter().'); - - // Test that the widget is not altered on page nodes. - $this->drupalGet('admin/structure/types/manage/page/fields/alter_test_options'); - $this->assertText('Widget type: options_select', 'Widget type is not altered for pages in hook_field_widget_form_alter().'); - } -} 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 cbc132f..f2855c7 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 @@ -52,6 +52,10 @@ function setUp() { 'bundle' => 'article', ); field_create_instance($instance); + + entity_get_form_display('node', 'article') + ->setComponent('field_' . $vocabulary->id()) + ->save(); } /** @@ -234,7 +238,10 @@ function assertFieldSettings($bundle, $field_name, $string = 'dummy test string' // Assert instance and widget settings. $instance = field_info_instance($entity_type, $field_name, $bundle); $this->assertTrue($instance['settings']['test_instance_setting'] == $string, 'Field instance settings were found.'); - $this->assertTrue($instance['widget']['settings']['test_widget_setting'] == $string, 'Field widget settings were found.'); + + // Assert widget settings. + $widget_configuration = entity_get_form_display($entity_type, $bundle)->getComponent($field_name); + $this->assertTrue($widget_configuration['settings']['test_widget_setting'] == $string, 'Field widget settings were found.'); } /** @@ -255,6 +262,10 @@ function testDefaultValue() { ); field_create_instance($instance); + entity_get_form_display('node', $this->type) + ->setComponent($field_name) + ->save(); + $langcode = LANGUAGE_NOT_SPECIFIED; $admin_path = 'admin/structure/types/manage/' . $this->type . '/fields/' . $field_name; $element_id = "edit-$field_name-$langcode-0-value"; @@ -271,6 +282,7 @@ function testDefaultValue() { $edit = array($element_name => '1'); $this->drupalPost($admin_path, $edit, t('Save settings')); $this->assertText("Saved $field_name configuration", 'The form was successfully submitted.'); + field_info_cache_clear(); $instance = field_info_instance('node', $field_name, $this->type); $this->assertEqual($instance['default_value'], array(array('value' => 1)), 'The default value was correctly saved.'); @@ -287,8 +299,11 @@ function testDefaultValue() { $this->assertEqual($instance['default_value'], NULL, 'The default value was correctly saved.'); // Change the widget to TestFieldWidgetNoDefault. - $instance['widget']['type'] = 'test_field_widget_no_default'; - field_update_instance($instance); + entity_get_form_display($instance['entity_type'], $instance['bundle']) + ->setComponent($field_name, array( + 'type' => 'test_field_widget_no_default', + )) + ->save(); $this->drupalGet($admin_path); $this->assertNoFieldById($element_id, '', t('No default value was possible for widget that disables default value.')); @@ -358,9 +373,11 @@ function testHiddenFields() { 'bundle' => $this->type, 'entity_type' => 'node', 'label' => t('Hidden field'), - 'widget' => array('type' => 'test_field_widget'), ); field_create_instance($instance); + entity_get_form_display('node', $this->type) + ->setComponent($field_name) + ->save(); $this->assertTrue(field_read_instance('node', $field_name, $this->type), format_string('An instance of the field %field was created programmatically.', array('%field' => $field_name))); // Check that the newly added instance appears on the 'Manage Fields' @@ -416,8 +433,8 @@ function testWidgetChange() { // Check that the field_tags field currently uses the 'options_select' // widget. - $instance = field_info_instance('node', 'field_tags', 'article'); - $this->assertEqual($instance['widget']['type'], 'options_select'); + $entity_form_display = entity_get_form_display('node', 'article')->getComponent('field_tags'); + $this->assertEqual($entity_form_display['type'], 'options_select'); // Check that the "Manage fields" page shows the correct widget type. $this->drupalGet($url_fields); @@ -441,8 +458,8 @@ function testWidgetChange() { // Check that the field uses the newly set widget. field_cache_clear(); - $instance = field_info_instance('node', 'field_tags', 'article'); - $this->assertEqual($instance['widget']['type'], 'options_buttons'); + $widget_configuration = entity_get_form_display('node', 'article')->getComponent('field_tags'); + $this->assertEqual($widget_configuration['type'], 'options_buttons'); // Go to the 'Widget type' form and check that the correct widget is // selected. diff --git a/core/modules/file/file.field.inc b/core/modules/file/file.field.inc index e3a7d7c..2d298aa 100644 --- a/core/modules/file/file.field.inc +++ b/core/modules/file/file.field.inc @@ -409,7 +409,6 @@ function file_field_widget_process($element, &$form_state, $form) { $field = field_widget_field($element, $form_state); $instance = field_widget_instance($element, $form_state); - $settings = $instance['widget']['settings']; $element['#theme'] = 'file_widget'; diff --git a/core/modules/file/lib/Drupal/file/Tests/FileFieldTestBase.php b/core/modules/file/lib/Drupal/file/Tests/FileFieldTestBase.php index c2d922d..20e003a 100644 --- a/core/modules/file/lib/Drupal/file/Tests/FileFieldTestBase.php +++ b/core/modules/file/lib/Drupal/file/Tests/FileFieldTestBase.php @@ -101,14 +101,16 @@ function attachFileField($name, $entity_type, $bundle, $instance_settings = arra 'bundle' => $bundle, 'required' => !empty($instance_settings['required']), 'settings' => array(), - 'widget' => array( - 'type' => 'file_generic', - 'settings' => array(), - ), ); $instance['settings'] = array_merge($instance['settings'], $instance_settings); - $instance['widget']['settings'] = array_merge($instance['widget']['settings'], $widget_settings); field_create_instance($instance); + + entity_get_form_display($entity_type, $bundle, 'default') + ->setComponent($name, array( + 'type' => 'file_generic', + 'settings' => $widget_settings, + )) + ->save(); } /** @@ -117,9 +119,14 @@ function attachFileField($name, $entity_type, $bundle, $instance_settings = arra function updateFileField($name, $type_name, $instance_settings = array(), $widget_settings = array()) { $instance = field_info_instance('node', $name, $type_name); $instance['settings'] = array_merge($instance['settings'], $instance_settings); - $instance['widget']['settings'] = array_merge($instance['widget']['settings'], $widget_settings); field_update_instance($instance); + + entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default') + ->setComponent($instance['field_name'], array( + 'settings' => $widget_settings, + )) + ->save(); } /** diff --git a/core/modules/file/lib/Drupal/file/Tests/FileItemTest.php b/core/modules/file/lib/Drupal/file/Tests/FileItemTest.php index 1e6eef5..2ec9dfa 100644 --- a/core/modules/file/lib/Drupal/file/Tests/FileItemTest.php +++ b/core/modules/file/lib/Drupal/file/Tests/FileItemTest.php @@ -54,9 +54,6 @@ public function setUp() { 'entity_type' => 'entity_test', 'field_name' => 'file_test', 'bundle' => 'entity_test', - 'widget' => array( - 'type' => 'options_select', - ), ); field_create_instance($instance); file_put_contents('public://example.txt', $this->randomName()); diff --git a/core/modules/forum/forum.install b/core/modules/forum/forum.install index b1e63de..8e56bab 100644 --- a/core/modules/forum/forum.install +++ b/core/modules/forum/forum.install @@ -87,12 +87,16 @@ function forum_enable() { 'label' => $vocabulary->name, 'bundle' => 'forum', 'required' => TRUE, - 'widget' => array( - 'type' => 'options_select', - ), ); field_create_instance($instance); + // Assign form display settings for the 'default' form mode. + entity_get_form_display('node', 'forum', 'default') + ->setComponent('taxonomy_forums', array( + 'type' => 'options_select', + )) + ->save(); + // Assign display settings for the 'default' and 'teaser' view modes. entity_get_display('node', 'forum', 'default') ->setComponent('taxonomy_forums', array( diff --git a/core/modules/hal/lib/Drupal/hal/Tests/NormalizerTestBase.php b/core/modules/hal/lib/Drupal/hal/Tests/NormalizerTestBase.php index cbab209..8c74099 100644 --- a/core/modules/hal/lib/Drupal/hal/Tests/NormalizerTestBase.php +++ b/core/modules/hal/lib/Drupal/hal/Tests/NormalizerTestBase.php @@ -30,7 +30,7 @@ * * @var array */ - public static $modules = array('entity_test', 'entity_reference', 'field', 'field_sql_storage', 'hal', 'language', 'rest', 'serialization', 'system', 'text', 'user'); + public static $modules = array('entity_test', 'entity_reference', 'field', 'field_sql_storage', 'hal', 'language', 'rest', 'serialization', 'system', 'text', 'user', 'entity'); /** * The mock serializer. diff --git a/core/modules/image/image.module b/core/modules/image/image.module index 7be1abd..203b3e1 100644 --- a/core/modules/image/image.module +++ b/core/modules/image/image.module @@ -356,7 +356,9 @@ function image_image_style_update(ImageStyle $style) { $instances = field_read_instances(); // Loop through all fields searching for image fields. foreach ($instances as $instance) { - if ($instance['widget']['module'] == 'image') { + $entity_form_display = entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default'); + $widget_definition = $entity_form_display->getWidget($instance['field_name'])->getDefinition(); + if ($widget_definition['module'] == 'image') { $view_modes = entity_get_view_modes($instance['entity_type']); $view_modes = array('default') + array_keys($view_modes); foreach ($view_modes as $view_mode) { @@ -372,9 +374,11 @@ function image_image_style_update(ImageStyle $style) { ->save(); } } - if ($instance['widget']['settings']['preview_image_style'] == $style->getOriginalID()) { - $instance['widget']['settings']['preview_image_style'] = $style->id(); - field_update_instance($instance); + $widget_configuration = $entity_form_display->getComponent($instance['field_name']); + if ($widget_configuration['settings']['preview_image_style'] == $style->getOriginalID()) { + $widget_options['settings']['preview_image_style'] = $style->id(); + $entity_form_display->setComponent($instance['field_name'], $widget_options) + ->save(); } } } diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php index 01fa5f4..6c5f4eb 100644 --- a/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php +++ b/core/modules/image/lib/Drupal/image/Tests/ImageFieldDefaultImagesTest.php @@ -65,10 +65,14 @@ function testDefaultImages() { 'settings' => array( 'default_image' => $default_images['instance2']->fid, ), - 'widget' => $instance['widget'], ); field_create_instance($instance2); - $instance2 = field_info_instance('node', $field_name, 'page'); + + $widget_settings = entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')->getComponent($instance['field_name']); + entity_get_form_display('node', 'page', 'default') + ->setComponent($field['field_name'], $widget_settings) + ->save(); + entity_get_display('node', 'page', 'default') ->setComponent($field['field_name']) ->save(); diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php b/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php index 5a4e20e..508c9bc 100644 --- a/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php +++ b/core/modules/image/lib/Drupal/image/Tests/ImageFieldTestBase.php @@ -85,16 +85,17 @@ function createImageField($name, $type_name, $field_settings = array(), $instanc 'required' => !empty($instance_settings['required']), 'description' => !empty($instance_settings['description']) ? $instance_settings['description'] : '', 'settings' => array(), - 'widget' => array( - 'type' => 'image_image', - 'settings' => array(), - ), ); $instance['settings'] = array_merge($instance['settings'], $instance_settings); - $instance['widget']['settings'] = array_merge($instance['widget']['settings'], $widget_settings); - $field_instance = field_create_instance($instance); + entity_get_form_display('node', $type_name, 'default') + ->setComponent($field['field_name'], array( + 'type' => 'image_image', + 'settings' => $widget_settings, + )) + ->save(); + entity_get_display('node', $type_name, 'default') ->setComponent($field['field_name']) ->save(); diff --git a/core/modules/image/lib/Drupal/image/Tests/ImageItemTest.php b/core/modules/image/lib/Drupal/image/Tests/ImageItemTest.php index 7f863cf..709073d 100644 --- a/core/modules/image/lib/Drupal/image/Tests/ImageItemTest.php +++ b/core/modules/image/lib/Drupal/image/Tests/ImageItemTest.php @@ -53,9 +53,6 @@ public function setUp() { 'entity_type' => 'entity_test', 'field_name' => 'image_test', 'bundle' => 'entity_test', - 'widget' => array( - 'type' => 'image_image', - ), ); field_create_instance($instance); file_unmanaged_copy(DRUPAL_ROOT . '/core/misc/druplicon.png', 'public://example.jpg'); diff --git a/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php b/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php index a608873..d0c2148 100644 --- a/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php +++ b/core/modules/link/lib/Drupal/link/Tests/LinkFieldTest.php @@ -56,14 +56,16 @@ function testURLValidation() { 'settings' => array( 'title' => DRUPAL_DISABLED, ), - 'widget' => array( + ); + field_create_instance($this->instance); + entity_get_form_display('test_entity', 'test_bundle', 'default') + ->setComponent($this->field['field_name'], array( 'type' => 'link_default', 'settings' => array( 'placeholder_url' => 'http://example.com', ), - ), - ); - field_create_instance($this->instance); + )) + ->save(); entity_get_display('test_entity', 'test_bundle', 'full') ->setComponent($this->field['field_name'], array( 'type' => 'link', @@ -124,15 +126,17 @@ function testLinkTitle() { 'settings' => array( 'title' => DRUPAL_OPTIONAL, ), - 'widget' => array( + ); + field_create_instance($this->instance); + entity_get_form_display('test_entity', 'test_bundle', 'default') + ->setComponent($this->field['field_name'], array( 'type' => 'link_default', 'settings' => array( 'placeholder_url' => 'http://example.com', 'placeholder_title' => 'Enter a title for this link', ), - ), - ); - field_create_instance($this->instance); + )) + ->save(); entity_get_display('test_entity', 'test_bundle', 'full') ->setComponent($this->field['field_name'], array( 'type' => 'link', @@ -234,15 +238,17 @@ function testLinkFormatter() { 'settings' => array( 'title' => DRUPAL_OPTIONAL, ), - 'widget' => array( - 'type' => 'link_default', - ), ); $display_options = array( 'type' => 'link', 'label' => 'hidden', ); field_create_instance($this->instance); + entity_get_form_display('test_entity', 'test_bundle', 'default') + ->setComponent($this->field['field_name'], array( + 'type' => 'link_default', + )) + ->save(); entity_get_display('test_entity', 'test_bundle', 'full') ->setComponent($this->field['field_name'], $display_options) ->save(); @@ -370,15 +376,17 @@ function testLinkSeparateFormatter() { 'settings' => array( 'title' => DRUPAL_OPTIONAL, ), - 'widget' => array( - 'type' => 'link_default', - ), ); $display_options = array( 'type' => 'link_separate', 'label' => 'hidden', ); field_create_instance($this->instance); + entity_get_form_display('test_entity', 'test_bundle', 'default') + ->setComponent($this->field['field_name'], array( + 'type' => 'link_default', + )) + ->save(); entity_get_display('test_entity', 'test_bundle', 'full') ->setComponent($this->field['field_name'], $display_options) ->save(); diff --git a/core/modules/link/lib/Drupal/link/Tests/LinkItemTest.php b/core/modules/link/lib/Drupal/link/Tests/LinkItemTest.php index e59e403..eb40cbc 100644 --- a/core/modules/link/lib/Drupal/link/Tests/LinkItemTest.php +++ b/core/modules/link/lib/Drupal/link/Tests/LinkItemTest.php @@ -44,9 +44,6 @@ public function setUp() { 'entity_type' => 'entity_test', 'field_name' => 'field_test', 'bundle' => 'entity_test', - 'widget' => array( - 'type' => 'link_default', - ), ); field_create_instance($this->instance); } diff --git a/core/modules/link/link.module b/core/modules/link/link.module index 57d744c..57e9687 100644 --- a/core/modules/link/link.module +++ b/core/modules/link/link.module @@ -112,7 +112,7 @@ function link_field_widget_info() { * Implements hook_field_widget_settings_form(). */ function link_field_widget_settings_form($field, $instance) { - $widget = $instance['widget']; + $widget = entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')->getComponent($instance['field_name']); $settings = $widget['settings']; $form['placeholder_url'] = array( @@ -141,7 +141,8 @@ function link_field_widget_settings_form($field, $instance) { */ function link_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) { $settings = $instance['settings']; - $widget_settings = $instance['widget']['settings']; + $widget = entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')->getComponent($instance['field_name']); + $widget_settings = $widget['settings']; $element['url'] = array( '#type' => 'url', diff --git a/core/modules/node/lib/Drupal/node/Plugin/views/wizard/Node.php b/core/modules/node/lib/Drupal/node/Plugin/views/wizard/Node.php index 4f868f7..644fbcf 100644 --- a/core/modules/node/lib/Drupal/node/Plugin/views/wizard/Node.php +++ b/core/modules/node/lib/Drupal/node/Plugin/views/wizard/Node.php @@ -278,9 +278,10 @@ protected function build_filters(&$form, &$form_state) { $tag_fields = array(); foreach ($bundles as $bundle) { foreach (field_info_instances($this->entity_type, $bundle) as $instance) { + $widget = entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')->getComponent($instance['field_name']); // We define "tag-like" taxonomy fields as ones that use the // "Autocomplete term widget (tagging)" widget. - if ($instance['widget']['type'] == 'taxonomy_autocomplete') { + if ($widget['type'] == 'taxonomy_autocomplete') { $tag_fields[] = $instance['field_name']; } } diff --git a/core/modules/node/lib/Drupal/node/Tests/MultiStepNodeFormBasicOptionsTest.php b/core/modules/node/lib/Drupal/node/Tests/MultiStepNodeFormBasicOptionsTest.php index 7ee1e85..465a492 100644 --- a/core/modules/node/lib/Drupal/node/Tests/MultiStepNodeFormBasicOptionsTest.php +++ b/core/modules/node/lib/Drupal/node/Tests/MultiStepNodeFormBasicOptionsTest.php @@ -54,16 +54,14 @@ function testMultiStepNodeFormBasicOptions() { 'settings' => array( 'text_processing' => TRUE, ), - 'widget' => array( - 'type' => 'text_textfield', - ), - 'display' => array( - 'full' => array( - 'type' => 'text_default', - ), - ), ); field_create_instance($this->instance); + entity_get_form_display('node', 'page', 'default') + ->setComponent($this->field_name, array( + 'type' => 'text_textfield', + )) + ->save(); + $langcode = LANGUAGE_NOT_SPECIFIED; $edit = array( diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeAccessFieldTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeAccessFieldTest.php index 0db0bda..2ef9d03 100644 --- a/core/modules/node/lib/Drupal/node/Tests/NodeAccessFieldTest.php +++ b/core/modules/node/lib/Drupal/node/Tests/NodeAccessFieldTest.php @@ -48,6 +48,9 @@ public function setUp() { entity_get_display('node', 'page', 'default') ->setComponent($this->field_name) ->save(); + entity_get_form_display('node', 'page', 'default') + ->setComponent($this->field_name) + ->save(); } /** diff --git a/core/modules/node/node.module b/core/modules/node/node.module index 9d5fe32..58416f8 100644 --- a/core/modules/node/node.module +++ b/core/modules/node/node.module @@ -589,11 +589,17 @@ function node_add_body_field($type, $label = 'Body') { 'entity_type' => 'node', 'bundle' => $type->type, 'label' => $label, - 'widget' => array('type' => 'text_textarea_with_summary'), 'settings' => array('display_summary' => TRUE), ); $instance = field_create_instance($instance); + // Assign widget settings for the 'default' form mode. + entity_get_form_display('node', $type->type, 'default') + ->setComponent($field['field_name'], array( + 'type' => 'text_textarea_with_summary', + )) + ->save(); + // Assign display settings for the 'default' and 'teaser' view modes. entity_get_display('node', $type->type, 'default') ->setComponent($field['field_name'], array( diff --git a/core/modules/number/lib/Drupal/number/Tests/NumberFieldTest.php b/core/modules/number/lib/Drupal/number/Tests/NumberFieldTest.php index 925828c..d0b98ac 100644 --- a/core/modules/number/lib/Drupal/number/Tests/NumberFieldTest.php +++ b/core/modules/number/lib/Drupal/number/Tests/NumberFieldTest.php @@ -57,21 +57,21 @@ function testNumberDecimalField() { 'field_name' => $this->field['field_name'], 'entity_type' => 'test_entity', 'bundle' => 'test_bundle', - 'widget' => array( + ); + field_create_instance($this->instance); + + entity_get_form_display('test_entity', 'test_bundle', 'default') + ->setComponent($this->field['field_name'], array( 'type' => 'number', 'settings' => array( 'placeholder' => '0.00' ), - ), - 'display' => array( - 'default' => array( - 'type' => 'number_decimal', - ), - ), - ); - field_create_instance($this->instance); + )) + ->save(); entity_get_display('test_entity', 'test_bundle', 'default') - ->setComponent($this->field['field_name']) + ->setComponent($this->field['field_name'], array( + 'type' => 'number_decimal', + )) ->save(); // Display creation form. diff --git a/core/modules/number/lib/Drupal/number/Tests/NumberItemTest.php b/core/modules/number/lib/Drupal/number/Tests/NumberItemTest.php index a0fc778..fa7e0fa 100644 --- a/core/modules/number/lib/Drupal/number/Tests/NumberItemTest.php +++ b/core/modules/number/lib/Drupal/number/Tests/NumberItemTest.php @@ -45,9 +45,6 @@ public function setUp() { 'entity_type' => 'entity_test', 'field_name' => 'field_' . $type, 'bundle' => 'entity_test', - 'widget' => array( - 'type' => 'number', - ), ); field_create_instance($this->instance[$type]); } diff --git a/core/modules/options/lib/Drupal/options/Tests/OptionsDynamicValuesTest.php b/core/modules/options/lib/Drupal/options/Tests/OptionsDynamicValuesTest.php index 4065b7d..4e97dbe 100644 --- a/core/modules/options/lib/Drupal/options/Tests/OptionsDynamicValuesTest.php +++ b/core/modules/options/lib/Drupal/options/Tests/OptionsDynamicValuesTest.php @@ -40,11 +40,14 @@ function setUp() { 'entity_type' => 'test_entity', 'bundle' => 'test_bundle', 'required' => TRUE, - 'widget' => array( - 'type' => 'options_select', - ), ); $this->instance = field_create_instance($this->instance); + entity_get_form_display('test_entity', 'test_bundle', 'default') + ->setComponent($this->field_name, array( + 'type' => 'options_select', + )) + ->save(); + $this->test = array( 'id' => mt_rand(1, 10), // Make sure this does not equal the ID so that diff --git a/core/modules/options/lib/Drupal/options/Tests/OptionsFieldTest.php b/core/modules/options/lib/Drupal/options/Tests/OptionsFieldTest.php index ca9d605..51e771b 100644 --- a/core/modules/options/lib/Drupal/options/Tests/OptionsFieldTest.php +++ b/core/modules/options/lib/Drupal/options/Tests/OptionsFieldTest.php @@ -50,11 +50,13 @@ function setUp() { 'field_name' => $this->field_name, 'entity_type' => 'entity_test', 'bundle' => 'entity_test', - 'widget' => array( - 'type' => 'options_buttons', - ), ); $this->instance = field_create_instance($this->instance); + entity_get_form_display('entity_test', 'entity_test', 'default') + ->setComponent($this->field_name, array( + 'type' => 'options_buttons', + )) + ->save(); } /** @@ -115,11 +117,14 @@ function testUpdateAllowedValues() { 'field_name' => $this->field_name, 'entity_type' => 'entity_test', 'bundle' => 'entity_test', - 'widget' => array( - 'type' => 'options_buttons', - ), ); $this->instance = field_create_instance($this->instance); + entity_get_form_display('entity_test', 'entity_test', 'default') + ->setComponent($this->field_name, array( + 'type' => 'options_buttons', + )) + ->save(); + $entity = entity_create('entity_test', array()); $form = entity_get_form($entity); $this->assertTrue(!empty($form[$this->field_name][$langcode][1]), 'Option 1 exists'); diff --git a/core/modules/options/lib/Drupal/options/Tests/OptionsFieldUITest.php b/core/modules/options/lib/Drupal/options/Tests/OptionsFieldUITest.php index 5f6fcc1..c61deaa 100644 --- a/core/modules/options/lib/Drupal/options/Tests/OptionsFieldUITest.php +++ b/core/modules/options/lib/Drupal/options/Tests/OptionsFieldUITest.php @@ -215,6 +215,10 @@ function testOptionsAllowedValuesBoolean() { ); $this->drupalPost($this->admin_path, $edit, t('Save field settings')); $this->assertRaw(t('Updated field %label field settings.', array('%label' => $this->field_name))); + + // Clear field cache. + field_info_cache_clear(); + // Test the allowed_values on the field settings form. $this->drupalGet($this->admin_path); $this->assertFieldByName('on', $on, t("The 'On' value is stored correctly.")); @@ -258,6 +262,15 @@ protected function createOptionsField($type) { ); field_create_instance($instance); + // Grab the default widget for the field type. + $field_type_definition = field_info_field_types($field['type']); + $plugin_id = $field_type_definition['default_widget']; + entity_get_form_display('node', $this->type, 'default') + ->setComponent($this->field_name, array( + 'type' => $plugin_id, + )) + ->save(); + $this->admin_path = 'admin/structure/types/manage/' . $this->type . '/fields/' . $this->field_name . '/field-settings'; } diff --git a/core/modules/options/lib/Drupal/options/Tests/OptionsWidgetsTest.php b/core/modules/options/lib/Drupal/options/Tests/OptionsWidgetsTest.php index 023f012..9e2a43e 100644 --- a/core/modules/options/lib/Drupal/options/Tests/OptionsWidgetsTest.php +++ b/core/modules/options/lib/Drupal/options/Tests/OptionsWidgetsTest.php @@ -82,11 +82,14 @@ function testRadioButtons() { 'field_name' => $this->card_1['field_name'], 'entity_type' => 'test_entity', 'bundle' => 'test_bundle', - 'widget' => array( - 'type' => 'options_buttons', - ), ); $instance = field_create_instance($instance); + entity_get_form_display('test_entity', 'test_bundle', 'default') + ->setComponent($this->card_1['field_name'], array( + 'type' => 'options_buttons', + )) + ->save(); + $langcode = LANGUAGE_NOT_SPECIFIED; // Create an entity. @@ -136,11 +139,14 @@ function testCheckBoxes() { 'field_name' => $this->card_2['field_name'], 'entity_type' => 'test_entity', 'bundle' => 'test_bundle', - 'widget' => array( - 'type' => 'options_buttons', - ), ); $instance = field_create_instance($instance); + entity_get_form_display('test_entity', 'test_bundle', 'default') + ->setComponent($this->card_2['field_name'], array( + 'type' => 'options_buttons', + )) + ->save(); + $langcode = LANGUAGE_NOT_SPECIFIED; // Create an entity. @@ -224,11 +230,14 @@ function testSelectListSingle() { 'entity_type' => 'test_entity', 'bundle' => 'test_bundle', 'required' => TRUE, - 'widget' => array( - 'type' => 'options_select', - ), ); $instance = field_create_instance($instance); + entity_get_form_display('test_entity', 'test_bundle', 'default') + ->setComponent($this->card_1['field_name'], array( + 'type' => 'options_select', + )) + ->save(); + $langcode = LANGUAGE_NOT_SPECIFIED; // Create an entity. @@ -320,11 +329,14 @@ function testSelectListMultiple() { 'field_name' => $this->card_2['field_name'], 'entity_type' => 'test_entity', 'bundle' => 'test_bundle', - 'widget' => array( - 'type' => 'options_select', - ), ); $instance = field_create_instance($instance); + entity_get_form_display('test_entity', 'test_bundle', 'default') + ->setComponent($this->card_2['field_name'], array( + 'type' => 'options_select', + )) + ->save(); + $langcode = LANGUAGE_NOT_SPECIFIED; // Create an entity. @@ -437,11 +449,14 @@ function testOnOffCheckbox() { 'field_name' => $this->bool['field_name'], 'entity_type' => 'test_entity', 'bundle' => 'test_bundle', - 'widget' => array( - 'type' => 'options_onoff', - ), ); $instance = field_create_instance($instance); + entity_get_form_display('test_entity', 'test_bundle', 'default') + ->setComponent($this->bool['field_name'], array( + 'type' => 'options_onoff', + )) + ->save(); + $langcode = LANGUAGE_NOT_SPECIFIED; // Create an entity. @@ -488,13 +503,15 @@ function testOnOffCheckbox() { 'field_name' => $this->bool['field_name'], 'entity_type' => 'node', 'bundle' => 'page', - 'widget' => array( - 'type' => 'options_onoff', - 'module' => 'options', - ), ); field_create_instance($instance); + entity_get_form_display('node', 'page', 'default') + ->setComponent($this->bool['field_name'], array( + 'type' => 'options_onoff', + )) + ->save(); + // Go to the edit page and check if the default settings works as expected $fieldEditUrl = 'admin/structure/types/manage/page/fields/bool'; $this->drupalGet($fieldEditUrl); diff --git a/core/modules/options/options.module b/core/modules/options/options.module index 793b07e..96b8ec3 100644 --- a/core/modules/options/options.module +++ b/core/modules/options/options.module @@ -151,10 +151,11 @@ function options_field_settings_form($field, $instance, $has_data) { } // Alter the description for allowed values depending on the widget type. - if ($instance['widget']['type'] == 'options_onoff') { + $widget = entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')->getComponent($instance['field_name']); + if ($widget['type'] == 'options_onoff') { $form['allowed_values']['#description'] .= '

' . t("For a 'single on/off checkbox' widget, define the 'off' value first, then the 'on' value in the Allowed values section. Note that the checkbox will be labeled with the label of the 'on' value.") . '

'; } - elseif ($instance['widget']['type'] == 'options_buttons') { + elseif ($widget['type'] == 'options_buttons') { $form['allowed_values']['#description'] .= '

' . t("The 'checkboxes/radio buttons' widget will display checkboxes if the Number of values option is greater than 1 for this field, otherwise radios will be displayed.") . '

'; } $form['allowed_values']['#description'] .= '

' . t('Allowed HTML tags in labels: @tags', array('@tags' => _field_filter_xss_display_allowed_tags())) . '

'; @@ -479,7 +480,8 @@ function options_field_widget_form(&$form, &$form_state, $field, $instance, $lan // reuse those widgets. $value_key = key($field['columns']); - $type = str_replace('options_', '', $instance['widget']['type']); + $widget = entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')->getComponent($instance['field_name']); + $type = str_replace('options_', '', $widget['type']); $multiple = $field['cardinality'] > 1 || $field['cardinality'] == FIELD_CARDINALITY_UNLIMITED; $required = $element['#required']; $has_value = isset($items[0][$value_key]); @@ -540,7 +542,7 @@ function options_field_widget_form(&$form, &$form_state, $field, $instance, $lan // Override the title from the incoming $element. $element['#title'] = isset($options[$on_value]) ? $options[$on_value] : ''; - if ($instance['widget']['settings']['display_label']) { + if ($widget['settings']['display_label']) { $element['#title'] = $instance['label']; } break; @@ -560,11 +562,12 @@ function options_field_widget_form(&$form, &$form_state, $field, $instance, $lan */ function options_field_widget_settings_form($field, $instance) { $form = array(); - if ($instance['widget']['type'] == 'options_onoff') { + $widget = entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')->getComponent($instance['field_name']); + if ($widget['type'] == 'options_onoff') { $form['display_label'] = array( '#type' => 'checkbox', '#title' => t('Use field label instead of the "On value" as label'), - '#default_value' => $instance['widget']['settings']['display_label'], + '#default_value' => $widget['settings']['display_label'], '#weight' => -1, ); } @@ -851,7 +854,8 @@ function theme_options_none($variables) { $option = $variables['option']; $output = ''; - switch ($instance['widget']['type']) { + $widget = entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default')->getComponent($instance['field_name']); + switch ($widget['type']) { case 'options_buttons': $output = t('N/A'); break; diff --git a/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaMarkupTest.php b/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaMarkupTest.php index 6f99dae..5d917a4 100644 --- a/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaMarkupTest.php +++ b/core/modules/rdf/lib/Drupal/rdf/Tests/RdfaMarkupTest.php @@ -117,6 +117,12 @@ function testAttributesInMarkupFile() { 'bundle' => $bundle_name, ); field_create_instance($instance); + + entity_get_form_display('node', $bundle_name, 'default') + ->setComponent($field_name, array( + 'type' => 'file_generic', + )) + ->save(); entity_get_display('node', $bundle_name, 'teaser') ->setComponent($field_name, array( 'type' => 'file_default', diff --git a/core/modules/serialization/lib/Drupal/serialization/Tests/EntitySerializationTest.php b/core/modules/serialization/lib/Drupal/serialization/Tests/EntitySerializationTest.php index fb7019e..637564f 100644 --- a/core/modules/serialization/lib/Drupal/serialization/Tests/EntitySerializationTest.php +++ b/core/modules/serialization/lib/Drupal/serialization/Tests/EntitySerializationTest.php @@ -72,10 +72,6 @@ protected function setUp() { 'field_name' => 'field_test_text', 'bundle' => 'entity_test_mulrev', 'label' => 'Test text-field', - 'widget' => array( - 'type' => 'text_textfield', - 'weight' => 0, - ), ); field_create_instance($instance); diff --git a/core/modules/simpletest/lib/Drupal/simpletest/Tests/DrupalUnitTestBaseTest.php b/core/modules/simpletest/lib/Drupal/simpletest/Tests/DrupalUnitTestBaseTest.php index 3aeab60..c9b84e5 100644 --- a/core/modules/simpletest/lib/Drupal/simpletest/Tests/DrupalUnitTestBaseTest.php +++ b/core/modules/simpletest/lib/Drupal/simpletest/Tests/DrupalUnitTestBaseTest.php @@ -232,7 +232,7 @@ function testEnableModulesFixedList() { $display = entity_create('entity_display', array( 'targetEntityType' => 'entity_test', 'bundle' => 'entity_test', - 'viewMode' => 'default', + 'displayMode' => 'default', )); $field = array( 'field_name' => 'test_field', diff --git a/core/modules/system/lib/Drupal/system/Tests/Ajax/MultiFormTest.php b/core/modules/system/lib/Drupal/system/Tests/Ajax/MultiFormTest.php index c9e7b6d..d3ba0b7 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Ajax/MultiFormTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Ajax/MultiFormTest.php @@ -46,6 +46,9 @@ function setUp() { 'bundle' => 'page', ); field_create_instance($instance); + entity_get_form_display('node', 'page', 'default') + ->setComponent($field_name, array('type' => 'text_default')) + ->save(); // Login a user who can create 'page' nodes. $this->web_user = $this->drupalCreateUser(array('create page content')); diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityUnitTestBase.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityUnitTestBase.php index b747e79..e021356 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityUnitTestBase.php +++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityUnitTestBase.php @@ -19,7 +19,7 @@ * * @var array */ - public static $modules = array('user', 'system', 'field', 'text', 'field_sql_storage', 'entity_test'); + public static $modules = array('user', 'system', 'field', 'text', 'field_sql_storage', 'entity', 'entity_test'); public function setUp() { parent::setUp(); diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/FieldAccessTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/FieldAccessTest.php index 09e7a7a..ea0ddc3 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Entity/FieldAccessTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Entity/FieldAccessTest.php @@ -19,7 +19,7 @@ class FieldAccessTest extends DrupalUnitTestBase { * * @var array */ - public static $modules = array('entity_test', 'field', 'field_sql_storage', 'system', 'text', 'user'); + public static $modules = array('entity_test', 'field', 'field_sql_storage', 'system', 'text', 'user', 'entity'); /** * Holds the currently active global user ID that initiated the test run. diff --git a/core/modules/system/lib/Drupal/system/Tests/Form/ArbitraryRebuildTest.php b/core/modules/system/lib/Drupal/system/Tests/Form/ArbitraryRebuildTest.php index 1604063..f0609a1 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Form/ArbitraryRebuildTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Form/ArbitraryRebuildTest.php @@ -46,12 +46,14 @@ function setUp() { 'field_name' => 'test_multiple', 'bundle' => 'page', 'label' => 'Test a multiple valued field', - 'widget' => array( - 'type' => 'text_textfield', - 'weight' => 0, - ), ); field_create_instance($instance); + entity_get_form_display('node', 'page', 'default') + ->setComponent('test_multiple', array( + 'type' => 'text_textfield', + 'weight' => 0, + )) + ->save(); } /** diff --git a/core/modules/system/lib/Drupal/system/Tests/Form/RebuildTest.php b/core/modules/system/lib/Drupal/system/Tests/Form/RebuildTest.php index 3c0c0c5..8e9f649 100644 --- a/core/modules/system/lib/Drupal/system/Tests/Form/RebuildTest.php +++ b/core/modules/system/lib/Drupal/system/Tests/Form/RebuildTest.php @@ -83,6 +83,9 @@ function testPreserveFormActionAfterAJAX() { 'bundle' => 'page', ); field_create_instance($instance); + entity_get_form_display('node', 'page', 'default') + ->setComponent($field_name, array('type' => 'text_test')) + ->save(); // Log in a user who can create 'page' nodes. $this->web_user = $this->drupalCreateUser(array('create page content')); diff --git a/core/modules/system/tests/modules/entity_test/entity_test.install b/core/modules/system/tests/modules/entity_test/entity_test.install index d0da050..ba43ab5 100644 --- a/core/modules/system/tests/modules/entity_test/entity_test.install +++ b/core/modules/system/tests/modules/entity_test/entity_test.install @@ -30,12 +30,12 @@ function entity_test_install() { 'field_name' => 'field_test_text', 'bundle' => $entity_type, 'label' => 'Test text-field', - 'widget' => array( - 'type' => 'text_textfield', - 'weight' => 0, - ), ); field_create_instance($instance); + + entity_get_form_display($entity_type, $entity_type, 'default') + ->setComponent('field_test_text', array('type' => 'text_text')) + ->save(); } } diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php index 4c3e3d3..a1c0e67 100644 --- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php +++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/RssTest.php @@ -53,11 +53,13 @@ function setUp() { 'field_name' => 'taxonomy_' . $this->vocabulary->id(), 'bundle' => 'article', 'entity_type' => 'node', - 'widget' => array( - 'type' => 'options_select', - ), ); field_create_instance($this->instance); + entity_get_form_display('node', 'article', 'default') + ->setComponent($field['field_name'], array( + 'type' => 'options_select', + )) + ->save(); entity_get_display('node', 'article', 'default') ->setComponent('taxonomy_' . $this->vocabulary->id(), array( 'type' => 'taxonomy_term_reference_link', diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TaxonomyTermReferenceItemTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TaxonomyTermReferenceItemTest.php index ea9bc3e..4f54df9 100644 --- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TaxonomyTermReferenceItemTest.php +++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TaxonomyTermReferenceItemTest.php @@ -60,9 +60,6 @@ public function setUp() { 'entity_type' => 'entity_test', 'field_name' => 'field_test_taxonomy', 'bundle' => 'entity_test', - 'widget' => array( - 'type' => 'options_select', - ), ); field_create_instance($instance); $this->term = entity_create('taxonomy_term', array( diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldMultipleVocabularyTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldMultipleVocabularyTest.php index 8c5571c..0d317c4 100644 --- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldMultipleVocabularyTest.php +++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldMultipleVocabularyTest.php @@ -63,11 +63,13 @@ function setUp() { 'field_name' => $this->field_name, 'entity_type' => 'test_entity', 'bundle' => 'test_bundle', - 'widget' => array( - 'type' => 'options_select', - ), ); field_create_instance($this->instance); + entity_get_form_display('test_entity', 'test_bundle', 'default') + ->setComponent($this->field_name, array( + 'type' => 'options_select', + )) + ->save(); entity_get_display('test_entity', 'test_bundle', 'full') ->setComponent($this->field_name, array( 'type' => 'taxonomy_term_reference_link', diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldTest.php index d5de5fa..b1c2bcf 100644 --- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldTest.php +++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermFieldTest.php @@ -58,11 +58,13 @@ function setUp() { 'field_name' => $this->field_name, 'entity_type' => 'test_entity', 'bundle' => 'test_bundle', - 'widget' => array( - 'type' => 'options_select', - ), ); field_create_instance($this->instance); + entity_get_form_display('test_entity', 'test_bundle', 'default') + ->setComponent($this->field_name, array( + 'type' => 'options_select', + )) + ->save(); entity_get_display('test_entity', 'test_bundle', 'full') ->setComponent($this->field_name, array( 'type' => 'taxonomy_term_reference_link', diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermIndexTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermIndexTest.php index f9cba0d..e55945d 100644 --- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermIndexTest.php +++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermIndexTest.php @@ -49,11 +49,13 @@ function setUp() { 'field_name' => $this->field_name_1, 'bundle' => 'article', 'entity_type' => 'node', - 'widget' => array( - 'type' => 'options_select', - ), ); field_create_instance($this->instance_1); + entity_get_form_display('node', 'article', 'default') + ->setComponent($this->field_name_1, array( + 'type' => 'options_select', + )) + ->save(); entity_get_display('node', 'article', 'default') ->setComponent($this->field_name_1, array( 'type' => 'taxonomy_term_reference_link', @@ -79,11 +81,13 @@ function setUp() { 'field_name' => $this->field_name_2, 'bundle' => 'article', 'entity_type' => 'node', - 'widget' => array( - 'type' => 'options_select', - ), ); field_create_instance($this->instance_2); + entity_get_form_display('node', 'article', 'default') + ->setComponent($this->field_name_2, array( + 'type' => 'options_select', + )) + ->save(); entity_get_display('node', 'article', 'default') ->setComponent($this->field_name_2, array( 'type' => 'taxonomy_term_reference_link', diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php index 93cc8d4..8668ef8 100644 --- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php +++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TermTest.php @@ -45,11 +45,13 @@ function setUp() { 'field_name' => 'taxonomy_' . $this->vocabulary->id(), 'bundle' => 'article', 'entity_type' => 'node', - 'widget' => array( - 'type' => 'options_select', - ), ); field_create_instance($this->instance); + entity_get_form_display('node', 'article', 'default') + ->setComponent('taxonomy_' . $this->vocabulary->id(), array( + 'type' => 'options_select', + )) + ->save(); entity_get_display('node', 'article', 'default') ->setComponent($this->instance['field_name'], array( 'type' => 'taxonomy_term_reference_link', @@ -142,13 +144,14 @@ function testTaxonomyNode() { function testNodeTermCreationAndDeletion() { // Enable tags in the vocabulary. $instance = $this->instance; - $instance['widget'] = array( - 'type' => 'taxonomy_autocomplete', - 'settings' => array( - 'placeholder' => 'Start typing here.', - ), - ); - field_update_instance($instance); + entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default') + ->setComponent($instance['field_name'], array( + 'type' => 'taxonomy_autocomplete', + 'settings' => array( + 'placeholder' => 'Start typing here.', + ), + )) + ->save(); $terms = array( 'term1' => $this->randomName(), 'term2' => $this->randomName(), @@ -506,8 +509,11 @@ function testTaxonomyGetTermByName() { function testReSavingTags() { // Enable tags in the vocabulary. $instance = $this->instance; - $instance['widget'] = array('type' => 'taxonomy_autocomplete'); - field_update_instance($instance); + entity_get_form_display($instance['entity_type'], $instance['bundle'], 'default') + ->setComponent($instance['field_name'], array( + 'type' => 'taxonomy_autocomplete', + )) + ->save(); // Create a term and a node using it. $term = $this->createTerm($this->vocabulary); diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php index ea73152..1390139 100644 --- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php +++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/TokenReplaceTest.php @@ -46,11 +46,13 @@ function setUp() { 'field_name' => 'taxonomy_' . $this->vocabulary->id(), 'bundle' => 'article', 'entity_type' => 'node', - 'widget' => array( - 'type' => 'options_select', - ), ); field_create_instance($this->instance); + entity_get_form_display('node', 'article', 'default') + ->setComponent('taxonomy_' . $this->vocabulary->id(), array( + 'type' => 'options_select', + )) + ->save(); entity_get_display('node', 'article', 'default') ->setComponent('taxonomy_' . $this->vocabulary->id(), array( 'type' => 'taxonomy_term_reference_link', diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/Views/TaxonomyTestBase.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/Views/TaxonomyTestBase.php index 5f98990..d73e479 100644 --- a/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/Views/TaxonomyTestBase.php +++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Tests/Views/TaxonomyTestBase.php @@ -100,13 +100,16 @@ protected function mockStandardInstall() { 'entity_type' => 'node', 'label' => 'Tags', 'bundle' => 'article', - 'widget' => array( - 'type' => 'taxonomy_autocomplete', - 'weight' => -4, - ), ); field_create_instance($instance); + entity_get_form_display('node', 'article', 'default') + ->setComponent($instance['field_name'], array( + 'type' => 'taxonomy_autocomplete', + 'weight' => -4, + )) + ->save(); + entity_get_display('node', 'article', 'default') ->setComponent($instance['field_name'], array( 'type' => 'taxonomy_term_reference_link', diff --git a/core/modules/telephone/lib/Drupal/telephone/Tests/TelephoneFieldTest.php b/core/modules/telephone/lib/Drupal/telephone/Tests/TelephoneFieldTest.php index 4d09f45..bbac418 100644 --- a/core/modules/telephone/lib/Drupal/telephone/Tests/TelephoneFieldTest.php +++ b/core/modules/telephone/lib/Drupal/telephone/Tests/TelephoneFieldTest.php @@ -67,6 +67,12 @@ function testTelephoneField() { ); field_create_instance($instance); + entity_get_form_display('node', 'article', 'default') + ->setComponent('field_telephone', array( + 'type' => 'telephone_default', + )) + ->save(); + entity_get_display('node', 'article', 'default') ->setComponent('field_telephone', array( 'type' => 'telephone_link', diff --git a/core/modules/telephone/lib/Drupal/telephone/Tests/TelephoneItemTest.php b/core/modules/telephone/lib/Drupal/telephone/Tests/TelephoneItemTest.php index 35012b3..d809161 100644 --- a/core/modules/telephone/lib/Drupal/telephone/Tests/TelephoneItemTest.php +++ b/core/modules/telephone/lib/Drupal/telephone/Tests/TelephoneItemTest.php @@ -44,9 +44,6 @@ public function setUp() { 'entity_type' => 'entity_test', 'field_name' => 'field_test', 'bundle' => 'entity_test', - 'widget' => array( - 'type' => 'telephone_default', - ), ); field_create_instance($this->instance); } diff --git a/core/modules/text/lib/Drupal/text/Tests/Formatter/TextPlainUnitTest.php b/core/modules/text/lib/Drupal/text/Tests/Formatter/TextPlainUnitTest.php index 716ead7..f65b752 100644 --- a/core/modules/text/lib/Drupal/text/Tests/Formatter/TextPlainUnitTest.php +++ b/core/modules/text/lib/Drupal/text/Tests/Formatter/TextPlainUnitTest.php @@ -62,9 +62,6 @@ function setUp() { 'text_processing' => FALSE, ); - $this->widget_type = 'text_textarea'; - $this->widget_settings = array(); - $this->formatter_type = 'text_plain'; $this->formatter_settings = array(); @@ -81,10 +78,6 @@ function setUp() { 'field_name' => $this->field_name, 'label' => $this->randomName(), 'settings' => $this->instance_settings, - 'widget' => array( - 'type' => $this->widget_type, - 'settings' => $this->widget_settings, - ), ); $this->instance = field_create_instance($this->instance); diff --git a/core/modules/text/lib/Drupal/text/Tests/TextFieldTest.php b/core/modules/text/lib/Drupal/text/Tests/TextFieldTest.php index f8c585b..d702836 100644 --- a/core/modules/text/lib/Drupal/text/Tests/TextFieldTest.php +++ b/core/modules/text/lib/Drupal/text/Tests/TextFieldTest.php @@ -62,14 +62,16 @@ function testTextFieldValidation() { 'field_name' => $this->field['field_name'], 'entity_type' => 'test_entity', 'bundle' => 'test_bundle', - 'widget' => array( - 'type' => 'text_textfield', - ), ); field_create_instance($this->instance); - entity_get_display('test_entity', 'test_bundle', 'default') - ->setComponent($this->field['field_name']) + entity_get_form_display('test_entity', 'test_bundle', 'default') + ->setComponent($this->field['field_name'], array( + 'type' => 'text_textfield', + )) ->save(); +// entity_get_display('test_entity', 'test_bundle', 'default') +// ->setComponent($this->field['field_name']) +// ->save(); // Test valid and invalid values with field_attach_validate(). $entity = field_test_create_entity(); @@ -111,14 +113,16 @@ function _testTextfieldWidgets($field_type, $widget_type) { 'settings' => array( 'text_processing' => TRUE, ), - 'widget' => array( + ); + field_create_instance($this->instance); + entity_get_form_display('test_entity', 'test_bundle', 'default') + ->setComponent($this->field_name, array( 'type' => $widget_type, 'settings' => array( 'placeholder' => 'A placeholder on ' . $widget_type, ), - ), - ); - field_create_instance($this->instance); + )) + ->save(); entity_get_display('test_entity', 'test_bundle', 'full') ->setComponent($this->field_name) ->save(); @@ -174,11 +178,13 @@ function _testTextfieldWidgetsFormatted($field_type, $widget_type) { 'settings' => array( 'text_processing' => TRUE, ), - 'widget' => array( - 'type' => $widget_type, - ), ); field_create_instance($this->instance); + entity_get_form_display('test_entity', 'test_bundle', 'default') + ->setComponent($this->field_name, array( + 'type' => $widget_type, + )) + ->save(); entity_get_display('test_entity', 'test_bundle', 'full') ->setComponent($this->field_name) ->save(); diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationSyncImageTest.php b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationSyncImageTest.php index 61f93cf..aa9c626 100644 --- a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationSyncImageTest.php +++ b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationSyncImageTest.php @@ -69,10 +69,6 @@ protected function setupTestFields() { 'field_name' => $this->fieldName, 'bundle' => $this->entityType, 'label' => 'Test translatable image field', - 'widget' => array( - 'type' => 'image_image', - 'weight' => 0, - ), 'settings' => array( 'translation_sync' => array( 'file' => FALSE, diff --git a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationTestBase.php b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationTestBase.php index 13e1f59..870321f 100644 --- a/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationTestBase.php +++ b/core/modules/translation_entity/lib/Drupal/translation_entity/Tests/EntityTranslationTestBase.php @@ -170,12 +170,14 @@ protected function setupTestFields() { 'field_name' => $this->fieldName, 'bundle' => $this->bundle, 'label' => 'Test translatable text-field', - 'widget' => array( - 'type' => 'text_textfield', - 'weight' => 0, - ), ); field_create_instance($instance); + entity_get_form_display($this->entityType, $this->bundle, 'default') + ->setComponent($this->fieldName, array( + 'type' => 'text_textfield', + 'weight' => 0, + )) + ->save(); } /** diff --git a/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php b/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php index 38ca376..db649b0 100644 --- a/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php +++ b/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php @@ -209,6 +209,9 @@ function testRegistrationWithUserFields() { 'settings' => array('user_register_form' => FALSE), ); field_create_instance($instance); + entity_get_form_display('user', 'user', 'default') + ->setComponent('test_user_field', array('type' => 'test_field_widget')) + ->save(); // Check that the field does not appear on the registration form. $this->drupalGet('user/register'); diff --git a/core/modules/user/user.install b/core/modules/user/user.install index c7fd16b..8b4b096 100644 --- a/core/modules/user/user.install +++ b/core/modules/user/user.install @@ -339,17 +339,20 @@ function user_install_picture_field() { 'min_resolution' => '', 'default_image' => 0, ), - 'widget' => array( - 'module' => 'image', + ); + field_create_instance($instance); + + // Assign form display settings for the 'default' view mode. + entity_get_form_display('user', 'user', 'default') + ->setComponent('user_picture', array( 'type' => 'image_image', 'settings' => array( 'progress_indicator' => 'throbber', 'preview_image_style' => 'thumbnail', ), 'weight' => -1, - ), - ); - field_create_instance($instance); + )) + ->save(); // Assign display settings for the 'default' and 'compact' view modes. entity_get_display('user', 'user', 'default') @@ -735,29 +738,32 @@ function user_update_8011() { 'min_resolution' => '', 'default_image' => !empty($default_image_fid) ? $default_image_fid : 0, ), - 'widget' => array( - 'module' => 'image', - 'type' => 'image_image', + ); + _update_7000_field_create_instance($field, $instance); + + module_load_install('entity'); + if (update_variable_get('user_pictures', 0)) { + $formatter = 'image'; + $widget = 'image_image'; + } + else { + $formatter = $widget = 'hidden'; + } + + // Assign form settings for the 'default' form mode. + $form_display = _update_8000_entity_get_form_display('user', 'user', 'default'); + $form_display->set('content.user_picture', array( + 'type' => $widget, 'settings' => array( 'progress_indicator' => 'throbber', 'preview_image_style' => 'thumbnail', ), 'weight' => -1, - ), - ); - _update_7000_field_create_instance($field, $instance); - - // Assign display settings for the 'default' and 'compact' view modes. In D7, - // user pictures did not require Image module to work. Image module only - // allowed usage of an image style to format user pictures in the output. - // The 'user_pictures' variable had a global effect on the presence of the - // user picture functionality before. The new user picture image field is - // created regardless of that global setting, which means the field appears - // on the user account form after migration, even if user pictures were - // disabled previously. The picture is only hidden in the output. - $formatter = update_variable_get('user_pictures', 0) ? 'image' : 'hidden'; - module_load_install('entity'); + )) + ->save(); + update_config_manifest_add('entity.form_display', array($form_display->get('id'))); + // Assign display settings for the 'default' and 'compact' view modes. $display = _update_8000_entity_get_display('user', 'user', 'default'); $display->set('content.user_picture', array( 'label' => 'hidden', diff --git a/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php b/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php index c4f90b8..174c598 100644 --- a/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php +++ b/core/modules/views/lib/Drupal/views/Tests/DefaultViewsTest.php @@ -77,16 +77,8 @@ protected function setUp() { 'field_name' => $this->field_name, 'entity_type' => 'node', 'bundle' => 'page', - 'widget' => array( - 'type' => 'options_select', - ), ); field_create_instance($this->instance); - entity_get_display('node', 'page', 'full') - ->setComponent($this->field_name, array( - 'type' => 'taxonomy_term_reference_link', - )) - ->save(); // Create a time in the past for the archive. $time = time() - 3600; diff --git a/core/modules/views/lib/Drupal/views/Tests/Wizard/TaggedWithTest.php b/core/modules/views/lib/Drupal/views/Tests/Wizard/TaggedWithTest.php index 6416193..bb2696c 100644 --- a/core/modules/views/lib/Drupal/views/Tests/Wizard/TaggedWithTest.php +++ b/core/modules/views/lib/Drupal/views/Tests/Wizard/TaggedWithTest.php @@ -74,12 +74,15 @@ function setUp() { 'field_name' => 'field_views_testing_tags', 'entity_type' => 'node', 'bundle' => $this->node_type_with_tags->type, - 'widget' => array( - 'type' => 'taxonomy_autocomplete', - ), ); field_create_instance($this->tag_instance); + entity_get_form_display('node', $this->node_type_with_tags->type, 'default') + ->setComponent('field_views_testing_tags', array( + 'type' => 'taxonomy_autocomplete', + )) + ->save(); + entity_get_display('node', $this->node_type_with_tags->type, 'default') ->setComponent('field_views_testing_tags', array( 'type' => 'taxonomy_term_reference_link', @@ -185,6 +188,12 @@ function testTaggedWithByNodeType() { $instance = $this->tag_instance; $instance['bundle'] = $this->node_type_without_tags->type; field_create_instance($instance); + entity_get_form_display('node', $this->node_type_without_tags->type, 'default') + ->setComponent('field_views_testing_tags', array( + 'type' => 'taxonomy_autocomplete', + )) + ->save(); + $view['show[type]'] = $this->node_type_with_tags->type; $this->drupalPost('admin/structure/views/add', $view, t('Update "of type" choice')); $this->assertFieldByXpath($tags_xpath); diff --git a/core/profiles/standard/standard.install b/core/profiles/standard/standard.install index 9a176ba..1110ad7 100644 --- a/core/profiles/standard/standard.install +++ b/core/profiles/standard/standard.install @@ -117,13 +117,17 @@ function standard_install() { 'label' => 'Tags', 'bundle' => 'article', 'description' => $help, - 'widget' => array( - 'type' => 'taxonomy_autocomplete', - 'weight' => -4, - ), ); field_create_instance($instance); + // Assign widget settings for the 'default' form mode. + entity_get_form_display('node', 'article', 'default') + ->setComponent($instance['field_name'], array( + 'type' => 'taxonomy_autocomplete', + 'weight' => -4, + )) + ->save(); + // Assign display settings for the 'default' and 'teaser' view modes. entity_get_display('node', 'article', 'default') ->setComponent($instance['field_name'], array( @@ -179,17 +183,20 @@ function standard_install() { 'alt_field' => TRUE, 'title_field' => '', ), + ); + field_create_instance($instance); - 'widget' => array( + // Assign widget settings for the 'default' form mode. + entity_get_form_display('node', 'article', 'default') + ->setComponent($instance['field_name'], array( 'type' => 'image_image', 'settings' => array( 'progress_indicator' => 'throbber', 'preview_image_style' => 'thumbnail', ), 'weight' => -1, - ), - ); - field_create_instance($instance); + )) + ->save(); // Assign display settings for the 'default' and 'teaser' view modes. entity_get_display('node', 'article', 'default')