Puncte:2

Personalizat Trimitere apel invers se declanșează numai atunci când Formularul este Valabil când se află în Dialog

drapel cg

Î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?

Puncte:0
drapel ua

si putin din: https://www.drupal.org/project/drupal/issues/2934463#comment-13180158

Ați omis să adăugați această parte la modificarea dvs., ceea ce ar trebui să vă rezolve problema nedefinită cu adresa URL.

$form['actions']['submit']['#ajax']['url'] = \Drupal\Core\Url::fromRoute('node.add');
$form['actions']['submit']['#ajax']['options'] = [
  'interogare' => [
    Drupal\Core\Form\FormBuilderInterface::AJAX_FORM_REQUEST => TRUE,
  ],
];
Chris Happy avatar
drapel cg
Am încercat să adaug codul de mai jos `$form['actions']['submit']['#submit'][] = '_mymodule_close_dialog';`, dar apoi nu se mai salvează. Nu este codul de mai sus pentru deschiderea formularului `node.add` (și nu pentru salvarea formularului nodului)? Sau nu inteleg ceva?
Chris Happy avatar
drapel cg
Am adăugat o actualizare cu soluția ta. Din păcate, Drupal nu folosește elementul modificat cu tasta `#ajax`.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.