Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 58
n/a
0 / 0
n/a
0 / 0
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
PatternPresetForm
0.00% covered (danger)
0.00%
0 / 58
n/a
0 / 0
n/a
0 / 0
0.00% covered (danger)
0.00%
0 / 3
72
0.00% covered (danger)
0.00%
0 / 1
 form
0.00% covered (danger)
0.00%
0 / 41
n/a
0 / 0
n/a
0 / 0
0.00% covered (danger)
0.00%
0 / 1
2
 save
0.00% covered (danger)
0.00%
0 / 11
n/a
0 / 0
n/a
0 / 0
0.00% covered (danger)
0.00%
0 / 1
20
 copyFormValuesToEntity
0.00% covered (danger)
0.00%
0 / 6
n/a
0 / 0
n/a
0 / 0
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3declare(strict_types=1);
4
5namespace Drupal\display_builder\Form;
6
7use Drupal\Component\Serialization\Exception\InvalidDataTypeException;
8use Drupal\Component\Serialization\Yaml;
9use Drupal\Core\Entity\EntityForm;
10use Drupal\Core\Entity\EntityInterface;
11use Drupal\Core\Form\FormStateInterface;
12use Drupal\display_builder\Entity\PatternPreset;
13
14/**
15 * Pattern preset form.
16 */
17final class PatternPresetForm extends EntityForm {
18
19  /**
20   * {@inheritdoc}
21   */
22  public function form(array $form, FormStateInterface $form_state): array {
23    $form = parent::form($form, $form_state);
24
25    /** @var \Drupal\Core\Config\Entity\ConfigEntityInterface $entity */
26    $entity = $this->entity;
27
28    $form['label'] = [
29      '#type' => 'textfield',
30      '#title' => $this->t('Label'),
31      '#maxlength' => 255,
32      '#default_value' => $entity->label(),
33      '#required' => TRUE,
34    ];
35
36    $form['id'] = [
37      '#type' => 'machine_name',
38      '#default_value' => $entity->id(),
39      '#machine_name' => [
40        'exists' => [PatternPreset::class, 'load'],
41      ],
42      '#disabled' => !$entity->isNew(),
43    ];
44
45    $form['description'] = [
46      '#type' => 'textarea',
47      '#title' => $this->t('Description'),
48      '#default_value' => $entity->get('description'),
49      '#rows' => 2,
50    ];
51
52    $form['group'] = [
53      '#type' => 'textfield',
54      '#title' => $this->t('Group'),
55      '#default_value' => $entity->get('group'),
56    ];
57
58    $form['sources'] = [
59      '#type' => 'textarea',
60      '#title' => $this->t('Sources'),
61      '#description' => $this->t('It is not recommended to manually edit a Pattern as an invalid format can lead to an error on all display.'),
62      '#default_value' => Yaml::encode($entity->get('sources') ?? []),
63      '#rows' => 16,
64    ];
65
66    $form['status'] = [
67      '#type' => 'checkbox',
68      '#title' => $this->t('Enabled'),
69      '#default_value' => $entity->status(),
70    ];
71
72    return $form;
73  }
74
75  /**
76   * {@inheritdoc}
77   */
78  public function save(array $form, FormStateInterface $form_state): int {
79    $result = parent::save($form, $form_state);
80    $message_args = ['%label' => $this->entity->label()];
81    $this->messenger()->addStatus(
82      match ($result) {
83        SAVED_NEW => $this->t('Created new preset %label.', $message_args),
84        SAVED_UPDATED => $this->t('Updated preset %label.', $message_args),
85        default => '',
86      }
87    );
88    $form_state->setRedirectUrl($this->entity->toUrl('collection'));
89
90    return $result;
91  }
92
93  /**
94   * {@inheritdoc}
95   */
96  protected function copyFormValuesToEntity(EntityInterface $entity, array $form, FormStateInterface $form_state): void {
97    $sources = $form_state->getValue('sources');
98
99    try {
100      $sources = \is_string($sources) ? Yaml::decode($sources) : $sources;
101    }
102    catch (InvalidDataTypeException $e) {
103      // We do it here instead of FormInterface::validateForm() because it is
104      // the earliest call of EntityInterface::set().
105      $form_state->setErrorByName('sources', $this->t('The import failed with the following message: %message', ['%message' => $e->getMessage()]));
106    }
107    $form_state->setValue('sources', $sources);
108
109    parent::copyFormValuesToEntity($entity, $form, $form_state);
110  }
111
112}