আমি কীভাবে বিদ্যমান ফর্ম / ক্ষেত্রে একটি কাস্টম বৈধতা হ্যান্ডলার যুক্ত করব?


21

আমি কীভাবে ড্রুপাল 8 এ বিদ্যমান ফর্মের (বা ফর্ম ক্ষেত্র) একটি কাস্টম বৈধতা হ্যান্ডলার যুক্ত করব?

আমার এমন একটি ফর্ম রয়েছে যা আমি তৈরি করি নি। ফর্মটি জমা দেওয়ার পরে আমি কিছু ক্ষেত্রে নিজের বৈধতা সংক্রান্ত বিধিগুলি যুক্ত করতে চাই।

ড্রুপাল 7 এর জন্য, কোনও ফর্মের জন্য কাস্টম বৈধতা? বাস্তবায়নের জন্য ব্যাখ্যা করে hook_form_alter()এবং তারপরে আপনার বৈধকরণ হ্যান্ডলার] [1] $form['#validate']অ্যারেতে যুক্ত করুন, তবে দ্রুপাল 8 টি ফর্মগুলি ক্লাসে রয়েছে। বৈধকরণ validateForm()পদ্ধতিটির মাধ্যমে সম্পন্ন হয় এবং আমার কোডটি এতে কীভাবে প্লাগ করতে হয় তা আমি জানি না।



1
এটি হুবহু সদৃশ নয়। আমার প্রশ্নটি ডি 8 এর জন্য, আপনার লিঙ্কটি ডি 7 এর জন্য।
AngularChef

আমি আজ এটি পেরিয়ে এসেছি এবং অন্যদের জন্য কেবল নোট রাখতে চাইছি যদি আপনি পোস্ট ব্যবহার না করে থাকেন (আমি একটি বিদ্যমান ভিউ পৃষ্ঠায় একটি ইউআরএল জমা দিতে চেয়েছি) বৈধিকরকম বা জমা ফর্ম রান নয় neither দুরন্ত দৃষ্টিতে এটি সুস্পষ্ট .... তবে আমি বুঝতে পারার আগে 30 মিনিট সময় বের করার চেষ্টা করেছিলাম ....: /
ben.hamelin

উত্তর:


19

#validateসম্পত্তি এখনো Drupal এর 8. ব্যবহার করা হয় (আদি এর সমাধান আপনি বিদ্যমান যাচাইকারী ওভাররাইড হবে)

আপনি যদি ডিফল্ট ছাড়াও আপনার কাস্টম বৈধকারক যুক্ত করতে চান তবে আপনাকে হুক_ফর্ম_এফএআরএম_আইডি_এলটারে (বা অনুরূপ) এর মতো কিছু যুক্ত করতে হবে :

$form['#validate'][] = 'my_test_validate';

ধন্যবাদ, শাবির। সুতরাং, কাস্টম বৈধকরণকারী যুক্ত করা D7 এবং D8 তে একই কাজ করে। ;)
AngularChef

হুবহু, নোড মডিউলটির কোড পরামর্শ করুন। সেখানে প্রচুর উদাহরণ রয়েছে
শাবির এ

2
আমি এটি চেষ্টা করেছি এবং এটি পুরোপুরি কাজ করেছে, আপনাকে ধন্যবাদ। দয়া করে নোট করুন যে ডি 8 ফর্ম এপিআই রেফারেন্সটি #validate(আপনার লিঙ্ক) এর জন্য যা বলেছে তার বিপরীতে , আপনার $form_stateকোনও অ্যারে (ডি 7 উপায়) হিসাবে ব্যবহার করা উচিত নয় , তবে অবজেক্ট বাস্তবায়নকারী FormStateInterface(ডি 8 উপায়) হিসাবে ব্যবহার করা উচিত । অন্য কথায়, আপনার কাস্টম ভ্যালিডিটারের কোডটি কোনও মূল validateForm()পদ্ধতিতে আপনি খুঁজে পেতে চাইছেন সেই কোডের সাথে এনালগ হওয়া উচিত ।
এঙ্গুলার শেফ

25

বার্দির সঠিক উত্তর দিয়েছিলেন, যে দ্রুপাল ৮.এর ক্ষেত্রে একটি ক্ষেত্রের মধ্যে বৈধতা যুক্ত করার বিষয়ে একটি সীমাবদ্ধতা সঠিক উপায় Here এখানে একটি উদাহরণ।

