नोड ऑब्जेक्ट को hook_form_FORM_ID_alter में प्राप्त करना


13

इस सवाल का पालन करें, लेकिन मेरे पास एक टिप्पणी में स्पष्टीकरण पूछने के लिए पर्याप्त प्रतिष्ठा नहीं है।

मैं Drupal 8 में एक योगदानित मॉड्यूल को पोर्ट कर रहा हूं। उपरोक्त सीआर और पोस्ट पर मुकदमा कोड काम नहीं कर रहा है:

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

कुछ भी $ नोड चर में लोड नहीं किया गया है।

मेरा PHPStorm IDE getEntity () के लिए चेतावनी देता है: विधि 'getEntity' को Drupal \ Core \ Form \ Form \ Interface कम में नहीं मिली ... संदर्भित विधि विषय वर्ग में नहीं मिली है।

यह कोड पूरा होने के लिए भी इस विधि को प्रस्तुत नहीं कर रहा है।

उपयोग के कारण मैं संदर्भित कर रहा हूँ:

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

जवाबों:


13

PhpStorm को नहीं पता है कि किस प्रकार की फॉर्म ऑब्जेक्ट गतिशील है लेकिन यह ठीक है।

यदि आप इसे खुश करना चाहते हैं, तो इसे इस स्थिति में लपेटें:

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

किसी भी तरह से, यह निश्चित रूप से काम करना चाहिए यदि आप सही फॉर्म परिवर्तन को लागू करते हैं। यदि आप नहीं करते हैं, तो आपको एक नोड ऑब्जेक्ट के बिना न केवल एक घातक त्रुटि के साथ समाप्त होना चाहिए।

यदि आपको अधिक विशिष्ट उत्तर चाहिए तो आपको अपना सटीक कोड साझा करना होगा, यही सब मैं आपको बता सकता हूं।


धन्यवाद बरदीर। मुझे नहीं पता था कि $ नोड D7 की तरह नोड ऑब्जेक्ट नहीं है। तो $ नोड-> एनआईडी काम नहीं करता है, लेकिन $ नोड-> आईडी () करता है।
बुंदियो

7

यद्यपि सही उत्तर चुना गया है, मुझे लगता है कि कुछ चीजों की व्याख्या करने की आवश्यकता है:

  • विधि getFormObject()केवल प्रकार के रूपों पर उपलब्ध है EntityForm
  • यदि आप कर रहे हैं hook_form_node_form_alter(), तो आप जानते हैं कि फॉर्म हमेशा एक नोड फॉर्म है, इसलिए आप getEntity()फॉर्म ऑब्जेक्ट पर सुरक्षित कॉल कर रहे हैं ।
  • हालाँकि, यदि आप सामान्य hook_form_alter()हुक कर रहे हैं, तो आप सही $form_idया जाँच करना चाहते हैं कि क्या फॉर्म ऑब्जेक्ट वास्तव में ए NodeFormया ए है EntityForm। यह PHP त्रुटियों को रोक देगा यदि प्रपत्र एक इकाई / नोड रूप नहीं है।
  • अपने आईडीई और कोड के पूरा होने के लिए, आप अपनी आईडीई को बता सकते हैं कि $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

आपकी IDE के लिए यह जानना कि चर प्रकार क्या है और इसके लिए क्या उपलब्ध है, आपको अपने चर को संकेत देने की आवश्यकता है।

प्रकार संकेत पैरामीटर चर नाम (नीचे उदाहरण में 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;

Drupal कोडिंग मानकों में कहा गया है कि आपको डॉकब्लॉक में टाइप के साथ-साथ कास्ट भी लिखना चाहिए। अतिरिक्त प्रयास भविष्य में मदद करता है। ;)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.