Score:0

How to define where to display form_state->setError when using multiple ajax callbacks?

cn flag

I am working on some custom functionality inside of a views table view that enables a 'quick edit' form as an available field via views field plugin.

The form is rendered to each row separately using a unique sub_id passed to the form builder for each row.

I have the form working, and it does the submit stuff correctly, but the problem is I need to do two things on ajax callback, so I am using the AjaxResponse() system to do two different actions.

The first action is updating the 'value' of a specific column in the views row. The second is essentially just doing return $form; to return the form.

The problem is, when the form does validation the validation works, except the messages do not show up until I refresh the page. I can't figure out how to tell it which wrapper to use to display the form message, as I am passing two different ones to the ajax response since I need to do two changes.

The code I am using inside of my ajax callback is this:

public function quickEditAjax(&$form, FormStateInterface $form_state) {
    $values = $form_state->getValues();

    $response = new AjaxResponse();

    $status = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->load($values['status']);
    $response->addCommand(new ReplaceCommand('.request-status-'. $values['id'],$status->getName()));
    $response->addCommand(new ReplaceCommand('#quick-edit-wrapper-'. $this->sub_id,$form));

    return $response;
  }

In where #quick-edit-wrapper-$this->sub_id is the unique #id set on the form, and .request-status-$values['id'] is the class attached to the table view column I am trying to change.

Both the form and the table column have the correct id and class on them, and the column updates successfully via the ajax addCommand() callback.

The validation error messages do not show up in either wrapper, but I would like it to show up in the #quick-edit-wrapper wrapper. If there are no validation errors and the submit goes through, I also pass a success message and that message doesn't show up either until I refresh the page.

Is there a way I can specifically tell the messages what wrapper to render in? The ajax response seems to be getting confused with which one to use.

Score:1
cn flag

Add a status messages block to the form:

if ($form_state->hasAnyErrors()) {
  $form['status_messages'] = [
    '#type' => 'status_messages',
    '#weight' => -1000,
  ];
  $form['#sorted'] = FALSE;
}
$response->addCommand(new ReplaceCommand('#quick-edit-wrapper-' . $this->sub_id, $form));
Ex0r avatar
cn flag
Worked perfectly! Thank you.
mangohost

Post an answer

Most people don’t grasp that asking a lot of questions unlocks learning and improves interpersonal bonding. In Alison’s studies, for example, though people could accurately recall how many questions had been asked in their conversations, they didn’t intuit the link between questions and liking. Across four studies, in which participants were engaged in conversations themselves or read transcripts of others’ conversations, people tended not to realize that question asking would influence—or had influenced—the level of amity between the conversationalists.