নীচের উদাহরণে, আমি টাইপের নোডের সাথে কাজ করব podcast, যার একক মান ক্ষেত্র রয়েছে field_podcast_duration। এই ক্ষেত্রের মানটি এইচএইচ: এমএম: এসএস (ঘন্টা, মিনিট এবং সেকেন্ড) হিসাবে ফর্ম্যাট করা দরকার।

সীমাবদ্ধতা তৈরি করতে দুটি শ্রেণি যুক্ত করা দরকার। প্রথমটি সীমাবদ্ধ সংজ্ঞা, এবং দ্বিতীয়টি সীমাবদ্ধতা বৈধকারক ator এই দুটিই প্লাগইন, এর নেমস্পেসে Drupal\[MODULENAME]\Plugin\Validation\Constraint

প্রথম, সীমাবদ্ধ সংজ্ঞা। নোট করুন যে প্লাগইন আইডিটি 'পডকাস্টডুরেশন' হিসাবে দেওয়া হয়েছে, ক্লাসের টিকা (মন্তব্য) তে। এটি আরও নিচে ব্যবহৃত হবে।

namespace Drupal\[MODULENAME]\Plugin\Validation\Constraint;

use Symfony\Component\Validator\Constraint;

/**
 * Checks that the submitted duration is of the format HH:MM:SS
 *
 * @Constraint(
 *   id = "PodcastDuration",
 *   label = @Translation("Podcast Duration", context = "Validation"),
 * )
 */
class PodcastDurationConstraint extends Constraint {

  // The message that will be shown if the format is incorrect.
  public $incorrectDurationFormat = 'The duration must be in the format HH:MM:SS or HHH:MM:SS. You provided %duration';
}

এর পরে, আমাদের সীমাবদ্ধতা বৈধকারক সরবরাহ করতে হবে। এই শ্রেণীর এই নামটি উপরে Validatorযুক্ত করা ক্লাসের নাম হবে যা এতে যুক্ত হবে:

namespace Drupal\[MODULENAME]\Plugin\Validation\Constraint;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

/**
 * Validates the PodcastDuration constraint.
 */
class PodcastDurationConstraintValidator extends ConstraintValidator {

  /**
   * {@inheritdoc}
   */
  public function validate($items, Constraint $constraint) {
    // This is a single-item field so we only need to
    // validate the first item
    $item = $items->first();

    // If there is no value we don't need to validate anything
    if (!isset($item)) {
      return NULL;
    }

    // Check that the value is in the format HH:MM:SS
    if (!preg_match('/^[0-9]{1,2}:[0-5]{1}[0-9]{1}:[0-5]{1}[0-9]{1}$/', $item->value)) {
      // The value is an incorrect format, so we set a 'violation'
      // aka error. The key we use for the constraint is the key
      // we set in the constraint, in this case $incorrectDurationFormat.
      $this->context->addViolation($constraint->incorrectDurationFormat, ['%duration' => $item->value]);
    }
  }
}

পরিশেষে, আমরা আমাদের বাধ্যতা ব্যবহার করতে Drupal এর বলতে চাই field_podcast_durationউপর podcastনোড প্রকার। আমরা এটি এখানে hook_entity_bundle_field_info_alter():

use Drupal\Core\Entity\EntityTypeInterface;

function HOOK_entity_bundle_field_info_alter(&$fields, EntityTypeInterface $entity_type, $bundle) {
  if (!empty($fields['field_podcast_duration'])) {
    $fields['field_podcast_duration']->addConstraint('PodcastDuration');
  }
}

যদি আপনার ক্ষেত্রটি বৈধ করতে আপনার অন্যান্য ক্ষেত্রের মানগুলির প্রয়োজন হয় তবে আপনি সামগ্রীর ধরণের ক্ষেত্রে একটি সীমাবদ্ধতা যুক্ত করতে পারেন। এই ব্লগ পোস্টে দেখুন: lakshminp.com/entity-validation-drupal-8-part-2
ummdorian

1
D8 ফর্ম বৈধকরণ এপিআই এখানে Drupal.org- এ বিশদভাবে ব্যাখ্যা করা হয়েছে। একটি কাস্টম বৈধতার সীমাবদ্ধতা সরবরাহ করছে
সুখজিন্দর সিং

