একটি বিদ্যমান ফর্ম পরিবর্তন করুন


12

আমরা কেবল ড্রুপাল 8 দিয়ে শুরু করেছি এবং খুব দ্রুত আমরা আমাদের প্রথম সমস্যাটির মধ্যে চলে এসেছি।

ড্রুপাল 8 এ কীভাবে আমার বিদ্যমান ফর্মটি পরিবর্তন করা উচিত?

নোড ফর্মের জন্য অন্য পৃষ্ঠায় পুনর্নির্দেশ করার জন্য আমাদের সংরক্ষণের পদ্ধতিটি পরিবর্তন করতে হবে। আমরা নোড ফর্মটি পরিবর্তন করে একটি মাল্টিস্টেপ ফর্মের মতো কিছু হতে চাই। ব্যবহারকারী নতুন সামগ্রী তৈরি করার পরে তারা আরও কিছু তথ্য পেতে একটি নতুন ফর্মটিতে (আমরা তৈরি করেছি) পুনঃনির্দেশিত হয়ে যান।

আমরা বাস্তবায়নে আমাদের সমস্যা সমাধান করেছি hook_entity_type_alter()

function mymodule_entity_type_alter(&$entity_info) {
  $handlers = $entity_info['node']->get('handlers');
  $handlers['form']['default'] =    'Drupal\mymodule\Form\MyExtendedNodeForm';
  $handlers['form']['edit'] = 'Drupal\mymodule\Form\MyExtendedNodeForm';
  $entity_info['node']->set('handlers', $handlers);
}

এরপরে আমরা একটি নতুন ফর্ম শ্রেণি তৈরি করেছি যা নোড ফর্মটি প্রসারিত করে এবং সংরক্ষণ পদ্ধতিতে পরিবর্তন করে।

class MyExtendedNodeForm extends NodeForm {

    public function save(array $form, FormStateInterface $form_state) {
      parent::save($form, $form_state);
      $node = $this->entity;
      $form_state->setRedirect('entity.regions.add_form', ['nid' => $node->id()]);
  }

}

এটি পুরোপুরি কাজ করে, তবে এটি কি ভাল? অন্য মডিউল যদি একই কাজ করে তবে আমাদের কোডটি আর কার্যকর হয় না।


2
ড্রুপাল 8 এখনও সমর্থন করে hook_form_alter()। আপনার যদি কেবল ফর্মটি পুনর্নির্দেশের প্রয়োজন হয় তবে এটি ফর্ম জমা হ্যান্ডলার যুক্ত করতে যথেষ্ট যা পুনঃনির্দেশ করে।
কিমলালুনো


@ বারডির এটি একা বেশি সহায়ক হবে না, আমি ভয় পাচ্ছি: ড্রুপাল 8 সম্পর্কে আমার জ্ঞানটি বেশ সীমাবদ্ধ। এছাড়াও, ওপিতে " save()পদ্ধতি পরিবর্তন করুন " এর অর্থ কী তা পরিষ্কার করা উচিত । এর অর্থ কি ডেটা সংরক্ষণের উপায় পরিবর্তন করা বা কেবল একটি পুনর্নির্দেশ করা? প্রথম ক্ষেত্রে, উত্তর আরও জটিল।
কিমলালুনো

উত্তরের জন্য @ কিয়ামলালানো থক্স। এই ক্ষেত্রে আমাদের কেবল সংরক্ষণ () পরে পুনর্নির্দেশ করা দরকার যাতে আপনার উত্তরটি কাজ করা উচিত। তবে আমি কীভাবে ফর্মের অন্যান্য জিনিসগুলিকে সঠিক দ্রুপাল 8 উপায়ে পরিবর্তন করতে আগ্রহী ছিলাম। উদাহরণস্বরূপ কীভাবে এটি সংরক্ষণ করা যায় তা পরিবর্তন করুন, বা ফর্মটিতে ক্ষেত্রগুলি যুক্ত করুন etc ইত্যাদি
জেনস স্টেপে

উত্তর:


4

আমাকে গতকাল ঠিক একই জিনিসটি করতে হয়েছিল এবং আমি এখনও এটি করার জন্য আরও একটি দ্রুপাল 8 উপায় খুঁজছি, কিন্তু এটি খুঁজে পাইনি। আমি এটি এভাবেই শেষ করেছি:

