1<?php
2
3namespace Drupal\Tests\image\Kernel;
4
5use Drupal\field\Entity\FieldConfig;
6use Drupal\field\Entity\FieldStorageConfig;
7
8/**
9 * Provides a helper method for creating Image fields.
10 */
11trait ImageFieldCreationTrait {
12
13  /**
14   * Create a new image field.
15   *
16   * @param string $name
17   *   The name of the new field (all lowercase), exclude the "field_" prefix.
18   * @param string $type_name
19   *   The node type that this field will be added to.
20   * @param array $storage_settings
21   *   (optional) A list of field storage settings that will be added to the
22   *   defaults.
23   * @param array $field_settings
24   *   (optional) A list of instance settings that will be added to the instance
25   *   defaults.
26   * @param array $widget_settings
27   *   (optional) Widget settings to be added to the widget defaults.
28   * @param array $formatter_settings
29   *   (optional) Formatter settings to be added to the formatter defaults.
30   * @param string $description
31   *   (optional) A description for the field. Defaults to ''.
32   */
33  protected function createImageField($name, $type_name, $storage_settings = [], $field_settings = [], $widget_settings = [], $formatter_settings = [], $description = '') {
34    FieldStorageConfig::create([
35      'field_name' => $name,
36      'entity_type' => 'node',
37      'type' => 'image',
38      'settings' => $storage_settings,
39      'cardinality' => !empty($storage_settings['cardinality']) ? $storage_settings['cardinality'] : 1,
40    ])->save();
41
42    $field_config = FieldConfig::create([
43      'field_name' => $name,
44      'label' => $name,
45      'entity_type' => 'node',
46      'bundle' => $type_name,
47      'required' => !empty($field_settings['required']),
48      'settings' => $field_settings,
49      'description' => $description,
50    ]);
51    $field_config->save();
52
53    /** @var \Drupal\Core\Entity\EntityDisplayRepositoryInterface $display_repository */
54    $display_repository = \Drupal::service('entity_display.repository');
55    $display_repository->getFormDisplay('node', $type_name)
56      ->setComponent($name, [
57        'type' => 'image_image',
58        'settings' => $widget_settings,
59      ])
60      ->save();
61
62    $display_repository->getViewDisplay('node', $type_name)
63      ->setComponent($name, [
64        'type' => 'image',
65        'settings' => $formatter_settings,
66      ])
67      ->save();
68
69    return $field_config;
70  }
71
72}
73