1
যেহেতু এই প্রশ্নটি ক্ষেত্রের এপিআই নয়, ফর্ম এপিআই সম্পর্কে, তাই কোনও কীভাবে এই সীমাবদ্ধতাটি কোনও ফর্ম উপাদান (কোনও সত্তার ক্ষেত্র নয়) এর সাথে সংযুক্ত করে?
অ্যারোনবাউমন

ফর্ম উপাদানগুলির সীমাবদ্ধতা থাকতে পারে না। আপনি # এলিমেট_এলডিট ব্যবহার করে একটি নির্দিষ্ট ফর্ম উপাদানটিতে বৈধতা যুক্ত করতে পারেন। এই থ্রেডে শীর্ষ উত্তর দেখুন - এটা D8 একই কাজ করে যেমন D7 drupal.stackexchange.com/questions/86990/...
Jaypan

নিশ্চিত হয়ে নিন যে $item = $items->first();কিছু না থাকলে আপনি NUL যাচাই বাছাই করেছেন বা অন্যথায় ফিল্ড সম্পাদনা করার সময় আপনি মারাত্মক ত্রুটি পাবেন: প্রকারের ত্রুটি: আর্গুমেন্ট 2 ড্রুপাল \ উপাদান \ ইউটিলিটি \ নেস্টেড অ্যারে :: getValue () অবশ্যই অ্যারের হতে হবে, নাল দেওয়া, ড্রুপাল \ উপাদান \ ইউটিলিটি \ নেস্টেডআরাই :: getValue () (কোর / লিবিব / দ্রুপাল / কম্পোনেন্টের লাইন 69) -র 407 নং লাইনে / ডেটা / অ্যাপ / কোর / লিবি / দ্রুপাল / কোর / ফিল্ড / উইজেটবেস.এফপি বলা হয় /Utility/NestedArray.php)।
ইভান জুগেক

16

নোডের মতো সামগ্রী সত্তার জন্য এটি করার সঠিক উপায় হ'ল এটি সীমাবদ্ধতা হিসাবে নিবন্ধন করা।

দেখছি forum_entity_bundle_field_info_alter()আর কি মিলছে? ForumLeafবৈধকরণের সীমাবদ্ধতা (নোট করুন যে দুটি শ্রেণি প্রয়োজন)

এটি প্রথমে কিছুটা জটিল, তবে সুবিধাটি হ'ল এটি বৈধতা API এ সংহত হয়েছে, সুতরাং আপনার বৈধতাটি ফর্ম সিস্টেমে সীমাবদ্ধ নয় তবে উদাহরণস্বরূপ, আরইএসটি এপিআইয়ের মাধ্যমে জমা দেওয়া নোডগুলির সাথেও কাজ করতে পারে।


ভাল পয়েন্ট: যারা ড্রুপাল for এর জন্য কোড লিখতেন তাদের পক্ষে এটি নতুন কিছু I
কিমলালুনো

Berdir: আমি বাস্তবায়ন করতে চেষ্টা করে এই অপশনটি অন্বেষণ করেনি hook_entity_bundle_field_info_alter()(হিসাবে বর্ণনা এখানে :) কিন্তু তা কখনো কাজ ... এই হুক সঙ্গে একটি নথিভুক্ত সমস্যা হয়েছে বলে মনে drupal.org/node/2346347
এঙ্গুলার শেফ

কিছু সমস্যা আছে তবে আমি মনে করি না যে সেগুলি আপনার সমস্যার সাথে সম্পর্কিত। ফোরাম.মডিউল দেখায় যে এটি কাজ করে। আপনার কোডটি ভাগ করুন, অন্যথায় আপনার প্রয়োগে সম্ভাব্য সমস্যাগুলি দেখানো সম্ভব নয়।
বারদির

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

যদি আমাদের বিদ্যমান বৈধতা to দ্রুপাল \ ব্যবহারকারী \ ফর্ম \ ব্যবহারকারীলোগিনফর্ম :: বৈধপত্রনাম () এর মতো যুক্ত করতে হয় তবে কী হবে। ডি 7-তে এটি সহজ ছিল $ ফর্ম ['# বৈধতা'] = অ্যারে ('ব্যবহারকারী_লগিন_নাম_ডিয়ালিটি', 'মায়োথর_ভ্যালিডিয়ন',); কিন্তু মনে হচ্ছে নো contrib মডিউল বাস্তবায়িত এই পরিবর্তনগুলি drupal.org/node/2185941
kiranking

