একটি ফর্মটিতে একটি কাস্টম জমা হ্যান্ডলার যুক্ত করুন


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()হয় না। আমি ক্যাশেটি পুনর্নির্মাণের চেষ্টাও করেছি, তবে ফাংশনটি এখনও বলা হয়নি।

আমি ড্রুপাল 8.2.3 ব্যবহার করছি।


আপনার সম্পূর্ণ বাস্তবায়ন দেখাতে hook_form_alter()হবে, বা আপনি কী ভুল করছেন তা আপনাকে বলা কিছুটা শক্ত। এছাড়াও, আপনার কোন রূপটি পরিবর্তনের চেষ্টা করছেন তাও বলা উচিত।
কিমলালুনো

@ কিয়ামলালানো আমি আমার হুক_ফর্ম_ল্টার যুক্ত করছি।
ইউসুফ

আপনার কোডটি এখনও কী $ ফর্ম ['ক্রিয়াগুলি'] ['জমা'] ['# জমা']? [Submit ক্রিয়া] সহ ['জমা দিন'] প্রতিস্থাপন করে দেখুন Try
মিঃডি

উত্তর:


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
আকর্ষণীয়, হ্যাঁ সম্ভবত তাকে ক্রিয়াগুলির মধ্য দিয়ে লুপ করা দরকার। যদিও, এই অন্যান্য প্রশ্নে আপনি কীভাবে হুক_ফর্ম_ল্টার () এ একটি কাস্টম জমা হ্যান্ডলারটি প্রয়োগ করবেন? মনে করুন যে তিনি এটি করছেন সেভাবেই কাজ করবেন।
কোনও এসসিওয়েট

3
প্রতিটি ফর্মের বিভিন্ন কাঠামো রয়েছে। সুতরাং কোন নির্দিষ্ট উত্তর নেই।
মিঃডি

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) একটি ওয়েবফর্ম হ্যান্ডলার প্লাগইন তৈরি করা

এর পরে আমরা একটি নতুন প্লাগইন তৈরি করতে পারি যা ওয়েবফর্মটি সম্পাদনা করার সময় "ইমেল / হ্যান্ডলার" বিভাগে প্রদর্শিত হবে। আমি এটিকে মাইহ্যান্ডলার বলব, আপনি যা চান তা কল করতে পারেন, তবে আপনি যে নামটি বেছে নেবেন তার সাথে মাইহ্যান্ডলারের সমস্ত উল্লেখ প্রতিস্থাপন করুন।

ক) আপনার প্লাগইনের জন্য একটি নতুন ফোল্ডার তৈরি করুন, নিম্নলিখিত সাবফোল্ডারটিতে আপনার ড্রুপাল রুট (এখানে / var / www / html / হিসাবে উল্লেখ করা হয়) করুন: / var / www / এইচটিএমএল / মডিউল / কাস্টম / মাইহ্যান্ডলার

খ) উপরের ডিরেক্টরিতে একটি নতুন ফাইল তৈরি করুন 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) আপনার মডিউল ডিরেক্টরিতে একটি এসসিআর ডিরেক্টরি তৈরি করুন, যেমন: / var / www / এইচটিএমএল / মডিউল / কাস্টম / মাইহ্যান্ডলার / এসসিআর ইন সিআরসি প্লাগ ইন প্লাগইন তৈরি করুন ওয়েবফর্মহ্যান্ডলার তৈরি করুন

(এটি ব্যবহার করে একসাথে অর্জন করা যেতে পারে

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

যা পুরো কাঠামোটিকে একসাথে এম-পিডি-তে পতাকা ব্যবহার করে তৈরি করবে))

4) একটি নতুন ফাইল তৈরি করুন /var/www/html/modules/Custom/myhandler/src/Plugin/WebformHandler/MyFormHandler.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;
 }
}   
?>

