হুক_ফর্ম_এফএআরএম_আইডি_ল্টারে নোড অবজেক্ট পাওয়া


13

এই প্রশ্নটি অনুসরণ করুন তবে একটি মন্তব্যে স্পষ্টতা জিজ্ঞাসা করার মতো যথেষ্ট খ্যাতি আমার নেই।

আমি দ্রুপাল ৮-তে একটি অবদানযুক্ত মডিউলটি পোর্টিং করছি the উল্লিখিত সিআর এবং পোস্টের স্যজেস্টেড কোডটি কাজ করছে না:

$node = $form_state->getFormObject()->getEntity();

কোনও কিছুই ode নোড ভেরিয়েবলের মধ্যে লোড হয় না।

আমার পিএইচপিএসটর্ম আইডিই getEntity () এর জন্য একটি সতর্কতা দেয়: পদ্ধতি 'getEntity' ক্লাসে পাওয়া যায় নি দ্রুপাল ore কোর \ ফর্ম \ ফর্মআইন্টারফেস কম ... রেফারেন্সযুক্ত পদ্ধতি বিষয় শ্রেণিতে পাওয়া যায় না।

কোড সমাপ্তির জন্যও এই পদ্ধতিটি উপস্থাপন করা হচ্ছে না।

ব্যবহারের কারণে আমি উল্লেখ করছি:

use Drupal\Core\Entity;
use Drupal\Core\Entity\EntityInterface;
use Drupal\node\Entity\Node;
use Drupal\Core\Render\Element;

উত্তর:


13

PhpStorm জানেন না যেহেতু ফর্ম অবজেক্টের ধরণ গতিশীল তবে এটি ঠিক আছে fine

আপনি যদি এটি সুখী করতে চান তবে এটিকে এমন অবস্থায় মোড়ানো করুন:

if ($form_state->getFormObject() instanceof EntityForm) {
  ...
}

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

আপনি আরও নির্দিষ্ট উত্তর চাইলে আপনার সঠিক কোডটি ভাগ করে নেওয়া দরকার, এটাই আমি আপনাকে বলতে পারি।


ধন্যবাদ বারডির আমি সচেতন ছিলাম না ode নোডটি ডি 7-এর মতো নোড অবজেক্ট নয়। সুতরাং $ নোড-> নিড কাজ করে না, তবে $ নোড-> আইডি () করে।
বুন্দিও

7

যদিও সঠিক উত্তরটি বেছে নেওয়া হয়েছে, আমি মনে করি কিছু বিষয় ব্যাখ্যা করার দরকার আছে:

  • পদ্ধতিটি কেবল getFormObject()ধরণের ফর্মগুলিতেই উপলভ্য EntityForm
  • আপনি যদি করছেন hook_form_node_form_alter(), আপনি জানেন যে ফর্মটি সর্বদা নোড ফর্ম, তাই আপনি getEntity()ফর্ম অবজেক্টে নিরাপদে কল করছেন ।
  • তবে, আপনি যদি সাধারণ hook_form_alter()হুক করছেন , আপনি সঠিকটি পরীক্ষা করতে $form_idবা ফর্ম অবজেক্টটি আসলে একটি NodeFormবা একটি কিনা তা পরীক্ষা করতে চাইতে পারেন EntityForm। ফর্মটি কোনও সত্তা / নোড ফর্ম না হলে এটি পিএইচপি ত্রুটিগুলি রোধ করবে।
  • আপনার আইডিই এবং কোড সমাপ্তির জন্য হিসাবে, আপনি আপনার আইডিই বলতে পারেন যে $form_objectআপনার সাথে ডিল থাকা একটি হল NodeFormঅথবা একটি EntityForm। এটি এটি আরও উপযুক্ত ইঙ্গিতগুলি দেখায়।
/** @var \Drupal\Core\Entity\EntityForm $form_object */
$form_object = $form_state->getFormObject();
if ($form_object instanceof EntityForm) {
  $entity = $form_object->getEntity();
  // Do something with the entity.
}

1
তাদের সর্বোত্তম, স্পষ্টতার জন্য ধন্যবাদ!
দাজাগ

2

আপনার আইডিই ভেরিয়েবল টাইপ কি এবং এটি উপলব্ধ কি তা জানতে আপনার ভেরিয়েবলগুলি আপনাকে ইঙ্গিতটি টাইপ করতে হবে।

টাইপ ইঙ্গিতটি হল প্যারামিটার ভেরিয়েবল নামের (নীচে arrayএবং উদাহরণে FormStateInterFace) এর আগে যুক্ত ভেরিয়েবল টাইপ ।

উদাহরণ:

/**
 * On form submit, do something.
 *
 * @param array
 *   The form array.
 *
 * @param \Drupal\Core\Form\FormStateInterface
 *   The form state array.
 */
function _submit_hook_name(array $form, FormStateInterface $form_state) {
  $node = $form_state->getFormObject();
  // Do something...
}

হুক জমা দেওয়ার জন্য আপনার Drupal\Core\Form\FormStateInterfaceটাইপটি ব্যবহার করা উচিত ... সুতরাং ফাইলের শীর্ষে আপনি নিশ্চিত হন যে আপনি সেই শ্রেণিটি ব্যবহার করছেন use Drupal\Core\Form\FormStateInterface;

ড্রুপাল কোডিং মানদণ্ডগুলি জানিয়েছে যে আপনাকে কাস্ট টাইপ করার পাশাপাশি ডকব্লকটিতে প্রকারটি ব্যাখ্যা করা উচিত। অতিরিক্ত প্রচেষ্টা ভবিষ্যতে সহায়তা করে। ;)

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