प्रोग्राम क्षेत्र के मान को अद्यतन करें


14

जब नोड अपडेट होता है तो मैं नोड फ़ील्ड के मान को अपडेट करना चाहता हूं।

यहां बताए गए कोड का उपयोग करने की कोशिश की गई प्रोग्राम नोड नोड 8 को अपडेट कर रहा है

use Drupal\node\Entity\Node;

    function hello_world_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {

      $check = \Drupal::routeMatch()->getParameter('node');

      if ($check) {
      $node = Node::load($check->nid->value);
      $node->title->value = 'testing';     //set value for field
      $node->save();
      }
    }

लेकिन यह काम नहीं करता। मुझे नोड बचाने के बाद 500 त्रुटि मिलती है। मैं भी अगर बयान लेने की कोशिश की और एक नोड आईडी निर्दिष्ट$node = Node::load(1);

मैंने ड्रुपल 8 में प्रोग्राम नोड / अपडेट को अपडेट करने की कोशिश की

use Drupal\node\Entity\Node;


function hello_world_node_update(Drupal\node\NodeInterface $node) {

$node = Node::load(1);
$node->set("title", 'New value'); // also tried $node->setTitle('The new Title');
$node->save();

}

लेकिन कोई किस्मत भी नहीं।

इसके अलावा, मैंने अलग-अलग हुक का उपयोग करने का प्रयास किया_कांड, इकाई_अपडेट, नोड_अपडेट, लेकिन इससे कोई फर्क नहीं पड़ा।

जवाबों:


25

आप इस कोड को आज़मा सकते हैं:

function MODULE_NAME_node_presave(Drupal\node\NodeInterface $node) {
  $node->setTitle('new Title');
  $node->set('body', 'this is body');
}

इस काम के लिए धन्यवाद, अगर कोई अन्य संभव बदलाव जोड़ना चाहता है, तो बेझिझक एक और उत्तर जोड़ें।
No Sssweat

1
@ नोव्स्वाइट: क्या मैं यह मानने के लिए सही हूं कि इस उत्तर में दिखाए गए कोड में "निकाय" वाली लाइन वास्तव में आपके प्रश्न का उत्तर देने की आवश्यकता नहीं है? और यह रेखा यह दर्शाती है कि आप इसी तरह की चीजों के साथ कैसे कर सकते हैं (जैसे) शरीर? इसके अलावा, चूंकि आपका प्रश्न एक "फ़ील्ड" के बारे में था, तो क्या आप कस्टम फ़ील्ड के लिए "बॉडी" के साथ मशीन के नाम के समान लाइन का उपयोग कर सकते हैं, जो (name) फ़ील्ड_my_extra_field के साथ है? नए प्रश्न पूछने के उत्तर को अपहृत करने के रूप में जो प्रतीत होता है, उसके लिए क्षमा करें, लेकिन एक उत्तर में (बिल्कुल नहीं स्पष्टीकरण के साथ) "कोड दिखा रहा है" या तो यहां एक अच्छा अभ्यास नहीं माना जाता है, है ना?
पियरे.विरेंस

1
@ पियरे.वीयरन्स मैंने अपने क्यू में सादगी के लिए शीर्षक का उपयोग किया। मुझे लगा कि अगर मुझे पता है कि शीर्षक को कैसे बदलना है, तो यह किसी भी क्षेत्र के लिए समान होगा, बस मशीन का नाम बदलना होगा। पता चला कि यह उत्तर शीर्षक बदलने के लिए एक विशिष्ट विधि का उपयोग करता है, जो किसी अन्य क्षेत्र के लिए काम नहीं करेगा, इसलिए यह वास्तव में महत्वपूर्ण है कि वह शरीर के लिए विधि दिखाता है।
बजे कोई Sssweat

मैं इस हुक को आग में नहीं डाल सकता। मैं एक सामग्री प्रकार संपादित करता हूं, सबमिट पर क्लिक करता हूं, लेकिन कुछ भी नहीं।
श्री पाब्लो

7

यह हुक का उपयोग करने के साथ एक और भिन्नता है जिसे आपने मूल रूप से उपयोग करने की कोशिश की थी।

मुझे लगता है कि आपके कोड के साथ समस्या यह है कि आप नोड के एक नए उदाहरण को लोड करने का प्रयास करते हैं, लेकिन आपको उस नोड का उपयोग करना चाहिए जो पैराट्रेटर के रूप में प्रदान किया गया है $entity:

use Drupal\node\NodeInterface;

function hello_world_entity_presave(Drupal\Core\Entity\EntityInterface $entity)   {
  if ($entity instanceof NodeInterface) {
    $entity->title->value = 'testing';     //set value for field
    // $entity->save(); (not needed)
  }
}

संपादित करें:

कोड में उपयोग कथन जोड़ा गया।


1
बस अपने कोड की कोशिश की, लेकिन यह साइट को तोड़ रहा है, क्लासिक हो रहा हैThe website encountered an unexpected error. Please try again later.
नहीं Sssweat

1
यह कोड केवल यह प्रदर्शित करने के लिए है कि हुक का उपयोग कैसे किया जाए। आपको सही उपयोग कथन की आवश्यकता है। अगर आप वॉचडॉग (/ व्यवस्थापक / रिपोर्ट / dblog) में देखते हैं, तो आप इसका पता लगा सकते हैं।
4k4

1
use Drupal\node\NodeInterface;कोड जोड़ने से अब ऑटो साइट नहीं टूटती है, लेकिन नोड को सहेजने के बाद, मुझे 500 त्रुटि मिलती है जैसे मुझे अपने प्रश्न में मिल रही थी और लॉग इसके बारे में कुछ भी लॉग नहीं कर रहा है।
नहीं Sssweat

1
मैं केवल इस समस्या को इंगित करना चाहता था: नोड का एक नया उदाहरण लोड न करें, लेकिन फ़ंक्शन पैरामीटर के रूप में दिए गए एक का उपयोग करें। 500 के पीछे क्या त्रुटि है? कृपया अपनी लॉग फ़ाइलों की जाँच करें या त्रुटि लॉगिंग पर स्विच करें।
4k4

1
मैंने लॉग साफ़ कर दिया है, इसलिए मैं अन्य सभी पिछली त्रुटियों से भ्रमित नहीं हूं, लेकिन त्रुटि को सहेजने और प्राप्त करने के बाद कई बार लॉग फाइल खाली होने पर
नहीं Sssweat

3

Drupal 8 में शीर्षक मानक क्षेत्रों की तरह सेट नहीं हैं; उनका अपना कार्य है। $node->setTitle('New Title');एक नोड के लिए या $entity->setLabel('New Title');एक सामान्य इकाई के लिए उपयोग करें । अधिक जानकारी के लिए Node :: setTitle देखें ।

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