कैसे प्रोग्राम को वर्तमान नोड का एनआईडी प्राप्त करें


26

मैंने drupal.org पर इस पुराने धागे पर काम किया है और यह मेरे सिर के चारों ओर घूमता है। पथ को नीचे खींचने और उसके भीतर से एनआईडी को बाहर निकालने की कोशिश कर रहा है? कोई बेहतर तरीका ज़रूर होगा।

और जैसे समाधान

global $node;
$nid = $node->nid;

मेरे कस्टम मॉड्यूल में काम न करें (हालांकि मुझे बताया गया है कि वे टेम्प्लेट में काम करते हैं?)। कोई त्रुटि या कुछ भी नहीं, यह सिर्फ $nodeएक NULLमूल्य के साथ तात्कालिकता है ।

ऐसा लगता है कि वास्तव में कुछ स्पष्ट होना चाहिए जो मुझे याद आ रहा है।

तो, आपको सर्वोत्तम तरीकों का पालन करते हुए और यथोचित रूप से मजबूत मॉड्यूल का निर्माण करते हुए, बिना टेम्पलेट के वर्तमान नोड का एनआईडी कैसे मिलता है?

जवाबों:


50

मान लें कि आपका कोड नोड पेज के लिए चल रहा है, तो जिन तरीकों को मैं अक्सर कोर / कंट्रीब्यूट मॉड्यूल में उपयोग करता हूं, वे या तो उपयोग कर रहे हैं menu_get_object()या arg():

if ($node = menu_get_object()) {
  // Get the nid
  $nid = $node->nid;
}

या

if (arg(0) == 'node' && is_numeric(arg(1))) {
  // Get the nid
  $nid = arg(1);

  // Load the node if you need to
  $node = node_load($nid);
}

मैं व्यक्तिगत रूप से पहली विधि पसंद करता हूं (भले ही कुछ लोगों द्वारा स्थिति में असाइनमेंट को एक अच्छा विचार नहीं माना जाता है), लेकिन दोनों पूरी तरह से मान्य हैं।


1
@Letharion हाँ मुझे लगता है सिर्फ एक छोटा सा दोषी हर बार मैं यह कर;)
क्लाइव

1
@beth आप इसे किस फ़ंक्शन से बुला रहे हैं? और क्या यह निश्चित रूप से एक नोड पेज है जिस पर आप इसे कॉल कर रहे हैं?
क्लाइव

1
@ बीथ वे 100% सक्षम पथ निर्माण के साथ काम करेंगे। Path aliasing का मेनू आइटम के राउटर पथ से कोई लेना-देना नहीं है , जो है node/1, node/2आदि। यदि आपको अभी भी परेशानी हो रही है तो आपके द्वारा उपयोग किए जा रहे सटीक कोड के साथ एक और प्रश्न पोस्ट करने के लायक हो सकता है, और थोड़ा संदर्भ प्रदान करें। तब हम यह इंगित करने में सक्षम हो सकते हैं कि समस्या कहाँ हो रही है
क्लाइव

1
एक सिंगल लाइन सॉल्यूशन$nid = ($node = menu_get_object()) ? $node->nid : NULL;
timofey.com

3
@sheldonkreger नोड उस बिंदु से पहले से ही लोड है, menu_get_object()(या यहां तक ​​कि node_load()) केवल इसे स्थिर कैश से प्राप्त कर रहा है। यहां तक ​​कि अगर आप इसे जल्दी बुलाते हैं, तो यह अभी भी एक कोर मॉड्यूल द्वारा बाद में पेज बिल्ड (जैसा कि यह एक नोड पेज है) पर लोड होने जा रहा है, उस स्थिति में आप अगली प्रक्रिया के लिए स्थैतिक कैश को गर्म कर देंगे
क्लाइव

5

Arg () अब काम नहीं करता है के बाद से Drupal 8 में ऐसा करने का सबसे आसान तरीका:

$path_args = explode('/', current_path());
print $path_args[1];

रिकॉर्ड बदलें


2
यह Drupal 7 में भी काम करता है। हालाँकि, यदि आप एक ऐसे पेज पर हैं, जो कोई नोड नहीं है, जैसे कि व्यवस्थापक / संरचना / ब्लॉक, तो आपको एक अमान्य मान प्राप्त होगा (इस मामले में, 'संरचना')। बस यह देखने के लिए जांचें कि क्या path_args [1] पूर्णांक है और आप शायद ठीक हैं।
शेल्डोन्क्रेगर

आप संभवतः विस्फोट के बजाय arg (1) का उपयोग करना चाहेंगे, क्योंकि यह पहले से ही आपके लिए कर चुका है: api.drupal.org/api/drupal/includes%21bootstrap.inc/function/arg-…
RobLoach

