diff --git a/core/modules/entity/lib/Drupal/entity/EntityDisplayBase.php b/core/modules/entity/lib/Drupal/entity/EntityDisplayBase.php index c0f4356..54f1c7c 100644 --- a/core/modules/entity/lib/Drupal/entity/EntityDisplayBase.php +++ b/core/modules/entity/lib/Drupal/entity/EntityDisplayBase.php @@ -198,8 +198,10 @@ public function getExportProperties() { /** * Initializes the display. * - * This fills in default options for components that are not - * explicitly known as either "visible" or "hidden" in the display. + * This fills in default options for components: + * - that are not explicitly known as either "visible" or "hidden" in the + * display. + * - or that are not supposed to be configurable. */ protected function init() { // Fill in defaults for extra fields. @@ -221,7 +223,7 @@ protected function init() { // Fill in defaults for fields. $fields = $this->getFieldDefinitions(); foreach ($fields as $name => $definition) { - if (!isset($this->content[$name]) && !isset($this->hidden[$name])) { + if (!$definition->isDisplayConfigurable($this->displayContext) || (!isset($this->content[$name]) && !isset($this->hidden[$name]))) { $options = $definition->getDisplayOptions($this->displayContext); if (!empty($options['type']) && $options['type'] == 'hidden') { diff --git a/core/modules/entity/lib/Drupal/entity/Tests/EntityDisplayTest.php b/core/modules/entity/lib/Drupal/entity/Tests/EntityDisplayTest.php index 67b6a51..befce3a 100644 --- a/core/modules/entity/lib/Drupal/entity/Tests/EntityDisplayTest.php +++ b/core/modules/entity/lib/Drupal/entity/Tests/EntityDisplayTest.php @@ -14,7 +14,7 @@ */ class EntityDisplayTest extends DrupalUnitTestBase { - public static $modules = array('entity', 'field', 'entity_test', 'user'); + public static $modules = array('entity', 'field', 'entity_test', 'user', 'text'); public static function getInfo() { return array( @@ -159,19 +159,19 @@ public function testFieldComponent() { $display->setComponent($field_name); $field_type_info = \Drupal::service('plugin.manager.field.field_type')->getDefinition($field->type); $default_formatter = $field_type_info['default_formatter']; - $formatter_settings = \Drupal::service('plugin.manager.field.formatter')->getDefinition($default_formatter); + $formatter_settings = \Drupal::service('plugin.manager.field.formatter')->getDefaultSettings($default_formatter); $expected = array( 'weight' => 0, 'label' => 'above', 'type' => $default_formatter, - 'settings' => $formatter_settings['settings'], + 'settings' => $formatter_settings, ); $this->assertEqual($display->getComponent($field_name), $expected); // Check that the getFormatter() method returns the correct formatter plugin. $formatter = $display->getRenderer($field_name); $this->assertEqual($formatter->getPluginId(), $default_formatter); - $this->assertEqual($formatter->getSettings(), $formatter_settings['settings']); + $this->assertEqual($formatter->getSettings(), $formatter_settings); // Check that the formatter is statically persisted, by assigning an // arbitrary property and reading it back. @@ -201,6 +201,65 @@ public function testFieldComponent() { } /** + * Tests the behavior of a field component for a base field. + */ + public function testBaseFieldComponent() { + $display = entity_create('entity_display', array( + 'targetEntityType' => 'entity_test_base_field_display', + 'bundle' => 'entity_test_base_field_display', + 'mode' => 'default', + )); + + // Check that default options are correctly filled in. + $formatter_settings = \Drupal::service('plugin.manager.field.formatter')->getDefaultSettings('text_default'); + $expected = array( + 'test_no_display' => NULL, + 'test_display_configurable' => array( + 'label' => 'above', + 'type' => 'text_default', + 'settings' => $formatter_settings, + 'weight' => 10, + ), + 'test_display_non_configurable' => array( + 'label' => 'above', + 'type' => 'text_default', + 'settings' => $formatter_settings, + 'weight' => 11, + ), + ); + foreach ($expected as $field_name => $options) { + $this->assertEqual($display->getComponent($field_name), $options); + } + + // Check that saving the display only writes data for fields whose display + // is configurable. + $display->save(); + $config = \Drupal::config('entity.display.' . $display->id()); + $data = $config->get(); + $this->assertFalse(isset($data['content']['test_no_display'])); + $this->assertFalse(isset($data['hidden']['test_no_display'])); + $this->assertEqual($data['content']['test_display_configurable'], $expected['test_display_configurable']); + $this->assertFalse(isset($data['content']['test_display_non_configurable'])); + $this->assertFalse(isset($data['hidden']['test_display_non_configurable'])); + + // Check that defaults are correctly filled when loading the display. + $display = entity_load('entity_display', $display->id()); + foreach ($expected as $field_name => $options) { + $this->assertEqual($display->getComponent($field_name), $options); + } + + // Check that data manually written for fields whose display is not + // configurable are discarded when loading the display. + $data['content']['test_display_non_configurable'] = $expected['test_display_non_configurable']; + $data['content']['test_display_non_configurable']['weight']++; + $config->setData($data)->save(); + $display = entity_load('entity_display', $display->id()); + foreach ($expected as $field_name => $options) { + $this->assertEqual($display->getComponent($field_name), $options); + } + } + + /** * Tests renaming and deleting a bundle. */ public function testRenameDeleteBundle() { diff --git a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Entity/EntityTestBaseFieldDisplay.php b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Entity/EntityTestBaseFieldDisplay.php new file mode 100644 index 0000000..8f60bfa --- /dev/null +++ b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Entity/EntityTestBaseFieldDisplay.php @@ -0,0 +1,79 @@ +setLabel(t('Field with no display')); + + $fields['test_display_configurable'] = FieldDefinition::create('text') + ->setLabel(t('Field with configurable display')) + ->setDisplayOptions('view', array( + 'type' => 'text_default', + 'weight' => 10, + )) + ->setDisplayConfigurable('view', TRUE) + ->setDisplayOptions('form', array( + 'type' => 'text_textfield', + 'weight' => 10, + )) + ->setDisplayConfigurable('form', TRUE); + + $fields['test_display_non_configurable'] = FieldDefinition::create('text') + ->setLabel(t('Field with non-configurable display')) + ->setDisplayOptions('view', array( + 'type' => 'text_default', + 'weight' => 11, + )) + ->setDisplayOptions('form', array( + 'type' => 'text_textfield', + 'weight' => 11, + )); + + + return $fields; + } + +}