diff --git a/core/lib/Drupal/Core/Field/FieldDefinition.php b/core/lib/Drupal/Core/Field/FieldDefinition.php index 5462b91..aedac11 100644 --- a/core/lib/Drupal/Core/Field/FieldDefinition.php +++ b/core/lib/Drupal/Core/Field/FieldDefinition.php @@ -211,41 +211,45 @@ public function setPropertyConstraints($name, array $constraints) { * - settings: (array) Settings for the plugin specified above. The default * settings for the plugin will be used for settings left unspecified. * - weight: (float) The weight of the element. - * @param bool $configurable - * (optional) Whether the display options can be configured in the "Manage - * display" / "Manage form display" UI screens. If TRUE, the options - * specified in $options act as defaults. Defaults to FALSE. * * @return static * The object itself for chaining. */ - public function setDisplayOptions($display_context, array $options, $configurable = FALSE) { - $this->definition['display'][$display_context] = array( - 'options' => $options, - 'configurable' => $configurable, - ); + public function setDisplayOptions($display_context, array $options) { + $this->definition['display'][$display_context]['options'] = $options; return $this; } /** - * Returns the display options for the field. + * Sets whether the field's display is configurable. * - * @param string $context + * @param string $display_context * The display context. Either 'view' or 'form'. + * @param bool $configurable + * Whether the display options can be configured in the "Manage display" / + * "Manage form display" UI screens. If TRUE, the options specified via + * getDisplayOptions() act as defaults. * - * @return array|null - * The array of display options for the field, or NULL if the field is not - * displayed. + * @return static + * The object itself for chaining. + */ + public function setDisplayConfigurable($display_context, $configurable) { + $this->definition['display'][$display_context]['configurable'] = $configurable; + return $this; + } + + /** + * {@inheritdoc} */ public function getDisplayOptions($display_context) { - return isset($this->definition['display'][$display_context]) ? $this->definition['display'][$display_context]['options'] : NULL; + return isset($this->definition['display'][$display_context]['options']) ? $this->definition['display'][$display_context]['options'] : NULL; } /** * {@inheritdoc} */ public function isDisplayConfigurable($display_context) { - return isset($this->definition['display'][$display_context]) ? $this->definition['display'][$display_context]['configurable'] : FALSE; + return isset($this->definition['display'][$display_context]['configurable']) ? $this->definition['display'][$display_context]['configurable'] : FALSE; } /** diff --git a/core/lib/Drupal/Core/Field/FieldDefinitionInterface.php b/core/lib/Drupal/Core/Field/FieldDefinitionInterface.php index 07534bc..0a1201b 100644 --- a/core/lib/Drupal/Core/Field/FieldDefinitionInterface.php +++ b/core/lib/Drupal/Core/Field/FieldDefinitionInterface.php @@ -141,11 +141,28 @@ public function isConfigurable(); * The display context. Either 'view' or 'form'. * * @return bool - * TRUE if the display for this field is configurable. + * TRUE if the display for this field is configurable in the given context. */ public function isDisplayConfigurable($display_context); /** + * Returns the default display options for the field. + * + * If the field's display is configurable, the returned display options act + * as default values and may be overridden via the respective display. + * + * @param string $context + * The display context. Either 'view' or 'form'. + * + * @return array|null + * The array of display options for the field, or NULL if the field is not + * displayed. + * + * @see \Drupal\Core\Entity\Display\EntityDisplayInterface + */ + public function getDisplayOptions($display_context); + + /** * Determines whether the field is queryable via QueryInterface. * * @return bool diff --git a/core/modules/entity/lib/Drupal/entity/EntityDisplayBase.php b/core/modules/entity/lib/Drupal/entity/EntityDisplayBase.php index 2de253a..afc0e9c 100644 --- a/core/modules/entity/lib/Drupal/entity/EntityDisplayBase.php +++ b/core/modules/entity/lib/Drupal/entity/EntityDisplayBase.php @@ -213,22 +213,15 @@ protected function init() { $fields = $this->getFieldDefinitions(); foreach ($fields as $name => $definition) { if (!isset($this->content[$name]) && !isset($this->hidden[$name])) { - // Configurable fields: no defaults, the ones that are not listed are - // treated as hidden. - if ($definition->isConfigurable()) { + $options = $definition->getDisplayOptions($this->displayContext); + + if (!empty($options['type']) && $options['type'] == 'hidden') { $this->hidden[$name] = TRUE; } - // Base fields that specify display options: visible unless the 'type' - // is set to 'hidden'. - elseif ($definition instanceof FieldDefinition && $options = $definition->getDisplayOptions($this->displayContext)) { - if (!isset($options['type']) || $options['type'] != 'hidden') { - $this->content[$name] = $this->pluginManager->prepareConfiguration($definition->getType(), $options); - } - else { - $this->hidden[$name] = TRUE; - } + elseif ($options) { + $this->content[$name] = $this->pluginManager->prepareConfiguration($definition->getType(), $options); } - // Note: base fields that do not specify display options are not + // Note: (base) fields that do not specify display options are not // tracked in the display at all, in order to avoid cluttering the // configuration that gets saved back. } @@ -329,20 +322,13 @@ protected function getFieldDefinitions() { // https://drupal.org/node/2114707 $entity_manager = \Drupal::entityManager(); $entity_info = $entity_manager->getDefinition($this->targetEntityType); - $field_definitions = array(); + $this->fieldDefinitions = array(); if (is_subclass_of($entity_info['class'], '\Drupal\Core\Entity\ContentEntityInterface')) { $entity = _field_create_entity_from_ids((object) array('entity_type' => $this->targetEntityType, 'bundle' => $this->bundle, 'entity_id' => NULL)); foreach ($entity as $field_name => $items) { - $field_definitions[$field_name] = $items->getFieldDefinition(); + $this->fieldDefinitions[$field_name] = $items->getFieldDefinition(); } } - - $context = $this->displayContext; - $this->fieldDefinitions = array_filter($field_definitions, function(FieldDefinitionInterface $field_definition) use ($context) { - // Only act on configurable fields, and base fields if they specify - // display options. - return $field_definition->isConfigurable() || ($field_definition instanceof FieldDefinition && $field_definition->getDisplayOptions($context)); - }); } return $this->fieldDefinitions; diff --git a/core/modules/field/lib/Drupal/field/Entity/Field.php b/core/modules/field/lib/Drupal/field/Entity/Field.php index c9d9640..6481d8f 100644 --- a/core/modules/field/lib/Drupal/field/Entity/Field.php +++ b/core/modules/field/lib/Drupal/field/Entity/Field.php @@ -635,6 +635,14 @@ public function isDisplayConfigurable($context) { /** * {@inheritdoc} */ + public function getDisplayOptions($display_context) { + // Hide configurable fields by default. + return array('type' => 'hidden'); + } + + /** + * {@inheritdoc} + */ public function isQueryable() { return TRUE; } diff --git a/core/modules/field/lib/Drupal/field/Entity/FieldInstance.php b/core/modules/field/lib/Drupal/field/Entity/FieldInstance.php index 66d6a88..79fd0e9 100644 --- a/core/modules/field/lib/Drupal/field/Entity/FieldInstance.php +++ b/core/modules/field/lib/Drupal/field/Entity/FieldInstance.php @@ -593,6 +593,14 @@ public function isDisplayConfigurable($context) { /** * {@inheritdoc} */ + public function getDisplayOptions($display_context) { + // Hide configurable fields by default. + return array('type' => 'hidden'); + } + + /** + * {@inheritdoc} + */ public function isQueryable() { return TRUE; } diff --git a/core/modules/node/lib/Drupal/node/Entity/Node.php b/core/modules/node/lib/Drupal/node/Entity/Node.php index 1274fc8..c22dbed 100644 --- a/core/modules/node/lib/Drupal/node/Entity/Node.php +++ b/core/modules/node/lib/Drupal/node/Entity/Node.php @@ -393,7 +393,8 @@ public static function baseFieldDefinitions($entity_type) { ->setDisplayOptions('form', array( 'type' => 'text_textfield', 'weight' => -5, - ), TRUE); + )) + ->setDisplayConfigurable('form', TRUE); $fields['uid'] = FieldDefinition::create('entity_reference') ->setLabel(t('User ID'))