Încerc să creez un nod într-un dialog cu următorul link:
Introduceți titlul unui formular de înregistrare sau <a class="use-ajax"
data-dialog-options="{"width":800}"
data-dialog-type="modal"
href="/node/add/mycontenttype?enableAjaxSubmit=true">
creați un nou formular de înregistrare.
</a>
Reapelarea _mymodule_close_dialog()
rulează perfect atunci când nu există erori de validare. Dar când există o eroare (de exemplu, titlul este gol), JS pur și simplu scoate o eroare Eroare de tip neprins: acest.url este nedefinit
.
Pot scăpa de eroarea JS prin împiedicând acțiunile din formular să devină butoane model, dar apoi forma eșuează în tăcere.
Cum pot afișa mesajele de eroare ale unui formular când creez un nod într-un dialog?
Reapelarea:
/**
* Implementează hook_form_BASE_FORM_ID_alter() pentru \Drupal\node\NodeForm.
*/
funcția mymodule_form_node_mycontenttype_form_alter(&$form, FormStateInterface $form_state) {
$enableAjaxSubmit = \Drupal::request()->query->get('enableAjaxSubmit');
if (!empty($enableAjaxSubmit) && $enableAjaxSubmit === „adevărat”) {
$form['#attached']['library'][] = 'core/drupal.dialog.ajax';
$form['#attached']['library'][] = 'core/jquery.form';
$form['actions']['submit']['#attributes']['class'][] = 'use-ajax-submit';
$form['actions']['submit']['#submit'][] = '_mymodule_close_dialog';
}
}
utilizați Drupal\Core\Ajax\AjaxResponse;
utilizați Drupal\Core\Ajax\CloseModalDialogCommand;
utilizați Drupal\Core\Ajax\PrependCommand;
utilizați Drupal\Core\Ajax\AlertCommand;
funcția _mymodule_close_dialog(matrice &$form, FormStateInterface $form_state) {
$răspuns = AjaxResponse nou();
// dacă (!$form_state->getErrors()) {
$response->addCommand(new CloseModalDialogCommand());
// }
$messages = ['#type' => 'mesaje_de stare'];
$response->addCommand(new PrependCommand('.some-wrapper', $mesaje));
$form_state->setResponse($răspuns);
}
Am urmărit:
Actualizați
Schimbat:
$form['actions']['submit']['#submit'][] = '_mymodule_close_dialog';
La:
$form['actions']['submit']['#ajax']['callback'] = '_mymodule_close_dialog'; // Redenumiți funcția pentru a elimina `_`
$form['actions']['submit']['#ajax']['url'] = \Drupal\Core\Url::fromRoute('node.add', ['node_type' => $contentType]) ;
$form['actions']['submit']['#ajax']['options'] = [
'interogare' => [
\Drupal\Core\Form\FormBuilderInterface::AJAX_FORM_REQUEST => TRUE,
],
];
Dar obțineți o eroare PHP:
Symfony\Component\HttpKernel\Exception\HttpException: apelul #ajax specificat este gol sau nu poate fi apelat. în Drupal\Core\Form\FormAjaxResponseBuilder->buildResponse()
Cand eu depanare ($triggering_element)
în FormAjaxResponseBuilder
fişier, elementul de trimitere nu avea un #ajax
cheia sau folosește-ajax-submit
clasă. Astfel, elementul declanșator nu este modificat în cele din urmă.
Vreo idee?