Aggiungi un gestore di invio personalizzato a un modulo


19

Come posso aggiungere un gestore di invio di moduli personalizzati?

Ho provato ad aggiungere $form['#submit'][] = 'mymodule_form_submit';o $form['actions']['submit']['#submit'][] = 'mymodule_form_submit';a hook_form_alter().

use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\HttpFoundation\Request;

function MYMODULE_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if ($form_id == 'node_trends_form' || $form_id == 'node_trends_edit_form') {
    foreach (array_keys($form['actions']) as $action) {
      if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
        $form['actions']['submit']['#submit'][] = 'mymodule_form_submit';
      }
    }
  }
}
function mymodule_form_submit(array $form, FormStateInterface $form_state){
    //die("why won't this execute? :(");
    drupal_set_message("Why won't this message show?");
}

Sembra drupal_set_message()non si chiama. Ho anche provato a ricostruire la cache, ma la funzione non viene ancora chiamata.

Sto usando Drupal 8.2.3.


Dovresti mostrare la piena implementazione di hook_form_alter(), o è un po 'più difficile dirti cosa stai facendo di sbagliato. Inoltre, dovresti dire quale forma stai cercando di modificare.
kiamlaluno

@kiamlaluno Aggiungo il mio hook_form_alter.
Yusef,

qual'è il tuo codice $ form ['actions'] ['submit'] ['# submit']? Prova a sostituire ['submit'] con [$ action].
MrD

Risposte:


25

Se si utilizza hook_form_node_form_alter()può essere utilizzare il codice di esempio :

function mymodule_form_node_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  foreach (array_keys($form['actions']) as $action) {
    if ($action != 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
      $form['actions'][$action]['#submit'][] = 'mymodule_form_submit';
    }
  }
}

e invia la funzione

function mymodule_form_submit(array $form, FormStateInterface $form_state){
    //die("I'm not getting run, why :(");
    drupal_set_message("Why won't this message show?");

}

1
$form['actions'][$action]['#submit'][]quale documentazione stai visualizzando? o hai fatto un refuso? In questo documento hook_form_alter dice $form['actions']['submit']['#submit'][].
No Sssweat,


1
Interessante, sì, forse ha bisogno di passare in rassegna le azioni. Tuttavia , in questo altro Q Come si implementa un gestore di invio personalizzato in hook_form_alter ()? supponiamo che funzioni nel modo in cui lo sta facendo.
No Sssweat,

3
Ogni modulo ha strutture diverse. Quindi non esiste una risposta specifica.
MrD

5
Vedi drupal.org/node/1901216 e drupal.org/node/2068063 per ulteriori informazioni sul motivo per cui quel loop è necessario
Berdir,

18

Creazione di un plug-in del gestore di moduli web personalizzato per drupal 8.

Questo documento presuppone che tu abbia già installato e abilitato webform e webform-ui

1) Crea il tuo modulo web. - Vai a struttura -> moduli web e premi il pulsante "+ Aggiungi modulo web". - Puoi usare l'interfaccia utente o usare yaml, dipende da te. esempio yaml per un modulo di un campo che accetta un indirizzo email:

email:
  '#type': email
  '#title': email
  '#title_display': invisible
  '#placeholder': 'ENTER YOUR EMAIL'
  '#attributes':
    class:
      - my-ip

Il rientro è importante per yaml, quindi assicurati di farlo bene. i rientri sono spazi.

Ora salva il modulo.

2) Creazione di un plug-in gestore webform

Successivamente possiamo creare un nuovo plug-in che verrà visualizzato nella sezione "Email / Gestori" durante la modifica del modulo web. Lo chiamerò myhandler, puoi chiamarlo come vuoi, a condizione che tu sostituisca tutte le menzioni di myhandler con il nome che scegli.

a) Crea una nuova cartella per il tuo plugin, fallo nella tua drupal root (qui indicata come / var / www / html /) nella seguente sottocartella: / var / www / html / modules / Custom / myhandler

b) Creare un nuovo file nella directory precedente chiamato myhandler.info.yml in questo file:

name: My Form Handler
description: handles form submits, does something with them. 
package: Custom
type: module
version: 1.0
core: 8.x

3) Creare una directory src nella directory del modulo, ad esempio: / var / www / html / modules / Custom / myhandler / src in src create Plugin in Plugin create WebformHandler

(questo può essere ottenuto in una volta sola usando

mkdir -p /var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/ 

che renderà l'intera struttura in una volta sola usando il flag -p per mkdir.)

4) Crea un nuovo file /var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/MyFormHandler.php

