Chris@0: fieldName = 'test_field'; Chris@0: $this->label = $this->randomMachineName(); Chris@0: $this->cardinality = 4; Chris@0: Chris@0: $field_storage = [ Chris@0: 'field_name' => $this->fieldName, Chris@0: 'entity_type' => 'entity_test', Chris@0: 'type' => 'test_field', Chris@0: 'cardinality' => $this->cardinality, Chris@0: ]; Chris@0: $field = [ Chris@0: 'field_name' => $this->fieldName, Chris@0: 'entity_type' => 'entity_test', Chris@0: 'bundle' => 'entity_test', Chris@0: 'label' => $this->label, Chris@0: ]; Chris@0: Chris@0: $this->displayOptions = [ Chris@0: 'default' => [ Chris@0: 'type' => 'field_test_default', Chris@0: 'settings' => [ Chris@0: 'test_formatter_setting' => $this->randomMachineName(), Chris@0: ], Chris@0: ], Chris@0: 'teaser' => [ Chris@0: 'type' => 'field_test_default', Chris@0: 'settings' => [ Chris@0: 'test_formatter_setting' => $this->randomMachineName(), Chris@0: ], Chris@0: ], Chris@0: ]; Chris@0: Chris@0: FieldStorageConfig::create($field_storage)->save(); Chris@0: FieldConfig::create($field)->save(); Chris@0: // Create a display for the default view mode. Chris@0: entity_get_display($field['entity_type'], $field['bundle'], 'default') Chris@0: ->setComponent($this->fieldName, $this->displayOptions['default']) Chris@0: ->save(); Chris@0: // Create a display for the teaser view mode. Chris@0: EntityViewMode::create(['id' => 'entity_test.teaser', 'targetEntityType' => 'entity_test'])->save(); Chris@0: entity_get_display($field['entity_type'], $field['bundle'], 'teaser') Chris@0: ->setComponent($this->fieldName, $this->displayOptions['teaser']) Chris@0: ->save(); Chris@0: Chris@0: // Create an entity with values. Chris@0: $this->values = $this->_generateTestFieldValues($this->cardinality); Chris@0: $this->entity = EntityTest::create(); Chris@0: $this->entity->{$this->fieldName}->setValue($this->values); Chris@0: $this->entity->save(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the FieldItemListInterface::view() method. Chris@0: */ Chris@0: public function testFieldItemListView() { Chris@0: $items = $this->entity->get($this->fieldName); Chris@0: Chris@0: \Drupal::service('theme_handler')->install(['classy']); Chris@0: $this->config('system.theme')->set('default', 'classy')->save(); Chris@0: Chris@0: // No display settings: check that default display settings are used. Chris@0: $build = $items->view(); Chris@0: $this->render($build); Chris@0: $settings = \Drupal::service('plugin.manager.field.formatter')->getDefaultSettings('field_test_default'); Chris@0: $setting = $settings['test_formatter_setting']; Chris@0: $this->assertText($this->label, 'Label was displayed.'); Chris@0: foreach ($this->values as $delta => $value) { Chris@0: $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta])); Chris@0: } Chris@0: Chris@0: // Display settings: Check hidden field. Chris@0: $display = [ Chris@0: 'label' => 'hidden', Chris@0: 'type' => 'field_test_multiple', Chris@0: 'settings' => [ Chris@0: 'test_formatter_setting_multiple' => $this->randomMachineName(), Chris@0: 'alter' => TRUE, Chris@0: ], Chris@0: ]; Chris@0: $build = $items->view($display); Chris@0: $this->render($build); Chris@0: $setting = $display['settings']['test_formatter_setting_multiple']; Chris@0: $this->assertNoText($this->label, 'Label was not displayed.'); Chris@0: $this->assertText('field_test_entity_display_build_alter', 'Alter fired, display passed.'); Chris@0: $this->assertText('entity language is en', 'Language is placed onto the context.'); Chris@0: $array = []; Chris@0: foreach ($this->values as $delta => $value) { Chris@0: $array[] = $delta . ':' . $value['value']; Chris@0: } Chris@0: $this->assertText($setting . '|' . implode('|', $array), 'Values were displayed with expected setting.'); Chris@0: Chris@0: // Display settings: Check visually_hidden field. Chris@0: $display = [ Chris@0: 'label' => 'visually_hidden', Chris@0: 'type' => 'field_test_multiple', Chris@0: 'settings' => [ Chris@0: 'test_formatter_setting_multiple' => $this->randomMachineName(), Chris@0: 'alter' => TRUE, Chris@0: ], Chris@0: ]; Chris@0: $build = $items->view($display); Chris@0: $this->render($build); Chris@0: $setting = $display['settings']['test_formatter_setting_multiple']; Chris@0: $this->assertRaw('visually-hidden', 'Label was visually hidden.'); Chris@0: $this->assertText('field_test_entity_display_build_alter', 'Alter fired, display passed.'); Chris@0: $this->assertText('entity language is en', 'Language is placed onto the context.'); Chris@0: $array = []; Chris@0: foreach ($this->values as $delta => $value) { Chris@0: $array[] = $delta . ':' . $value['value']; Chris@0: } Chris@0: $this->assertText($setting . '|' . implode('|', $array), 'Values were displayed with expected setting.'); Chris@0: Chris@0: // Check the prepare_view steps are invoked. Chris@0: $display = [ Chris@0: 'label' => 'hidden', Chris@0: 'type' => 'field_test_with_prepare_view', Chris@0: 'settings' => [ Chris@0: 'test_formatter_setting_additional' => $this->randomMachineName(), Chris@0: ], Chris@0: ]; Chris@0: $build = $items->view($display); Chris@0: $this->render($build); Chris@0: $setting = $display['settings']['test_formatter_setting_additional']; Chris@0: $this->assertNoText($this->label, 'Label was not displayed.'); Chris@0: $this->assertNoText('field_test_entity_display_build_alter', 'Alter not fired.'); Chris@0: foreach ($this->values as $delta => $value) { Chris@0: $this->assertText($setting . '|' . $value['value'] . '|' . ($value['value'] + 1), format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta])); Chris@0: } Chris@0: Chris@0: // View mode: check that display settings specified in the display object Chris@0: // are used. Chris@0: $build = $items->view('teaser'); Chris@0: $this->render($build); Chris@0: $setting = $this->displayOptions['teaser']['settings']['test_formatter_setting']; Chris@0: $this->assertText($this->label, 'Label was displayed.'); Chris@0: foreach ($this->values as $delta => $value) { Chris@0: $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta])); Chris@0: } Chris@0: Chris@0: // Unknown view mode: check that display settings for 'default' view mode Chris@0: // are used. Chris@0: $build = $items->view('unknown_view_mode'); Chris@0: $this->render($build); Chris@0: $setting = $this->displayOptions['default']['settings']['test_formatter_setting']; Chris@0: $this->assertText($this->label, 'Label was displayed.'); Chris@0: foreach ($this->values as $delta => $value) { Chris@0: $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta])); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests the FieldItemInterface::view() method. Chris@0: */ Chris@0: public function testFieldItemView() { Chris@0: // No display settings: check that default display settings are used. Chris@0: $settings = \Drupal::service('plugin.manager.field.formatter')->getDefaultSettings('field_test_default'); Chris@0: $setting = $settings['test_formatter_setting']; Chris@0: foreach ($this->values as $delta => $value) { Chris@0: $item = $this->entity->{$this->fieldName}[$delta]; Chris@0: $build = $item->view(); Chris@0: $this->render($build); Chris@0: $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta])); Chris@0: } Chris@0: Chris@0: // Check that explicit display settings are used. Chris@0: $display = [ Chris@0: 'type' => 'field_test_multiple', Chris@0: 'settings' => [ Chris@0: 'test_formatter_setting_multiple' => $this->randomMachineName(), Chris@0: ], Chris@0: ]; Chris@0: $setting = $display['settings']['test_formatter_setting_multiple']; Chris@0: foreach ($this->values as $delta => $value) { Chris@0: $item = $this->entity->{$this->fieldName}[$delta]; Chris@0: $build = $item->view($display); Chris@0: $this->render($build); Chris@0: $this->assertText($setting . '|0:' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta])); Chris@0: } Chris@0: Chris@0: // Check that prepare_view steps are invoked. Chris@0: $display = [ Chris@0: 'type' => 'field_test_with_prepare_view', Chris@0: 'settings' => [ Chris@0: 'test_formatter_setting_additional' => $this->randomMachineName(), Chris@0: ], Chris@0: ]; Chris@0: $setting = $display['settings']['test_formatter_setting_additional']; Chris@0: foreach ($this->values as $delta => $value) { Chris@0: $item = $this->entity->{$this->fieldName}[$delta]; Chris@0: $build = $item->view($display); Chris@0: $this->render($build); Chris@0: $this->assertText($setting . '|' . $value['value'] . '|' . ($value['value'] + 1), format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta])); Chris@0: } Chris@0: Chris@0: // View mode: check that display settings specified in the field are used. Chris@0: $setting = $this->displayOptions['teaser']['settings']['test_formatter_setting']; Chris@0: foreach ($this->values as $delta => $value) { Chris@0: $item = $this->entity->{$this->fieldName}[$delta]; Chris@0: $build = $item->view('teaser'); Chris@0: $this->render($build); Chris@0: $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta])); Chris@0: } Chris@0: Chris@0: // Unknown view mode: check that display settings for 'default' view mode Chris@0: // are used. Chris@0: $setting = $this->displayOptions['default']['settings']['test_formatter_setting']; Chris@0: foreach ($this->values as $delta => $value) { Chris@0: $item = $this->entity->{$this->fieldName}[$delta]; Chris@0: $build = $item->view('unknown_view_mode'); Chris@0: $this->render($build); Chris@0: $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta])); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests that the prepareView() formatter method still fires for empty values. Chris@0: */ Chris@0: public function testFieldEmpty() { Chris@0: // Uses \Drupal\field_test\Plugin\Field\FieldFormatter\TestFieldEmptyFormatter. Chris@0: $display = [ Chris@0: 'label' => 'hidden', Chris@0: 'type' => 'field_empty_test', Chris@0: 'settings' => [ Chris@0: 'test_empty_string' => '**EMPTY FIELD**' . $this->randomMachineName(), Chris@0: ], Chris@0: ]; Chris@0: // $this->entity is set by the setUp() method and by default contains 4 Chris@0: // numeric values. We only want to test the display of this one field. Chris@0: $build = $this->entity->get($this->fieldName)->view($display); Chris@0: $this->render($build); Chris@0: // The test field by default contains values, so should not display the Chris@0: // default "empty" text. Chris@0: $this->assertNoText($display['settings']['test_empty_string']); Chris@0: Chris@0: // Now remove the values from the test field and retest. Chris@0: $this->entity->{$this->fieldName} = []; Chris@0: $this->entity->save(); Chris@0: $build = $this->entity->get($this->fieldName)->view($display); Chris@0: $this->render($build); Chris@0: // This time, as the field values have been removed, we *should* show the Chris@0: // default "empty" text. Chris@0: $this->assertText($display['settings']['test_empty_string']); Chris@0: } Chris@0: Chris@0: }