मुझे URL से नोड आईडी कैसे मिलेगा?


47

अब तक, मैं ड्रुपल 7 में इन 3 कार्यों में आया था, लेकिन मुझे वास्तव में यह निश्चित नहीं है कि उनके बीच अंतर क्या है, और जो ब्लॉक प्रीप्रोसेस फ़ंक्शन में नोड आईडी प्राप्त करने के लिए अधिक उपयुक्त है।

क्या आप मुझे कोई जानकारी दे सकते हैं?


क्या आप ऐसा कर रहे हैं नोड.tpl.php या ऐसा कुछ? यदि हाँ, तो आप $ nd-> nid का उपयोग कर सकते हैं।
बार्ट

नहीं, मैं इसे ब्लॉक प्रीप्रोसेस फ़ंक्शन में कर रहा हूं, हालांकि ब्लॉक नोड पेज पर मुद्रित होता है।
रेशम एड।

जवाबों:


63

मुझे वास्तव में यकीन नहीं है कि उनके बीच क्या अंतर है

  • menu_get_object () वर्तमान में दिखाए गए पृष्ठ से जुड़ी वस्तु को लौटाता है। यदि ड्रुपल पृष्ठ का उदाहरण दिखा रहा है, तो कोड निष्पादित किया जाता menu_get_object()है। यदि दिखाया जा रहा है पेज example.com/user/1 है, तो menu_get_object('user')उस उपयोगकर्ता के लिए उपयोगकर्ता ऑब्जेक्ट वापस कर देगा , जिसकी आईडी 1 है।
  • menu_get_item () "menu_router" तालिका में शामिल प्रत्येक फ़ील्ड के लिए अनुक्रमणिका युक्त एक सरणी देता है। यह भी शामिल है:
    • पथ: मेनू कॉलबैक का वर्तमान पथ
    • load_functions: फ़ंक्शन नाम (जैसे node_load) की एक सरणी जिसे वर्तमान पथ के एक हिस्से के अनुरूप एक वस्तु लोड करने के लिए कहा जाता है
    • access_callback: कॉलबैक जो जाँचता है कि वर्तमान में लॉग इन उपयोगकर्ता के पास मेनू आइटम है या नहीं
    • page_callback: उस फ़ंक्शन का नाम जो पेज को रेंडर करता है
    • शीर्षक: मेनू आइटम से संबंधित पृष्ठ का शीर्षक
  • drupal_lookup_path () वह फ़ंक्शन है जो आपको एलियास से जुड़े आंतरिक पथ को तर्क के रूप में देता है। यदि "होमपेज" उदाहरण के लिए जुड़ा हुआ उपनाम है, तो फिर drupal_lookup_path("homepage")वापस आ जाएगा "node/1"। पथ उपनाम किसी भी आंतरिक पथ से जुड़े हो सकते हैं, न कि केवल नोड पथ के लिए।

और जो एक ब्लॉक प्रीप्रोसेस फ़ंक्शन में नोड आईडी प्राप्त करने के लिए अधिक विनियोजित है।

यदि आप सभी को वर्तमान में दिखाए गए नोड का नोड आईडी बनाना चाहते हैं, तो आपको बस निम्नलिखित कोड का उपयोग करने की आवश्यकता है:

if (arg(0) == 'node') {
  $nid = arg(1);
}

यदि आपको नोड ऑब्जेक्ट प्राप्त करने की आवश्यकता है, तो आप निम्न कोड का उपयोग कर सकते हैं:

if ($node = menu_get_object()) {
  // Use the node object.
}

उन स्निपेट में से, दूसरा बेहतर है, क्योंकि यह आंतरिक पथ जैसे नोड / 1 / संशोधन / 3 / दृश्य के लिए सही नोड ऑब्जेक्ट देता है।

ध्यान रखें कि कुछ प्रीप्रोसेस फ़ंक्शंस, जैसे कि पेज के लिए वाले, या नोड, पहले से ही ए $variables['node']। इसका मतलब यह है कि उन मामलों में, आपको बस अपने प्रीप्रोसेस फ़ंक्शन में निम्नलिखित स्निपेट का उपयोग करने की आवश्यकता है, बिना इस चिंता के कि किस फ़ंक्शन का उपयोग करना है।