8

আমি এই বিষয়ে আরও কিছু আলো যোগ করতে চাই। বৈধতা যুক্ত করা ঠিক আগের মতো: হুক_ফর্ম_ল্টারে:

$form['#validate'][] = '_form_validation_number_title_validate';

বৈধতা ফাংশনে $ form_state এর অভ্যন্তরের মান অবজেক্টের ব্যবহার যদিও কিছুটা আলাদা। উদাহরণ:

function _form_validation_number_title_validate(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {

  if ($form_state->hasValue('title')) {
     $title = $form_state->getValue('title');

     if (!is_numeric($title[0]['value'])) {
        $form_state->setErrorByName('title', t('Your title should be number'));
     }

  }
}

সুতরাং ব্যক্তিগত ভেরিয়েবল অবজেক্টের সরাসরি অ্যাক্সেসের সাথে নয়, বরং গেটর ফাংশন দিয়ে।

আরও তথ্যের জন্য আপনি আমার গিথুব এ একটি সম্পূর্ণ উদাহরণ দেখতে পাচ্ছেন: https://github.com/flesheater/drupal8_modules_experiments/blob/master/webham_formediaation/webham_formomotation.module

চিয়ার্স!


প্রকৃতপক্ষে এটা. ঠিক যেমন আমি উপরের আমার মন্তব্যে লিখেছি। ;)
অ্যাঙ্গুলার শেফ

7

এটি ডি 7 এর মতোই একই রকম। একটি সম্পূর্ণ উদাহরণ:

mymodule.module :

use Drupal\Core\Form\FormStateInterface;

/**
 * Implements hook_form_FORM_ID_alter() for the FORM_ID() form.
 */
function mymodule_form_FORM_ID_alter(&$form, FormStateInterface $form_state, $form_id) {
  $form['#validate'][] = '_mymodule_form_FORM_ID_validate';
}

/**
 * Validates submission values in the FORM_ID() form.
 */
function _mymodule_form_FORM_ID_validate(array &$form, FormStateInterface $form_state) {
  // Validation code here
}

এটি বেশ কাছাকাছি। কেবলমাত্র hook_form_FORM_ID_alterফর্ম আইডি প্রয়োজন। আপনার পছন্দসই বৈধতা ফাংশনটি আপনার পছন্দসই কিছু হতে পারে। এছাড়াও, যথাযথ পরামিতিগুলির জন্য এখানে API গাইড অনুসরণ করুন ।
মাইকডটেক্সে

তার আগে, কীভাবে ফর্ম আইডি পাবেন, এই কোডটি কোথায় চেক করবেন।
লোগেশ্বরন

3

এই ভাল উত্তরের পরিপূরকগুলিতে আমি যুক্ত করব:

$form['#validate'][] = 'Drupal\your_custom_module_name\CustomClass::customValidate';

ফর্ম বৈধতার জন্য এটি কীভাবে একটি দূরবর্তী শ্রেণি পদ্ধতিতে কল করা যায়। আমি মনে করি এটি দেওয়া উদাহরণের মতো মডিউল ফাইলে উপরের ফাংশনটি কল করার পরে এটি আরও ভাল।


ওও থেকে পদ্ধতিগত কোডে ঝাঁপিয়ে পড়ার দরকার নেই।
কোলান

1

আপনি ক্লায়েন্টাইড বৈধকরণ মডিউলটি ব্যবহার করতে পারেন । এটি সম্পর্কে আরও কিছু বিশদ (এর প্রকল্প পৃষ্ঠা থেকে):

... সব ধরনের ওয়েবফর্মগুলি ব্যবহার করার জন্য clientside বৈধতা (ওরফে "আয়াক্স ফর্ম যাচাইকরণ") যোগ jquery.validate । অন্তর্ভুক্ত jquery.uthorate.js ফাইলটি প্যাচ করা হয়েছে কারণ খালি বার্তাগুলি গোপন করতে আমাদের সক্ষম হওয়া দরকার।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.