request, // provided by the editor plugin opening the dialog. $user_input = $form_state->getUserInput(); $input = isset($user_input['editor_object']) ? $user_input['editor_object'] : []; $form['#tree'] = TRUE; $form['#attached']['library'][] = 'editor/drupal.editor.dialog'; $form['#prefix'] = ''; // Everything under the "attributes" key is merged directly into the // generated link tag's attributes. $form['attributes']['href'] = [ '#title' => $this->t('URL'), '#type' => 'textfield', '#default_value' => isset($input['href']) ? $input['href'] : '', '#maxlength' => 2048, ]; $form['actions'] = [ '#type' => 'actions', ]; $form['actions']['save_modal'] = [ '#type' => 'submit', '#value' => $this->t('Save'), // No regular submit-handler. This form only works via JavaScript. '#submit' => [], '#ajax' => [ 'callback' => '::submitForm', 'event' => 'click', ], ]; return $form; } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { $response = new AjaxResponse(); if ($form_state->getErrors()) { unset($form['#prefix'], $form['#suffix']); $form['status_messages'] = [ '#type' => 'status_messages', '#weight' => -10, ]; $response->addCommand(new HtmlCommand('#editor-link-dialog-form', $form)); } else { $response->addCommand(new EditorDialogSave($form_state->getValues())); $response->addCommand(new CloseModalDialogCommand()); } return $response; } }