it-swarm.it

Aggiungi un gestore di invio personalizzato a un modulo

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 che drupal_set_message() non venga chiamato. Ho anche provato a ricostruire la cache, ma la funzione non viene ancora chiamata.

Sto usando Drupal 8.2.3.

20
Yusef

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

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?");

}
26
MrD

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 (qui indicata come/var/www/html /) nella seguente sottocartella:/var/www/html/modules/personalizzato/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 es .:/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 drupal ("drush cr" da qualsiasi punto sotto il tuo 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 corretto 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.

18
CptnObvious

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';
6
Anthony Fournier

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_api modulo.

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) { ...
1
user1359