Come si implementa un gestore di invio personalizzato in hook_form_alter ()?


16

Sto aggiornando uno dei miei moduli Drupal 7 su 8 e sto riscontrando un problema con il mio modulo alterato. Sto aggiungendo una funzione di convalida e un gestore di invio. La funzione di convalida viene chiamata correttamente, ma la funzione di invio non viene attivata. Mi chiedo se ciò significhi che esiste un approccio in stile Symfony che deve essere adottato per aggiungere gestori di invio ai moduli esistenti. Ho fatto molte ricerche e non trovo esempi. Ho anche esaminato alcuni moduli D8 in fase di elaborazione, ma non ho trovato alcun esempio funzionante.

Qualcuno ha idea di quale sia il modo corretto Drupal 8 per farlo?


2
Dovresti pubblicare il tuo codice esistente in modo che le persone possano dare un'occhiata e individuare eventuali problemi / suggerire alternative.
Yuriy Babenko il

Ci sono, a partire dalla D8 beta9, getter e setter per i gestori di invio, ma non riesco a farli funzionare e ho usato la risposta qui sotto. Spero che l'interfaccia del nodo riceva alcuni eventi in futuro, poiché preferirei iscrivermi a un evento piuttosto che usare un hook.
Alex Finnarn,

Risposte:


13

Secondo l'esempio nella documentazione è lo stesso di Drupal 7:

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

Puoi trovare una logica simile (funzionante) in

E pochi altri oltre.


1
Non posso discutere con i documenti API. Probabilmente qualcosa di strano nella mia implementazione, scaverò più a fondo.
Arbee,

Vedi il mio aggiornamento sopra, oltre a $ form ['actions'] ['submit'] ci sono anche $ form ['actions'] ['publishing'] e ['unpublish'] sezioni alle quali possono essere associati i gestori di invio.
Arbee,

Ho dovuto usare $ form ['actions'] ['publishing'] ['# submit'] [] invece di $ form ['actions'] ['submit'] ['# submit'] [] per il mio gestore di invio per funzionare quando il nodo è stato pubblicato. Tuttavia, non riesco a far funzionare il callback quando il nodo viene salvato per la prima volta come non pubblicato.
Alex Finnarn,

6

Puoi aggiungere quanti gestori di invio vuoi utilizzando il seguente codice:

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

Se si desidera aggiungere un gestore di invio dopo il gestore di invio predefinito, (un gestore di invio che verrà chiamato dopo il callback di invio), è possibile utilizzare quanto segue.

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

Per rimuovere il gestore di invio:

unset($form["actions"]['submit']);

3

Il comportamento è cambiato o differisce da caso a caso. Con il nodo Cancella il modulo di conferma multipla

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

Il codice di @ Clive fa sì che Drupal ignori il gestore principale. In questo caso aggiungi il gestore alla $form['#submit']sezione:

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

1

Ecco come allegare un gestore di invio personalizzato al modulo di aggiunta / modifica del nodo dell'articolo in 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...');
}

Non sono stato in grado di aggiungere correttamente un gestore di invio personalizzato $form['#submit']e di attivare correttamente la funzione. Ho dovuto collegarlo esplicitamente al pulsante Salva e pubblica durante la creazione di un nuovo articolo e collegarlo al pulsante Salva e mantieni pubblicato durante la modifica di un articolo esistente.

Inoltre publish, ecco alcune delle altre azioni disponibili sui pulsanti:

unpublish
preview
delete

Sono in Drupal 8.7.3 e my_module_node_article_form_submit($form, FormStateInterface $form_statemi ha dato TypeError: Argument 2 passed to _ccad_content_log_webform_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given; cambiandolo per _submit($form, $form_state)correggere gli errori.
user1359
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.