EditorImageDialog::buildForm

public EditorImageDialog::buildForm(array $form, FormStateInterface $form_state, Editor $editor = NULL)

Parameters

\Drupal\editor\Entity\Editor $editor: The text editor to which this dialog corresponds.

Overrides FormInterface::buildForm

File

core/modules/editor/src/Form/EditorImageDialog.php, line 60

Class

EditorImageDialog
Provides an image dialog for text editors.

Namespace

Drupal\editor\Form

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
public function buildForm(array $form, FormStateInterface $form_state, Editor $editor = NULL) {
  // This form is special, in that the default values do not come from the
  // server side, but from the client side, from a text editor. We must cache
  // this data in form state, because when the form is rebuilt, we will be
  // receiving values from the form, instead of the values from the text
  // editor. If we don't cache it, this data will be lost.
  if (isset($form_state->getUserInput()['editor_object'])) {
    // By convention, the data that the text editor sends to any dialog is in
    // the 'editor_object' key. And the image dialog for text editors expects
    // that data to be the attributes for an <img> element.
    $image_element = $form_state->getUserInput()['editor_object'];
    $form_state->set('image_element', $image_element);
    $form_state->setCached(TRUE);
  }
  else {
    // Retrieve the image element's attributes from form state.
    $image_element = $form_state->get('image_element') ? : [];
  }
 
  $form['#tree'] = TRUE;
  $form['#attached']['library'][] = 'editor/drupal.editor.dialog';
  $form['#prefix'] = '<div id="editor-image-dialog-form">';
  $form['#suffix'] = '</div>';
 
  // Construct strings to use in the upload validators.
  $image_upload = $editor->getImageUploadSettings();
  if (!empty($image_upload['max_dimensions']['width']) || !empty($image_upload['max_dimensions']['height'])) {
    $max_dimensions = $image_upload['max_dimensions']['width'] . 'x' . $image_upload['max_dimensions']['height'];
  }
  else {
    $max_dimensions = 0;
  }
  $max_filesize = min(Bytes::toInt($image_upload['max_size']), file_upload_max_size());
 
  $existing_file = isset($image_element['data-entity-uuid']) ? \Drupal::entityManager()->loadEntityByUuid('file', $image_element['data-entity-uuid']) : NULL;
  $fid = $existing_file ? $existing_file->id() : NULL;
 
  $form['fid'] = array(
    '#title' => $this->t('Image'),
    '#type' => 'managed_file',
    '#upload_location' => $image_upload['scheme'] . '://' . $image_upload['directory'],
    '#default_value' => $fid ? array($fid) : NULL,
    '#upload_validators' => array(
      'file_validate_extensions' => array('gif png jpg jpeg'),
      'file_validate_size' => array($max_filesize),
      'file_validate_image_resolution' => array($max_dimensions),
    ),
    '#required' => TRUE,
  );
 
  $form['attributes']['src'] = array(
    '#title' => $this->t('URL'),
    '#type' => 'textfield',
    '#default_value' => isset($image_element['src']) ? $image_element['src'] : '',
    '#maxlength' => 2048,
    '#required' => TRUE,
  );
 
  // If the editor has image uploads enabled, show a managed_file form item,
  // otherwise show a (file URL) text form item.
  if ($image_upload['status']) {
    $form['attributes']['src']['#access'] = FALSE;
    $form['attributes']['src']['#required'] = FALSE;
  }
  else {
    $form['fid']['#access'] = FALSE;
    $form['fid']['#required'] = FALSE;
  }
 
  // The alt attribute is *required*, but we allow users to opt-in to empty
  // alt attributes for the very rare edge cases where that is valid by
  // specifying two double quotes as the alternative text in the dialog.
  // However, that *is* stored as an empty alt attribute, so if we're editing
  // an existing image (which means the src attribute is set) and its alt
  // attribute is empty, then we show that as two double quotes in the dialog.
  $alt = isset($image_element['alt']) ? $image_element['alt'] : '';
  if ($alt === '' && !empty($image_element['src'])) {
    $alt = '""';
  }
  $form['attributes']['alt'] = array(
    '#title' => $this->t('Alternative text'),
    '#placeholder' => $this->t('Short description for the visually impaired'),
    '#type' => 'textfield',
    '#required' => TRUE,
    '#required_error' => $this->t('Alternative text is required.<br />(Only in rare cases should this be left empty. To create empty alternative text, enter <code>""</code> — two double quotes without any content).'),
    '#default_value' => $alt,
    '#maxlength' => 2048,
  );
 
  // When Drupal core's filter_align is being used, the text editor may
  // offer the ability to change the alignment.
  if (isset($image_element['data-align']) && $editor->getFilterFormat()->filters('filter_align')->status) {
    $form['align'] = array(
      '#title' => $this->t('Align'),
      '#type' => 'radios',
      '#options' => array(
        'none' => $this->t('None'),
        'left' => $this->t('Left'),
        'center' => $this->t('Center'),
        'right' => $this->t('Right'),
      ),
      '#default_value' => $image_element['data-align'] === '' ? 'none' : $image_element['data-align'],
      '#wrapper_attributes' => array('class' => array('container-inline')),
      '#attributes' => array('class' => array('container-inline')),
      '#parents' => array('attributes', 'data-align'),
    );
  }
 
  // When Drupal core's filter_caption is being used, the text editor may
  // offer the ability to in-place edit the image's caption: show a toggle.
  if (isset($image_element['hasCaption']) && $editor->getFilterFormat()->filters('filter_caption')->status) {
    $form['caption'] = array(
      '#title' => $this->t('Caption'),
      '#type' => 'checkbox',
      '#default_value' => $image_element['hasCaption'] === 'true',
      '#parents' => array('attributes', 'hasCaption'),
    );
  }
 
  $form['actions'] = array(
    '#type' => 'actions',
  );
  $form['actions']['save_modal'] = array(
    '#type' => 'submit',
    '#value' => $this->t('Save'),
    // No regular submit-handler. This form only works via JavaScript.
    '#submit' => array(),
    '#ajax' => array(
      'callback' => '::submitForm',
      'event' => 'click',
    ),
  );
 
  return $form;
}
doc_Drupal
2025-01-10 15:47:30
Comments
Leave a Comment

Please login to continue.