in quel file va il seguente codice php, ho lasciato la configurazione del modulo di configurazione in modo da poter vedere come configurare il plugin se necessario.

<?php
namespace Drupal\myhandler\Plugin\WebformHandler;

use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Serialization\Yaml;
use Drupal\Core\Form\FormStateInterface;
use Drupal\webform\Plugin\WebformHandlerBase;
use Drupal\webform\webformSubmissionInterface;


/**
 * Form submission handler.
 *
 * @WebformHandler(
 *   id = "myhandler_form_handler",
 *   label = @Translation("MyHandler form handler"),
 *   category = @Translation("Form Handler"),
 *   description = @Translation("Do something extra with form submissions"),
 *   cardinality = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_SINGLE,
 *   results = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
 * )
 */
class MyFormHandler extends WebformHandlerBase {

     /**
       * {@inheritdoc}
       */

     public function defaultConfiguration() {
        return [
            'submission_url' => 'https://api.example.org/SOME/ENDPOINT',
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
        $form['submission_url'] = [
            '#type' => 'textfield',
            '#title' => $this->t('Submission URL to api.example.org'),
            '#description' => $this->t('The URL to post the submission data to.'),
            '#default_value' => $this->configuration['submission_url'],
            '#required' => TRUE,
        ];
        return $form;
    }



  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state, WebformSubmissionInterface $webform_submission) {
    // Your code here.
        // Get an array of the values from the submission.

        $values = $webform_submission->getData();

        // Get the URL to post the data to.
        $post_url = $this->configuration['submission_url'];

        $message = "MyHandler got form data:".print_r($values,1); 
        \Drupal::logger('myformhandler')->error($message);

        return true;
 }
}   
?>

5) Abilita il tuo modulo MyHandler (usando il menu Drush o Extender) e poi ricostruisci la tua cache di Drupal ("drush cr" da qualsiasi punto sotto la tua Drupal root (/ var / www / html qui) lo farebbe se usi Drush)

6) modifica il tuo modulo web, vai su "Email / Handlers" e fai clic sul pulsante "+ Aggiungi gestore" Dovresti vedere il tuo plugin elencato, fai clic su Aggiungi gestore, ora dovresti vedere una casella che richiede l'URL di invio. fai clic sul pulsante Salva. Se qualcosa non sembra giusto o non funziona, controlla il registro degli errori di Apache, potresti trovare qualcosa di utile lì.

7) Testa il tuo modulo - invia un modulo, quindi controlla il registro del watchdog (drush ws), dovresti vedere i valori inviati ad esso. Potrebbero essere troncati nell'output che vedi, non farti prendere dal panico, è tutto lì. Quello che fai ora con questo dipende da te.

Spero che questo aiuti qualcuno. L'ho messo insieme da cose che ho trovato in giro per il luogo e l'ho scritto in un unico documento. Grazie agli altri che mi hanno portato qui.


1
Se ho capito bene, l'unica cosa che manca nel codice sopra per far funzionare correttamente il gestore è il metodo submitConfigurationForm (), composto da parent::submitConfigurationForm($form, $form_state);e parent::applyFormStateToConfiguration($form_state);.
Hendrik

1
@Hendrik No, non ne hai bisogno. Ho creato un nuovo gestore con solo una submitForm()funzione e funziona. Tutte le altre funzioni sono situate nella classe base e non ho bisogno di ignorarle. A proposito: una soluzione piuttosto semplice una volta che lo hai capito ;-)
RWAM

5

se usando hook_form_BASE_FORM_ID_alter in Drupal 8 core 8.4.3, ho trovato che i modi per aggiungere il gestore di invio personalizzato non funzionavano. Questo ha funzionato per l'aggiunta del nome della funzione del gestore di invio:

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

In un'altra situazione, usando hook_form_FORM_ID_alter in Drupal 8.4.5, ho scoperto che quanto sopra non ha funzionato per l'aggiunta del gestore di invio personalizzato. Invece, ha funzionato:

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

1

La risposta accettata non ha funzionato per me utilizzando Drupal 8.7.7, cercando di aggiungere un gestore di invio a un modulo dal search_apimodulo.

Ho ricevuto questo errore:

TypeError: Argument 2 passed to _my_module_search_api_form_submit() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given in ...

Per farlo funzionare, ho cambiato la mia firma della funzione nello spazio dei nomi completo dell'interfaccia:

function _my_module_search_api_form_submit(array $form, Drupal\Core\Form\FormStateInterface $form_state) { ...
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.