0

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.

1 Answer 1

1

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));
1
  • Worked perfectly! Thank you.
    – Ex0r
    Commented Feb 16, 2022 at 14:24

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.