Comment implémentez-vous un gestionnaire de soumission personnalisé dans hook_form_alter ()?

16

J'ai mis à jour l'un de mes modules Drupal 7 en 8 et j'ai un problème avec mon formulaire. J'ajoute une fonction de validation et un gestionnaire de soumission. La fonction de validation est appelée très bien, mais la fonction de soumission ne se déclenche pas. Je me demande si cela signifie qu'il existe une approche de style Symfony qui doit être adoptée pour ajouter des gestionnaires de soumission aux formulaires existants. J'ai fait beaucoup de recherches et je ne trouve aucun exemple. J'ai également examiné certains modules D8 en cours de réalisation, mais je n'y ai pas vraiment trouvé d'exemples de travail.

Quelqu'un at-il une idée de la bonne façon de faire Drupal 8?

Arbee
la source
2
Vous devez publier votre code existant afin que les gens puissent y jeter un œil et repérer tout problème / proposer des alternatives.
Yuriy Babenko
Il existe, à partir de D8 beta9, des getters et setters pour les gestionnaires de soumission, mais je n'arrivais pas à les faire fonctionner et j'ai utilisé la réponse ci-dessous. J'espère que l'interface du nœud recevra des événements dans le futur, car je préfère m'abonner à un événement plutôt que d'utiliser un hook.
Alex Finnarn

Réponses:

13

Selon l'exemple de la documentation, c'est la même chose que pour Drupal 7:

$form['actions']['submit']['#submit'][] = 'mymodule_upload_enabled_types_submit';

Vous pouvez trouver une logique (de travail) similaire dans

Et quelques autres d'ailleurs.

Clive
la source
1
Je ne peux pas discuter avec les documents de l'API. Probablement quelque chose de délicat avec mon implémentation, je vais creuser plus profondément.
Arbee
Voir ma mise à jour ci-dessus, à part $ form ['actions'] ['submit'], il y a aussi des sections $ form ['actions'] ['publish'] et ['unpublish'] qui peuvent avoir des gestionnaires de soumission attachés.
Arbee
J'ai dû utiliser $ form ['actions'] ['publish'] ['# submit'] [] au lieu de $ form ['actions'] ['submit'] ['# submit'] [] pour mon gestionnaire de soumission pour fonctionner lorsque le nœud a été publié. Cependant, je n'arrive pas à faire fonctionner le rappel lorsque le nœud est enregistré pour la première fois comme non publié.
Alex Finnarn
6

Vous pouvez ajouter le nombre de gestionnaires d'envoi souhaité à l'aide du code suivant:

 $form['actions']['submit']['#submit'][] = 'mymodule_what_ever_function';

Si vous souhaitez ajouter un gestionnaire de soumission après le gestionnaire de soumission par défaut (un gestionnaire de soumission qui sera appelé après le rappel de soumission), vous pouvez utiliser ce qui suit.

$form['#submit'][1] = test_function;

Pour supprimer le gestionnaire de soumission:

unset($form["actions"]['submit']);
DEVARAJ JOHNSON
la source
3

Le comportement est soit modifié, soit différent d'un cas à l'autre. Avec le formulaire de confirmation Node Delete Multiple

$form['actions']['submit']['#submit'][] = 'mymodule_upload_enabled_types_submit';

Le code de @ Clive fait que Drupal ignore le gestionnaire principal. Dans ce cas, ajoutez le gestionnaire au$form['#submit'] section:

$form['#submit'][] = 'mymodule_upload_enabled_types_submit';
décodeur
la source
1

Voici comment attacher un gestionnaire de soumission personnalisé au formulaire d'ajout / modification de nœud d'article dans Drupal 8:

<?php

use Drupal\Core\Form\FormStateInterface;

/**
 * Implements hook_form_alter().
 */
function my_module_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  // Use this to reveal the form id.
  //drupal_set_message($form_id);

  // Use this with the devel module to inspect the button action(s).
  //kint($form['actions']);

  switch ($form_id) {

    case 'node_article_form':      // New article nodes.
    case 'node_article_edit_form': // Existing article nodes.

      // Attach our custom submit handler.
      $form['actions']['publish']['#submit'][] = 'my_module_node_article_form_submit';
      break;

  }

}

function my_module_node_article_form_submit($form, FormStateInterface $form_state) {
  drupal_set_message('Running custom submit handler...');
}

Je n'ai pas réussi à ajouter un gestionnaire de soumission personnalisé à $form['#submit']la fonction et à la déclencher correctement. J'ai le joindre explicitement à la sauvegarde et à la publication bouton lors de la création d'un nouvel article, et le joindre au bouton Enregistrer et conserver publié lors de la modification d'un article existant.

En outre publish, voici quelques-unes des autres actions de bouton disponibles:

unpublish
preview
delete
tyler.frankenstein
la source
Je suis dans Drupal 8.7.3, et my_module_node_article_form_submit($form, FormStateInterface $form_statem'a donné TypeError: Argument 2 passed to _ccad_content_log_webform_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given; le changer pour _submit($form, $form_state)corriger les erreurs.
user1359