एक फॉर्म में एक कस्टम सबमिशन हैंडलर जोड़ें


19

मैं कस्टम फॉर्म सबमिशन हैंडलर कैसे जोड़ सकता हूं?

मैं जोड़ने की कोशिश की $form['#submit'][] = 'mymodule_form_submit';या $form['actions']['submit']['#submit'][] = 'mymodule_form_submit';करने के लिए 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?");
}

ऐसा लगता drupal_set_message()है बुलाया नहीं है। मैंने कैश के पुनर्निर्माण का भी प्रयास किया, लेकिन फ़ंक्शन अभी भी नहीं कहा जाता है।

मैं Drupal 8.2.3 का उपयोग कर रहा हूं।


आपको पूर्ण कार्यान्वयन दिखाना चाहिए hook_form_alter(), या यह बताना थोड़ा कठिन है कि आप क्या कर रहे हैं। इसके अलावा, आपको यह कहना चाहिए कि आप किस रूप में परिवर्तन करने का प्रयास कर रहे हैं।
kiamlaluno

@kiamlaluno मैं अपना hook_form_alter जोड़ता हूं।
युसेफ

आपका कोड अभी भी $ फ़ॉर्म ['क्रियाएँ'] ['सबमिट'] ['# सबमिट'] है? [$ क्रिया] के साथ ['सबमिट'] बदलने का प्रयास करें।
MRD

जवाबों:


25

यदि आप उपयोग hook_form_node_form_alter()करते हैं तो उदाहरण कोड का उपयोग किया जा सकता है :

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';
    }
  }
}

और फ़ंक्शन सबमिट करें

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'][]आप कौन से दस्तावेज देख रहे हैं? या आपने एक टाइपो बनाया है? इस हुक_फॉर्म_ल्टर में डॉक्टर कहते हैं $form['actions']['submit']['#submit'][]
कोई श्सवेट

1
नहीं, यह Hook_form_BASE_FORM_ID_alter ()
MrD

1
दिलचस्प है, हाँ शायद उसे कार्यों के माध्यम से लूप करने की आवश्यकता है। हालाँकि, इस अन्य प्रश्न में आप हुक_फॉर्म_ल्टर () में कस्टम सबमिट हैंडलर को कैसे लागू करते हैं? यह मानकर चल रहा है कि वह जिस तरह से काम कर रहा है।
बजे कोई Sssweat

3
प्रत्येक रूप में अलग-अलग संरचनाएं हैं। तो कोई विशिष्ट उत्तर नहीं है।
MRD

5
Drupal.org/node/1901216 और drupal.org/node/2068063 देखें कि लूप क्यों जरूरी है, इस संदर्भ में अधिक जानकारी के लिए
Berdir

18

ड्रुपल 8 के लिए एक कस्टम वेबफॉर्म हैंडलर प्लगइन बनाना।

यह दस्तावेज़ मानता है कि आपने पहले ही वेबफॉर्म और वेबफॉर्म-यूआई को स्थापित और सक्षम कर दिया है

1) अपना वेबफॉर्म बनाएं। - संरचना पर जाएँ -> वेबफ़ॉर्म और "+ वेबफ़ॉर्म जोड़ें" बटन दबाएं। - आप या तो यूआई का उपयोग कर सकते हैं या यमल का उपयोग कर सकते हैं, जो आपके ऊपर है। उदाहरण एक ईमेल फॉर्म लेने वाले फ़ील्ड फ़ील्ड के लिए yaml:

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

याम्ल के लिए इंडेंटेशन महत्वपूर्ण है इसलिए सुनिश्चित करें कि आप इसे सही तरीके से प्राप्त करते हैं। संकेत रिक्त स्थान हैं।

अब अपना फॉर्म सेव करें।

2) एक वेबर हैंडलर प्लगइन बनाना

आगे हम एक नया प्लगइन बना सकते हैं जो वेबफॉर्म को संपादित करते समय "ईमेल / हैंडलर्स" अनुभाग में दिखाई देगा। मैं इसे myhandler कहूंगा, आप इसे अपनी इच्छानुसार कॉल कर सकते हैं, बशर्ते कि आप myhandler के सभी उल्लेखों को आपके द्वारा चुने गए नाम से बदल दें।

a) अपने प्लगइन के लिए एक नया फ़ोल्डर बनाएं, इसे अपने ड्रुपल रूट में करें (निम्नलिखित के रूप में यहाँ / var / www / html / के रूप में संदर्भित): / var / www / html / मॉड्यूल / कस्टम / myhandler

b) उपरोक्त निर्देशिका में एक नई फ़ाइल बनाएँ जिसे myhandler.info.yml कहा जाता है।

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