<?php

/**
 * @file
 * This is my module.
 */

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

/**
 * Implements hook_form_alter().
 */
function MODULE_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
  if ($form_id == 'user_form') {
    $form['actions']['submit']['#submit'][] = '_MODULE_goto';
  }
}

/**
 * Make the form go to route.id.
 */
function _MODULE_goto($form, FormStateInterface $form_state) {
  $form_state->setRedirect('route.id');
}

আমি এখনও এটি অন্যরকমভাবে করতে আগ্রহী, আমার মডিউলটি। মডুল ফাইলটি ছাড়াই খুব পরিষ্কার দেখাচ্ছে :)।


3

আমি ড্রুপাল ৮.১.১ ব্যবহার করছি এবং তাদের অ্যাকাউন্ট পরিবর্তন করার পরে ব্যবহারকারীদের পুনর্নির্দেশের চেষ্টা করছিলাম, অর্থাৎ / ব্যবহারকারী / সম্পাদনা পৃষ্ঠায় সেভ বোতামটি ক্লিক করুন। আমি প্রথমে এটি চেষ্টা করেছি:

/**
 * Implements hook_form_alter().
*/
function MODULE_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
  if ($form_id == 'user_form') {
    $form['#submit'][] = '_MODULE_goto';
  }
}

যদিও এটি কাজ করে user_login_form, এটি কাজ করে না user_form। জন্য user_formআমি ব্যবহার করতে হয়েছে

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

আমি আশা করি এটি একই সমস্যা জুড়ে হোঁচট খায় এমন অন্যদের সহায়তা করে!


1

ভাল আমি site_information_settingsকিছু ক্ষেত্র যুক্ত করতে ফর্মটি পরিবর্তন করতে চেয়েছিলাম ।

আপনি হিসাবে, আমার মধ্যে পছন্দ ছিল

  • hook_form_alter(বা hook_form_FORM_ID_alter)
  • মূল ফর্ম শ্রেণি প্রসারিত করুন

কিছু ওওপি তৈরি করতে চেয়েছি তাই আমি system.site_information_settingsরুটের _formবৈশিষ্ট্য পরিবর্তন করে কোনও রুট গ্রাহক পরিষেবা লিখতে শুরু করি ।

তারপরে আমার নতুন ক্লাসে SiteInformationFormক্ষেত্রগুলি এবং তাদের বৈধতা যুক্ত হওয়ার পরে এবং জমা দেওয়ার কাজটি প্রসারিত হওয়ার পরে আমি ঠিক আপনার মতোই অনুভব করেছি ... এখন যদি অন্য কোনও মডিউল ফর্মের রুটটিও আবার নিজের শ্রেণীর ব্যবহারের জন্য আবার লিখে দেয়?

প্রথমদিকে, আমার দুটি বিকল্পের মধ্যে পছন্দ ছিল ... মনে হচ্ছে আমি ভুলটি বেছে নিয়েছি।

hook_form_alter/ hook_form_FORM_ID_alterবিদ্যমান ফর্মটি পরিবর্তন করার সেরা উপায় বলে মনে হচ্ছে।


0

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

এই পরিস্থিতিতে, hook_form_alterকাস্টমস সাবমিট হ্যান্ডলার (ফর্ম বা বোতামে, ফর্ম এবং প্রয়োজনীয়তার উপর নির্ভর করে) সহ ড্রুপাল 7 এর মতো অনেক কিছু করা ভাল সমাধান হতে পারে।

প্রশ্নটিতে আপনি যা বর্ণনা করেছেন তাও কার্যকর হয় তবে আমি ক্লাসে কিছু পরিবর্তন করতে না চাইলে আমি বেস শ্রেণিকে ওভাররাইট করা এড়াতে চাই।

সেভ পদ্ধতিটি যেভাবেই হ্যান্ডলার হিসাবে জমা দেওয়া হিসাবে ব্যবহৃত হয়েছে, তাই কেবল কোনও পুনর্নির্দেশ যুক্ত করার জন্য ওভাররাইট করতে খুব বেশি অর্থবোধ করে না।


0

