Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Tests\field\Kernel;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Core\Entity\Entity\EntityViewMode;
|
Chris@0
|
6 use Drupal\entity_test\Entity\EntityTest;
|
Chris@0
|
7 use Drupal\field\Entity\FieldConfig;
|
Chris@0
|
8 use Drupal\field\Entity\FieldStorageConfig;
|
Chris@0
|
9
|
Chris@0
|
10 /**
|
Chris@0
|
11 * Tests the field display API.
|
Chris@0
|
12 *
|
Chris@0
|
13 * @group field
|
Chris@0
|
14 */
|
Chris@0
|
15 class DisplayApiTest extends FieldKernelTestBase {
|
Chris@0
|
16
|
Chris@0
|
17 /**
|
Chris@0
|
18 * The field name to use in this test.
|
Chris@0
|
19 *
|
Chris@0
|
20 * @var string
|
Chris@0
|
21 */
|
Chris@0
|
22 protected $fieldName;
|
Chris@0
|
23
|
Chris@0
|
24 /**
|
Chris@0
|
25 * The field label to use in this test.
|
Chris@0
|
26 *
|
Chris@0
|
27 * @var string
|
Chris@0
|
28 */
|
Chris@0
|
29 protected $label;
|
Chris@0
|
30
|
Chris@0
|
31 /**
|
Chris@0
|
32 * The field cardinality to use in this test.
|
Chris@0
|
33 *
|
Chris@17
|
34 * @var int
|
Chris@0
|
35 */
|
Chris@0
|
36 protected $cardinality;
|
Chris@0
|
37
|
Chris@0
|
38 /**
|
Chris@0
|
39 * The field display options to use in this test.
|
Chris@0
|
40 *
|
Chris@0
|
41 * @var array
|
Chris@0
|
42 */
|
Chris@0
|
43 protected $displayOptions;
|
Chris@0
|
44
|
Chris@0
|
45 /**
|
Chris@0
|
46 * The test entity.
|
Chris@0
|
47 *
|
Chris@0
|
48 * @var \Drupal\Core\Entity\EntityInterface
|
Chris@0
|
49 */
|
Chris@0
|
50 protected $entity;
|
Chris@0
|
51
|
Chris@0
|
52 /**
|
Chris@0
|
53 * An array of random values, in the format expected for field values.
|
Chris@0
|
54 *
|
Chris@0
|
55 * @var array
|
Chris@0
|
56 */
|
Chris@0
|
57 protected $values;
|
Chris@0
|
58
|
Chris@0
|
59 /**
|
Chris@0
|
60 * {@inheritdoc}
|
Chris@0
|
61 */
|
Chris@0
|
62 public static $modules = ['system'];
|
Chris@0
|
63
|
Chris@0
|
64 protected function setUp() {
|
Chris@0
|
65 parent::setUp();
|
Chris@0
|
66
|
Chris@0
|
67 // Create a field and its storage.
|
Chris@0
|
68 $this->fieldName = 'test_field';
|
Chris@0
|
69 $this->label = $this->randomMachineName();
|
Chris@0
|
70 $this->cardinality = 4;
|
Chris@0
|
71
|
Chris@0
|
72 $field_storage = [
|
Chris@0
|
73 'field_name' => $this->fieldName,
|
Chris@0
|
74 'entity_type' => 'entity_test',
|
Chris@0
|
75 'type' => 'test_field',
|
Chris@0
|
76 'cardinality' => $this->cardinality,
|
Chris@0
|
77 ];
|
Chris@0
|
78 $field = [
|
Chris@0
|
79 'field_name' => $this->fieldName,
|
Chris@0
|
80 'entity_type' => 'entity_test',
|
Chris@0
|
81 'bundle' => 'entity_test',
|
Chris@0
|
82 'label' => $this->label,
|
Chris@0
|
83 ];
|
Chris@0
|
84
|
Chris@0
|
85 $this->displayOptions = [
|
Chris@0
|
86 'default' => [
|
Chris@0
|
87 'type' => 'field_test_default',
|
Chris@0
|
88 'settings' => [
|
Chris@0
|
89 'test_formatter_setting' => $this->randomMachineName(),
|
Chris@0
|
90 ],
|
Chris@0
|
91 ],
|
Chris@0
|
92 'teaser' => [
|
Chris@0
|
93 'type' => 'field_test_default',
|
Chris@0
|
94 'settings' => [
|
Chris@0
|
95 'test_formatter_setting' => $this->randomMachineName(),
|
Chris@0
|
96 ],
|
Chris@0
|
97 ],
|
Chris@0
|
98 ];
|
Chris@0
|
99
|
Chris@0
|
100 FieldStorageConfig::create($field_storage)->save();
|
Chris@0
|
101 FieldConfig::create($field)->save();
|
Chris@0
|
102 // Create a display for the default view mode.
|
Chris@0
|
103 entity_get_display($field['entity_type'], $field['bundle'], 'default')
|
Chris@0
|
104 ->setComponent($this->fieldName, $this->displayOptions['default'])
|
Chris@0
|
105 ->save();
|
Chris@0
|
106 // Create a display for the teaser view mode.
|
Chris@0
|
107 EntityViewMode::create(['id' => 'entity_test.teaser', 'targetEntityType' => 'entity_test'])->save();
|
Chris@0
|
108 entity_get_display($field['entity_type'], $field['bundle'], 'teaser')
|
Chris@0
|
109 ->setComponent($this->fieldName, $this->displayOptions['teaser'])
|
Chris@0
|
110 ->save();
|
Chris@0
|
111
|
Chris@0
|
112 // Create an entity with values.
|
Chris@0
|
113 $this->values = $this->_generateTestFieldValues($this->cardinality);
|
Chris@0
|
114 $this->entity = EntityTest::create();
|
Chris@0
|
115 $this->entity->{$this->fieldName}->setValue($this->values);
|
Chris@0
|
116 $this->entity->save();
|
Chris@0
|
117 }
|
Chris@0
|
118
|
Chris@0
|
119 /**
|
Chris@0
|
120 * Tests the FieldItemListInterface::view() method.
|
Chris@0
|
121 */
|
Chris@0
|
122 public function testFieldItemListView() {
|
Chris@0
|
123 $items = $this->entity->get($this->fieldName);
|
Chris@0
|
124
|
Chris@0
|
125 \Drupal::service('theme_handler')->install(['classy']);
|
Chris@0
|
126 $this->config('system.theme')->set('default', 'classy')->save();
|
Chris@0
|
127
|
Chris@0
|
128 // No display settings: check that default display settings are used.
|
Chris@0
|
129 $build = $items->view();
|
Chris@0
|
130 $this->render($build);
|
Chris@0
|
131 $settings = \Drupal::service('plugin.manager.field.formatter')->getDefaultSettings('field_test_default');
|
Chris@0
|
132 $setting = $settings['test_formatter_setting'];
|
Chris@0
|
133 $this->assertText($this->label, 'Label was displayed.');
|
Chris@0
|
134 foreach ($this->values as $delta => $value) {
|
Chris@0
|
135 $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta]));
|
Chris@0
|
136 }
|
Chris@0
|
137
|
Chris@0
|
138 // Display settings: Check hidden field.
|
Chris@0
|
139 $display = [
|
Chris@0
|
140 'label' => 'hidden',
|
Chris@0
|
141 'type' => 'field_test_multiple',
|
Chris@0
|
142 'settings' => [
|
Chris@0
|
143 'test_formatter_setting_multiple' => $this->randomMachineName(),
|
Chris@0
|
144 'alter' => TRUE,
|
Chris@0
|
145 ],
|
Chris@0
|
146 ];
|
Chris@0
|
147 $build = $items->view($display);
|
Chris@0
|
148 $this->render($build);
|
Chris@0
|
149 $setting = $display['settings']['test_formatter_setting_multiple'];
|
Chris@0
|
150 $this->assertNoText($this->label, 'Label was not displayed.');
|
Chris@0
|
151 $this->assertText('field_test_entity_display_build_alter', 'Alter fired, display passed.');
|
Chris@0
|
152 $this->assertText('entity language is en', 'Language is placed onto the context.');
|
Chris@0
|
153 $array = [];
|
Chris@0
|
154 foreach ($this->values as $delta => $value) {
|
Chris@0
|
155 $array[] = $delta . ':' . $value['value'];
|
Chris@0
|
156 }
|
Chris@0
|
157 $this->assertText($setting . '|' . implode('|', $array), 'Values were displayed with expected setting.');
|
Chris@0
|
158
|
Chris@0
|
159 // Display settings: Check visually_hidden field.
|
Chris@0
|
160 $display = [
|
Chris@0
|
161 'label' => 'visually_hidden',
|
Chris@0
|
162 'type' => 'field_test_multiple',
|
Chris@0
|
163 'settings' => [
|
Chris@0
|
164 'test_formatter_setting_multiple' => $this->randomMachineName(),
|
Chris@0
|
165 'alter' => TRUE,
|
Chris@0
|
166 ],
|
Chris@0
|
167 ];
|
Chris@0
|
168 $build = $items->view($display);
|
Chris@0
|
169 $this->render($build);
|
Chris@0
|
170 $setting = $display['settings']['test_formatter_setting_multiple'];
|
Chris@0
|
171 $this->assertRaw('visually-hidden', 'Label was visually hidden.');
|
Chris@0
|
172 $this->assertText('field_test_entity_display_build_alter', 'Alter fired, display passed.');
|
Chris@0
|
173 $this->assertText('entity language is en', 'Language is placed onto the context.');
|
Chris@0
|
174 $array = [];
|
Chris@0
|
175 foreach ($this->values as $delta => $value) {
|
Chris@0
|
176 $array[] = $delta . ':' . $value['value'];
|
Chris@0
|
177 }
|
Chris@0
|
178 $this->assertText($setting . '|' . implode('|', $array), 'Values were displayed with expected setting.');
|
Chris@0
|
179
|
Chris@0
|
180 // Check the prepare_view steps are invoked.
|
Chris@0
|
181 $display = [
|
Chris@0
|
182 'label' => 'hidden',
|
Chris@0
|
183 'type' => 'field_test_with_prepare_view',
|
Chris@0
|
184 'settings' => [
|
Chris@0
|
185 'test_formatter_setting_additional' => $this->randomMachineName(),
|
Chris@0
|
186 ],
|
Chris@0
|
187 ];
|
Chris@0
|
188 $build = $items->view($display);
|
Chris@0
|
189 $this->render($build);
|
Chris@0
|
190 $setting = $display['settings']['test_formatter_setting_additional'];
|
Chris@0
|
191 $this->assertNoText($this->label, 'Label was not displayed.');
|
Chris@0
|
192 $this->assertNoText('field_test_entity_display_build_alter', 'Alter not fired.');
|
Chris@0
|
193 foreach ($this->values as $delta => $value) {
|
Chris@0
|
194 $this->assertText($setting . '|' . $value['value'] . '|' . ($value['value'] + 1), format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta]));
|
Chris@0
|
195 }
|
Chris@0
|
196
|
Chris@0
|
197 // View mode: check that display settings specified in the display object
|
Chris@0
|
198 // are used.
|
Chris@0
|
199 $build = $items->view('teaser');
|
Chris@0
|
200 $this->render($build);
|
Chris@0
|
201 $setting = $this->displayOptions['teaser']['settings']['test_formatter_setting'];
|
Chris@0
|
202 $this->assertText($this->label, 'Label was displayed.');
|
Chris@0
|
203 foreach ($this->values as $delta => $value) {
|
Chris@0
|
204 $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta]));
|
Chris@0
|
205 }
|
Chris@0
|
206
|
Chris@0
|
207 // Unknown view mode: check that display settings for 'default' view mode
|
Chris@0
|
208 // are used.
|
Chris@0
|
209 $build = $items->view('unknown_view_mode');
|
Chris@0
|
210 $this->render($build);
|
Chris@0
|
211 $setting = $this->displayOptions['default']['settings']['test_formatter_setting'];
|
Chris@0
|
212 $this->assertText($this->label, 'Label was displayed.');
|
Chris@0
|
213 foreach ($this->values as $delta => $value) {
|
Chris@0
|
214 $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta]));
|
Chris@0
|
215 }
|
Chris@0
|
216 }
|
Chris@0
|
217
|
Chris@0
|
218 /**
|
Chris@0
|
219 * Tests the FieldItemInterface::view() method.
|
Chris@0
|
220 */
|
Chris@0
|
221 public function testFieldItemView() {
|
Chris@0
|
222 // No display settings: check that default display settings are used.
|
Chris@0
|
223 $settings = \Drupal::service('plugin.manager.field.formatter')->getDefaultSettings('field_test_default');
|
Chris@0
|
224 $setting = $settings['test_formatter_setting'];
|
Chris@0
|
225 foreach ($this->values as $delta => $value) {
|
Chris@0
|
226 $item = $this->entity->{$this->fieldName}[$delta];
|
Chris@0
|
227 $build = $item->view();
|
Chris@0
|
228 $this->render($build);
|
Chris@0
|
229 $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta]));
|
Chris@0
|
230 }
|
Chris@0
|
231
|
Chris@0
|
232 // Check that explicit display settings are used.
|
Chris@0
|
233 $display = [
|
Chris@0
|
234 'type' => 'field_test_multiple',
|
Chris@0
|
235 'settings' => [
|
Chris@0
|
236 'test_formatter_setting_multiple' => $this->randomMachineName(),
|
Chris@0
|
237 ],
|
Chris@0
|
238 ];
|
Chris@0
|
239 $setting = $display['settings']['test_formatter_setting_multiple'];
|
Chris@0
|
240 foreach ($this->values as $delta => $value) {
|
Chris@0
|
241 $item = $this->entity->{$this->fieldName}[$delta];
|
Chris@0
|
242 $build = $item->view($display);
|
Chris@0
|
243 $this->render($build);
|
Chris@0
|
244 $this->assertText($setting . '|0:' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta]));
|
Chris@0
|
245 }
|
Chris@0
|
246
|
Chris@0
|
247 // Check that prepare_view steps are invoked.
|
Chris@0
|
248 $display = [
|
Chris@0
|
249 'type' => 'field_test_with_prepare_view',
|
Chris@0
|
250 'settings' => [
|
Chris@0
|
251 'test_formatter_setting_additional' => $this->randomMachineName(),
|
Chris@0
|
252 ],
|
Chris@0
|
253 ];
|
Chris@0
|
254 $setting = $display['settings']['test_formatter_setting_additional'];
|
Chris@0
|
255 foreach ($this->values as $delta => $value) {
|
Chris@0
|
256 $item = $this->entity->{$this->fieldName}[$delta];
|
Chris@0
|
257 $build = $item->view($display);
|
Chris@0
|
258 $this->render($build);
|
Chris@0
|
259 $this->assertText($setting . '|' . $value['value'] . '|' . ($value['value'] + 1), format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta]));
|
Chris@0
|
260 }
|
Chris@0
|
261
|
Chris@0
|
262 // View mode: check that display settings specified in the field are used.
|
Chris@0
|
263 $setting = $this->displayOptions['teaser']['settings']['test_formatter_setting'];
|
Chris@0
|
264 foreach ($this->values as $delta => $value) {
|
Chris@0
|
265 $item = $this->entity->{$this->fieldName}[$delta];
|
Chris@0
|
266 $build = $item->view('teaser');
|
Chris@0
|
267 $this->render($build);
|
Chris@0
|
268 $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta]));
|
Chris@0
|
269 }
|
Chris@0
|
270
|
Chris@0
|
271 // Unknown view mode: check that display settings for 'default' view mode
|
Chris@0
|
272 // are used.
|
Chris@0
|
273 $setting = $this->displayOptions['default']['settings']['test_formatter_setting'];
|
Chris@0
|
274 foreach ($this->values as $delta => $value) {
|
Chris@0
|
275 $item = $this->entity->{$this->fieldName}[$delta];
|
Chris@0
|
276 $build = $item->view('unknown_view_mode');
|
Chris@0
|
277 $this->render($build);
|
Chris@0
|
278 $this->assertText($setting . '|' . $value['value'], format_string('Value @delta was displayed with expected setting.', ['@delta' => $delta]));
|
Chris@0
|
279 }
|
Chris@0
|
280 }
|
Chris@0
|
281
|
Chris@0
|
282 /**
|
Chris@0
|
283 * Tests that the prepareView() formatter method still fires for empty values.
|
Chris@0
|
284 */
|
Chris@0
|
285 public function testFieldEmpty() {
|
Chris@0
|
286 // Uses \Drupal\field_test\Plugin\Field\FieldFormatter\TestFieldEmptyFormatter.
|
Chris@0
|
287 $display = [
|
Chris@0
|
288 'label' => 'hidden',
|
Chris@0
|
289 'type' => 'field_empty_test',
|
Chris@0
|
290 'settings' => [
|
Chris@0
|
291 'test_empty_string' => '**EMPTY FIELD**' . $this->randomMachineName(),
|
Chris@0
|
292 ],
|
Chris@0
|
293 ];
|
Chris@0
|
294 // $this->entity is set by the setUp() method and by default contains 4
|
Chris@0
|
295 // numeric values. We only want to test the display of this one field.
|
Chris@0
|
296 $build = $this->entity->get($this->fieldName)->view($display);
|
Chris@0
|
297 $this->render($build);
|
Chris@0
|
298 // The test field by default contains values, so should not display the
|
Chris@0
|
299 // default "empty" text.
|
Chris@0
|
300 $this->assertNoText($display['settings']['test_empty_string']);
|
Chris@0
|
301
|
Chris@0
|
302 // Now remove the values from the test field and retest.
|
Chris@0
|
303 $this->entity->{$this->fieldName} = [];
|
Chris@0
|
304 $this->entity->save();
|
Chris@0
|
305 $build = $this->entity->get($this->fieldName)->view($display);
|
Chris@0
|
306 $this->render($build);
|
Chris@0
|
307 // This time, as the field values have been removed, we *should* show the
|
Chris@0
|
308 // default "empty" text.
|
Chris@0
|
309 $this->assertText($display['settings']['test_empty_string']);
|
Chris@0
|
310 }
|
Chris@0
|
311
|
Chris@0
|
312 }
|