3) अपने मॉड्यूल निर्देशिका में एक src निर्देशिका बनाएँ, जैसे: / var / www / html / मॉड्यूल / कस्टम / myhandler / src में src बनाने प्लगइन में प्लगइन बनाने WebformHandler

(इसका उपयोग करके एक बार में प्राप्त किया जा सकता है

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

जो कि mpdir को -p फ्लैग का उपयोग करके एक ही बार में पूरी संरचना बना देगा।)

4) एक नई फ़ाइल बनाएँ /var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/MyFormHandler.php

उस फ़ाइल में निम्न php कोड जाता है, मैंने विन्यास फॉर्म सेटअप को छोड़ दिया है ताकि आप देख सकें कि यदि आवश्यक हो तो अपने प्लगइन को कैसे कॉन्फ़िगर करें।

<?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) अपने MyHandler मॉड्यूल (ड्रश या मेन्यू का उपयोग करके) को सक्षम करें और फिर अपने ड्रुपल कैश ("ड्रश क्र" को अपने ड्रुपल रूट (/ var / www / html यहाँ) के तहत कहीं भी फिर से बनाएँ (यदि आप ड्रश का उपयोग करते हैं)।

6) अपने वेबफ़ॉर्म को संपादित करें, "ईमेल / हैंडलर" पर जाएं और "+ हैंडलर जोड़ें" बटन पर क्लिक करें। आपको अपना प्लगइन सूचीबद्ध दिखाई देना चाहिए, हैंडलर जोड़ें पर क्लिक करें, आपको अब एक बॉक्स देखना चाहिए जो सबमिशन यूआरएल के लिए पूछ रहा है। Save बटन पर क्लिक करें। यदि कुछ सही नहीं दिखता है, या यह काम नहीं कर रहा है, तो अपाचे त्रुटि लॉग की जांच करें, आपको वहां कुछ उपयोगी मिल सकता है।

7) अपने फॉर्म का परीक्षण करें - फॉर्म को सबमिट करें, और फिर वॉचडॉग लॉग (ड्रश ws) की जांच करें, आपको इसे भेजे गए मानों को देखना चाहिए। वे आपके द्वारा देखे जाने वाले आउटपुट में काटे जा सकते हैं, घबराएँ नहीं, यह सब वहाँ है। अब आप इसके साथ क्या करते हैं यह आपके ऊपर है।

आशा है कि यह किसी की मदद करता है। मैंने इसे सामान से एक साथ जोड़ दिया, जो मैंने उस जगह के आसपास पाया और इसे एक एकल दस्तावेज़ में लिखा। दूसरों का शुक्रिया जो मुझे यहां मिला।


1
अगर मुझे यह सही लगता है, तो हैंडलर के सही तरीके से काम करने के लिए उपरोक्त कोड में जो एक छोटी सी चीज गायब है, वह है SubmitConfigurationForm () विधि, parent::submitConfigurationForm($form, $form_state);और से मिलकर parent::applyFormStateToConfiguration($form_state);
हेंड्रिक

1
@ हेंड्रिक नहीं, आपको इसकी आवश्यकता नहीं है। मैंने केवल एक submitForm()फ़ंक्शन के साथ एक नया हैंडलर बनाया है और यह काम करता है। अन्य सभी कार्य बेस क्लास में स्थित हैं और मुझे उन्हें ओवरराइड करने की कोई आवश्यकता नहीं है। वैसे: एक बहुत अच्छा एक सरल उपाय एक बार जब आप इसे समझ
लेते हैं

5

यदि Drupal 8 कोर 8.4.3 में hook_form_BASE_FORM_ID_alter का उपयोग करते हुए, मैंने पाया कि कस्टम सबमिट हैंडलर जोड़ने के तरीके काम नहीं आए। यह सबमिट हैंडलर फ़ंक्शन नाम जोड़ने के लिए काम किया गया:

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

एक अन्य स्थिति में, Drupal 8.4.5 में hook_form_FORM_ID_alter का उपयोग करते हुए, मैंने पाया कि कस्टम सबमिट हैंडलर को जोड़ने के लिए ऊपर काम नहीं किया। इसके बजाय, यह काम किया:

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

1

स्वीकृत उत्तर ने ड्रुपल 8.7.7 का उपयोग करके मेरे लिए काम नहीं किया, search_apiमॉड्यूल से एक फॉर्म में हैंडलर जोड़ने की कोशिश की ।

मुझे यह त्रुटि मिली:

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

इसे काम करने के लिए, मैंने अपने फ़ंक्शन हस्ताक्षर को इंटरफ़ेस के पूर्ण नामस्थान में बदल दिया:

function _my_module_search_api_form_submit(array $form, Drupal\Core\Form\FormStateInterface $form_state) { ...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.