1
@RobLoach लेकिन arg () D8 में मौजूद नहीं है
Pouya Sanooei


1

इस लिंक ने मेरी मदद की: http://www.webomelette.com/node-id-nid-url-path-alias - सामग्री पर जाएं और जिस सामग्री को आप नोड आईडी देखना चाहते हैं, उसे संपादित करने के लिए फ़िल्टर को डाउन करें और संपादित करें पर होवर करें संपर्क। हाइपरलिंक देखने के लिए नीचे देखें, आपका ब्राउज़र बताता है कि यदि आप संपादन पर क्लिक करते हैं तो यह उसका अनुसरण करेगा।


हाय एना, ड्रुपल आंसर में आपका स्वागत है। आपका उत्तर अच्छा है (और मैंने इसे प्रयास के लिए वोट दिया है), हालांकि सवाल यह पूछ रहा है कि शीर्षक में 'मॉड्यूल से' शामिल होने के बाद से प्रोग्राम को कैसे प्राप्त किया जाए।
Darvanen

1

वर्तमान में स्वीकृत उत्तर में दूसरी विधि डी 7 में सबसे साफ है। पहला जवाब:

if ($node = menu_get_object()) {
  // Get the nid
  $nid = $node->nid;
}

केवल नेत्रहीन क्लीनर है। वास्तव में, menu_get_object()काफी कोड बुला रहा है और अप्रत्याशित त्रुटियां हो सकती हैं। मैं इसे एक hook_node_grants()फ़ंक्शन के अंदर उपयोग कर रहा था और एक PHP घातक त्रुटि में भाग गया:

अधिकतम '256' के फंक्शन नेस्टिंग स्तर पर पहुंच गया, गर्भपात!

स्पष्टीकरण, /drupal//a/69232/9158 पर पाया गया

अनंत लूप जो आप देख रहे हैं, वह इस तथ्य के कारण होता है कि menu_get_object()Drupal के कारण वर्तमान में लॉग-इन किए गए उपयोगकर्ता को सत्यापित करने के लिए नोड तक पहुंच है, जो आपके कार्यान्वयन को hook_node_grants()फिर से लागू करने का कारण बनता है , जो कॉल करता है menu_get_object(), जो आपके कार्यान्वयन को hook_node_grants()फिर से लागू करने का कारण बनता है। , कौन कौन से...

यह दूसरी विधि का उपयोग करके हल किया गया था:

if (arg(0) == 'node' && is_numeric(arg(1))) {
  // Get the nid
  $nid = arg(1);

  // Load the node if you need to
  $node = node_load($nid);
}

1

D8 में:

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

बेहतर आउटपुट को ड्रुपल.स्टैकएक्सचेंज . com/a/145826/15055 में दिखाया गया है । और यह भी ध्यान दें कि यह नोड पूर्वावलोकन पृष्ठों और नोड संशोधन पृष्ठों पर काम नहीं करेगा।
लीमैनक्स

-1

D7 में एक और विकल्प:

function _my_module_get_nid() {
  $path_args = explode('/', current_path());
  //$nid = $path_args[1];
  if(is_int($path_args)) {
    return($path_args[1]);
  }
  // Log that we failed to load a NID.
  else {
    watchdog('my_module', 'Unable to gather NID at: ' . current_path(),  WATCHDOG_WARNING, NULL);
  return FALSE;
  }
}

यदि आप अपने मॉड्यूल के बाहर फ़ंक्शन का उपयोग करने की योजना बनाते हैं, तो फ़ंक्शन के नाम की शुरुआत पर अग्रणी _ का उपयोग न करें।


1
यह एक ही बात है, लेकिन सभी रास्तों पर एक महंगी प्रहरी कॉल के साथ जो नोड्स नहीं हैं।
beth

मुझे यह जानना पसंद है कि क्या मेरा कोड अप्रत्याशित रूप से विफल हो रहा है। मैं नहीं चाहूंगा कि इस कोड को गैर-नोड्स पर निष्पादित किया जाए, वॉचडॉग मुझे दिखाएगा कि ऐसा कहां हो रहा है इसलिए मैं इसे ठीक कर सकता हूं। अन्यथा मेरे पास कोई निशान नहीं होगा कि यह कोड बिना किसी कारण के चल रहा है (गैर-नोड्स पर)। अन्यथा यह डी 8 विधि के समान है।
शेल्डोन्क्रेगर

-1
<?php
if (isset($node->nid) && count($node->nid) > 0){
  $mynodeid = $node->nid;
}
?>

क्या आप कृपया अपने उत्तर में कुछ "whys" और "hows" जोड़ सकते हैं? कोड-केवल उत्तर काम कर सकता है, लेकिन यह शायद ही आपकी गलतियों को समझने में मदद करता है।
मोलॉट

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