अब तक, मैं ड्रुपल 7 में इन 3 कार्यों में आया था, लेकिन मुझे वास्तव में यह निश्चित नहीं है कि उनके बीच अंतर क्या है, और जो ब्लॉक प्रीप्रोसेस फ़ंक्शन में नोड आईडी प्राप्त करने के लिए अधिक उपयुक्त है।
क्या आप मुझे कोई जानकारी दे सकते हैं?
अब तक, मैं ड्रुपल 7 में इन 3 कार्यों में आया था, लेकिन मुझे वास्तव में यह निश्चित नहीं है कि उनके बीच अंतर क्या है, और जो ब्लॉक प्रीप्रोसेस फ़ंक्शन में नोड आईडी प्राप्त करने के लिए अधिक उपयुक्त है।
क्या आप मुझे कोई जानकारी दे सकते हैं?
जवाबों:
मुझे वास्तव में यकीन नहीं है कि उनके बीच क्या अंतर है
menu_get_object()
है। यदि दिखाया जा रहा है पेज example.com/user/1 है, तो menu_get_object('user')
उस उपयोगकर्ता के लिए उपयोगकर्ता ऑब्जेक्ट वापस कर देगा , जिसकी आईडी 1 है। node_load
) की एक सरणी जिसे वर्तमान पथ के एक हिस्से के अनुरूप एक वस्तु लोड करने के लिए कहा जाता है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']
लिए टिप्पणियों के लिए प्रीप्रोसेस फ़ंक्शंस उपलब्ध हैं।
यह Drupal Core के template_preprocess_page में कैसे किया जाता है :
लाइन की थीम 2267.आवेदन और उसके बाद:
if ($node = menu_get_object()) {
$variables['node'] = $node;
}
template_preprocess_page मेनू_get_object का उपयोग करता है । उसके बाद यह जाँचने की बात है कि क्या नोड परिभाषित किया गया है और $ नोड-> nid हो रहा है।
एक चीज जो आपको सावधान करनी है, वह है पथ का नाम।
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];
arg(1);
यह करने का एक बुरा तरीका नहीं है। arg () आंतरिक पथ पर काम करता है, इसलिए यह पथ उपनामों से प्रभावित नहीं होगा।
menu_get_object
(जो बस चारों ओर लपेटता है menu_get_item
ताकि समान रूप से हो)।
if (arg(0) == 'node' && is_numeric(arg(1)))
फिर arg(1)
लगभग 99% तक आप एक नोड आईडी लौटा देंगे। लेकिन पूरी तरह से arg(1)
आपको कई अन्य आईडी भी लौटा सकते हैं।
Drupal 8 में, रूटिंग में क्या है, इसके आधार पर आप url तर्क प्राप्त कर सकते हैं।
अकेले आईडी प्राप्त करने के लिए:
$nid = \Drupal::routeMatch()->getRawParameter('node');
यदि आप नोड ऑब्जेक्ट को लोड करने की योजना बनाते हैं, तो आप इसे इस तरह प्राप्त कर सकते हैं:
$node = \Drupal::routeMatch()->getParameter('node');
पैरामीटर नाम खोजने के लिए, आप उपयोग कर सकते हैं:
$possible_parameters = \Drupal::routeMatch()->getParameters();