You are here

public function GeysirModalParagraphForm::ajaxSave in Geysir 8

File

src/Form/GeysirModalParagraphForm.php, line 61

Class

GeysirModalParagraphForm
Functionality to edit a paragraph through a modal.

Namespace

Drupal\geysir\Form

Code

public function ajaxSave(array $form, FormStateInterface $form_state) {
  $response = new AjaxResponse();

  // When errors occur during form validation, show them to the user.
  if ($form_state
    ->getErrors()) {
    unset($form['#prefix']);
    unset($form['#suffix']);
    $form['status_messages'] = [
      '#type' => 'status_messages',
      '#weight' => -10,
    ];
    $response
      ->addCommand(new HtmlCommand('#geysir-modal-form', $form));
  }
  else {

    // Get all necessary data to be able to correctly update the correct
    // field on the parent node.
    $route_match = $this
      ->getRouteMatch();
    $parent_entity_type = $route_match
      ->getParameter('parent_entity_type');
    $temporary_data = $form_state
      ->getTemporary();
    $parent_entity_revision = isset($temporary_data['parent_entity_revision']) ? $temporary_data['parent_entity_revision'] : $route_match
      ->getParameter('parent_entity_revision');
    $field_name = $route_match
      ->getParameter('field');
    $field_wrapper_id = $route_match
      ->getParameter('field_wrapper_id');

    // Get the parent revision if available, otherwise the parent.
    $parent_entity_revision = $this
      ->getParentRevisionOrParent($parent_entity_type, $parent_entity_revision);

    // Refresh the paragraphs field.
    $response
      ->addCommand(new ReplaceCommand('[data-geysir-field-paragraph-field-wrapper=' . $field_wrapper_id . ']', $parent_entity_revision
      ->get($field_name)
      ->view('default')));

    // Add change event after refreshing.
    $response
      ->addCommand(new InvokeCommand('[data-geysir-field-paragraph-field-wrapper=' . $field_wrapper_id . ']', 'change'));
    $response
      ->addCommand(new GeysirCloseModalDialogCommand());
    $response
      ->addCommand(new GeysirReattachBehaviors());
  }
  return $response;
}