if (isset($variables['node'])) {
  // Check the node ID or other properties.
}

अन्य प्रीप्रोसेस फ़ंक्शंस के लिए, यह देखने के लिए दस्तावेज़ की जाँच करें कि क्या नोड ऑब्जेक्ट युक्त कोई चर है या नहीं। उदाहरण के लिए, वह मामला है template_preprocess_comment()जिसके $variables['node']लिए टिप्पणियों के लिए प्रीप्रोसेस फ़ंक्शंस उपलब्ध हैं।


7

यह Drupal Core के template_preprocess_page में कैसे किया जाता है :

लाइन की थीम 2267.आवेदन और उसके बाद:

if ($node = menu_get_object()) {
    $variables['node'] = $node;
}

template_preprocess_page मेनू_get_object का उपयोग करता है । उसके बाद यह जाँचने की बात है कि क्या नोड परिभाषित किया गया है और $ नोड-> nid हो रहा है।


4

एक चीज जो आपको सावधान करनी है, वह है पथ का नाम।

drupal_get_normal_path($path)

वर्तमान पथ प्राप्त करने के लिए सिस्टम चर का उपयोग करें $_SERVER["REQUEST_URI"]

(यदि आप नोड पेज पर हैं, तो आप कॉल कर सकते हैं $node->uri['path'], यह एक गैर-उपनाम वाला मार्ग लौटाएगा। फिर यदि आप नोड पेज पर हैं, तो आप बस उपयोग कर सकते हैं $node->nid।)

यह नोड / XXXX को लौटा देगा

तो कुछ ऐसा प्रयास करें

  $node_path = explode('/', drupal_get_normal_path($path));
  $nid = $node_path[1];

3
arg(1);

यह करने का एक बुरा तरीका नहीं है। arg () आंतरिक पथ पर काम करता है, इसलिए यह पथ उपनामों से प्रभावित नहीं होगा।


यह सच है, यह पथ उपनामों से प्रभावित नहीं होगा। लेकिन अगर आप नोड / XXXXX पर हैं, तो आप केवल $ नोड-> एनआईडी का उपयोग कर सकते हैं। @ कहीं और, आप arg (1) का उपयोग कहां करेंगे और यह वही होगा जो आप चाहते हैं?
स्ट्राइकर

यदि आप एक मॉड्यूल हुक में हैं, तो आपके पास नोड तक पहुंच नहीं होगी। दृश्य तर्क एक उदाहरण भी हो सकते हैं।
जेरेमी फ्रेंच

धन्यवाद जेरेमी और istryker, मैंने अपना प्रश्न अपडेट किया है यह स्पष्ट हो सकता है .. हालांकि मैं आपके दोनों समाधानों की कोशिश करूँगा, धन्यवाद
रेशम एडमिन

1
यह arg () का उपयोग करने के लिए एक बहुत बुरा विचार है, आप अपने आप को एक पथ के लिए बाध्य कर रहे हैं, उपयोग करें menu_get_object(जो बस चारों ओर लपेटता है menu_get_itemताकि समान रूप से हो)।

if (arg(0) == 'node' && is_numeric(arg(1)))फिर arg(1)लगभग 99% तक आप एक नोड आईडी लौटा देंगे। लेकिन पूरी तरह से arg(1)आपको कई अन्य आईडी भी लौटा सकते हैं।
लीमैनक्स

2

Drupal 8 में, रूटिंग में क्या है, इसके आधार पर आप url तर्क प्राप्त कर सकते हैं।

अकेले आईडी प्राप्त करने के लिए:

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

यदि आप नोड ऑब्जेक्ट को लोड करने की योजना बनाते हैं, तो आप इसे इस तरह प्राप्त कर सकते हैं:

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

पैरामीटर नाम खोजने के लिए, आप उपयोग कर सकते हैं:

$possible_parameters = \Drupal::routeMatch()->getParameters();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.