৫) আপনার মাইহ্যান্ডলার মডিউলটি সক্ষম করুন (ড্রশ বা প্রসারিত মেনু ব্যবহার করে) এবং তারপরে আপনার ড্রুপাল ক্যাশে পুনরায় নির্মাণ করুন (আপনার ড্রুপাল মূলের নীচে যে কোনও জায়গা থেকে "ড্রশ ক্র্যাও" (এখানে / var / www / html এখানে) আপনি যদি ড্রাশ ব্যবহার করেন তবে তা করতে হবে)

)) আপনার ওয়েবফর্মটি সম্পাদনা করুন, "ইমেল / হ্যান্ডলারগুলি" এ যান এবং "+ হ্যান্ডলার যুক্ত করুন" বোতামে ক্লিক করুন আপনার তালিকাভুক্ত প্লাগইনটি দেখতে হবে, হ্যান্ডলারের অ্যাড ক্লিক করুন, আপনার এখন সাবমিশন ইউআরএল চেয়ে একটি বাক্স দেখতে হবে। সংরক্ষণ বাটন ক্লিক করুন। যদি কিছু ঠিক মতো না দেখায় বা এটি কাজ না করে থাকে তবে অ্যাপাচি ত্রুটি লগটি পরীক্ষা করুন, আপনি সেখানে কিছু সহায়ক পেতে পারেন।

।) আপনার ফর্মটি পরীক্ষা করুন - ফর্মটিতে একটি জমা দিন এবং তারপরে ওয়াচডগ লগ (ড্রাশ ডাব্লুএস) পরীক্ষা করুন, আপনার এতে পাঠানো মানগুলি দেখতে হবে। আপনি যে আউটপুট দেখছেন সেগুলিতে এগুলি কেটে যেতে পারে, আতঙ্কিত হবেন না, সব আছে। আপনি এখন এটি দিয়ে যা করেন তা আপনার হাতে।

আশা করি এটি কাউকে সাহায্য করবে। আমি জায়গাটির চারপাশে পাওয়া স্টাফ থেকে এটি একসাথে আবদ্ধ করেছিলাম এবং এটি একটি একক দস্তাবেজে লিখেছিলাম। অন্যদের যারা আমাকে এখানে পেয়েছেন ধন্যবাদ।


1
যদি আমি এটি সঠিকভাবে পাই তবে হ্যান্ডলারের সঠিকভাবে কাজ করার জন্য উপরের কোডটিতে যে একটি ছোটখাটো জিনিস অনুপস্থিত রয়েছে তা হ'ল সাবমিট কনফিগারেশনফর্ম () পদ্ধতি parent::submitConfigurationForm($form, $form_state);এবং এর সমন্বয়ে parent::applyFormStateToConfiguration($form_state);
হেনড্রিক

1
@ হেন্ডরিক না, আপনার এটির দরকার নেই। আমি শুধুমাত্র একটি submitForm()ফাংশন দিয়ে একটি নতুন হ্যান্ডলার তৈরি করেছি এবং এটি কার্যকর হয়। অন্যান্য সমস্ত ফাংশন বেস ক্লাসে অবস্থিত এবং সেগুলি ওভাররাইড করার জন্য আমার কোনও দরকার নেই। যাইহোক: একবার খুব ভাল একটি সহজ সমাধান আপনি এটি বের করে
নিলে

5

যদি দ্রুপাল 8 কোর 8.4.3 এ হুক_ফর্ম_বিএএসএফএআরএম_আইডি_এলটার ব্যবহার করে, আমি কাস্টম সাবমিট হ্যান্ডলারটি যুক্ত করার উপায়গুলি কাজ করে নি। এটি জমা দেওয়ার হ্যান্ডলার ফাংশনটির নাম যুক্ত করার জন্য কাজ করেছে:

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

অন্য পরিস্থিতিতে, ড্রুপাল ৮.৪.৫ এ হুক_ফর্ম_এফএআরএম_আইডি_এলটার ব্যবহার করে আমি দেখতে পেলাম যে উপরেরগুলি কাস্টম জমা হ্যান্ডলারটি যুক্ত করার জন্য কাজ করে না। পরিবর্তে, এটি কাজ করেছে:

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

1

গৃহীত উত্তরটি ড্রুপাল ৮.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) { ...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.