আমি মনে করি আরও ভাল পদ্ধতিটি এখনও form_alter পরিবার থেকে একটি হুক ব্যবহার করা, একটি জমা হ্যান্ডলার সংযুক্ত করা এবং সেটির মধ্যে আপনার পুনর্নির্দেশের সেট করা।

এটি করার জন্য বেস ক্লাসগুলি বাড়ানো অবদান আমার মতে লোমশ। বিশেষত যেহেতু কোনও ফাংশন পরিবর্তন হচ্ছে না, কেবল পুনর্নির্দেশ করছে।


0

আপনি একটি নতুন EventSubscriber যা KernelEvents :: অনুরোধ ঘটনা শোনে তৈরি করুন এবং তারপর বিক্রিয়া ঘটাতে পারে যখন আপনি একটি নোড ফর্ম ভালো কিছু জমা দিচ্ছেন, এই

যাইহোক হুক_ফর্ম_ল্টার উপায় ঠিকঠাক কাজ করে।


0

আমি এ পর্যন্ত যা খুঁজে পেয়েছি: একটি ফর্ম অল্টার হুক বাস্তবায়ন করা এবং ফর্মটিতে বৈধতা / জমা হ্যান্ডলারগুলি পরিবর্তন করার চেষ্টা করুন নিজেই যদি আপনি $ ফর্ম ['# বৈধতা] / $ ফর্ম [# সাবমিট'] হ্যান্ডলারগুলি পরিবর্তন করেন তবে কাজ করে। (ফর্মটিতে এই অভ্যাসের জন্য ফর্ম_স্টেট ফাংশনগুলিকে কল করা হুক নিজেই পরিবর্তন করে)

তবে আপনি যখন কোনও বৈধতা হ্যান্ডলারের মধ্যে এটি চেষ্টা করেন, তখন এটি কাজ করে:

// Load form submit handlers.
$submit_handlers = $form_state->getSubmitHandlers();

// Drop the core entity submitForm function.
$key_core_submit = array_search('::submitForm', $submit_handlers);
if ($key_core_submit !== FALSE) {
  unset($submit_handlers[$key_core_submit]);
  // Add your own submit handler.
  array_unshift($submit_handlers, 'yourmodule_submit_handler');
}
// Update submit handlers.
$form_state->setSubmitHandlers($submit_handlers);

কারণ ফর্মটি এখন সম্পূর্ণরূপে নির্মিত হয়েছে, ফর্মের ক্ষেত্রে হর্টের পরিবর্তিত হয়নি।

ধারণাটি হ'ল: আপনি সর্বশেষ হিসাবে বৈধতা হ্যান্ডলারটি যুক্ত করতে পারেন, জমা দেওয়ার জন্য উপস্থিত অন্যান্য হ্যান্ডলারের মূল্যায়ন করতে পারেন এবং সেগুলি এখানেই পরিবর্তন করতে পারেন।

আপনি যদি বৈধতা হ্যান্ডলারগুলিও পরিবর্তন করতে চান তবে নিশ্চিত হয়ে নিন যে আপনার অন্য কোনওটির আগে চলে এবং যা যাচাইকরণ হ্যান্ডলারে যা চান তা পরিবর্তন করুন।

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

সেভ () পদ্ধতির পুনঃনির্দেশকে বাইপাস করা সম্ভব নয়, তবে সেভ ()টিকে আনসেট করা (এইভাবে আপনার নিজের প্রয়োগ করুন) via সত্য, কোনও শ্রেণি ভাল হয় এবং অবজেক্টস / ইত্যাদিতে সহজে অ্যাক্সেস সরবরাহ করে তবে মূল শ্রেণিটি ওভাররাইড করা যখন অন্য মডিউলগুলি এগুলি ব্যবহার করতে চায় তখন সত্যই সমস্যাগুলির দিকে নিয়ে যায়। আপনি যদি এই কোডটি ব্যবহার করেন তবে কেস নয়।


0

এই সমস্যাটি যাচাই করার পরে, আমি এটি খুঁজে পেয়েছি যা আপনার ক্ষেত্রে উপযুক্ত হবে:

/**
 * Implements hook_entity_type_alter().
 */
function mymodule_entity_type_alter(&$entity_info) {
 $entity_info['node']->setFormClass('edit','Drupal\mymodule\Form\CustomNodeForm');
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.