Hook_menu Drupal 7 — मॉड्यूल के माध्यम से पृष्ठों का निर्माण
पिछले पाठ में हमने सीखा कि कैसे Drupal API की मदद से डेटाबेस से जानकारी प्रदर्शित की जाती है, विशेष रूप से hook_block_info() और hook_block_view() हुक्स का उपयोग करके। इस पाठ में हम पृष्ठों को प्रदर्शित करना सीखेंगे, अर्थात् hook_menu का उपयोग करके पृष्ठ को Drupal की अन्य इकाइयों जैसे मेनू, अनुवाद मॉड्यूल, टेम्पलेट आदि से जोड़ना सीखेंगे।
आइए सबसे सरल उदाहरण से शुरू करें — एक ऐसा पृष्ठ बनाएं जो नवीनतम 10 समाचारों के शीर्षक और उनका विवरण प्रदर्शित करे। इस प्रकार हमारे पास एक छोटी न्यूज़ फीड तैयार होगी। हम hook_menu() हुक का उपयोग करेंगे। नीचे इसका विवरण दिया गया है, और उसके बाद हम इसका प्रयोग करेंगे।
hook_menu()
यह मेनू आइटम को परिभाषित करता है और एक पृष्ठ लौटाता है।
यह हुक, जब किसी मॉड्यूल में बुलाया जाता है, तो उस पथ को पंजीकृत करता है जिसे Drupal एक विशिष्ट क्रम में संसाधित करता है। पथ केवल प्रोसेसिंग के लिए पंजीकृत किए जा सकते हैं या उन्हें मेनू में रखा जा सकता है, जैसे कि नेविगेशन मेनू में। पथ और उनसे संबंधित जानकारी को menu router item कहा जाता है। यह हुक बहुत कम बार बुलाया जाता है (उदाहरण के लिए, जब मॉड्यूल सक्षम किया जाता है) और इसका परिणाम डेटाबेस में कैश किया जाता है। इसलिए, जब भी मॉड्यूल में इस हुक में बदलाव किया जाता है, कैश को साफ़ करना आवश्यक होता है।
hook_menu() एक एसोसिएटिव ऐरे लौटाता है, जिसकी कुंजियाँ (keys) पथों को परिभाषित करती हैं और उनके मान (values) प्रत्येक पथ के गुणों के एसोसिएटिव ऐरे होते हैं (जिनका विवरण नीचे दिया गया है)।
हर पथ के लिए परिभाषा में वह पृष्ठ शामिल होता है जो तब लोड होता है जब वह पथ अनुरोधित किया जाता है। यदि कोई अन्य पथ URL के लिए प्रतिक्रिया नहीं देता, तो यह हुक पृष्ठ लौटाता है। उदाहरण के लिए, आपका मॉड्यूल 'abc/def' पथ पंजीकृत कर सकता है।
<?php function mymodule_menu() { $items['abc/def'] = array( 'page callback' => 'mymodule_abc_view', ); return $items; } function mymodule_abc_view($ghi = 0, $jkl = '') { // ... } ?>
जब पथ 'abc/def' अनुरोधित किया जाएगा और URL में कुछ और नहीं लिखा होगा, तो कोई अतिरिक्त आर्ग्युमेंट नहीं भेजा जाएगा। यदि पथ 'abc/def/1/ओम्स्क' अनुरोधित किया जाएगा, तो पृष्ठ को “1” और “ओम्स्क” आर्ग्युमेंट्स के रूप में प्राप्त होंगे। यह बहुत उपयोगी होगा जब हम पृष्ठ टेम्पलेट्स बनाएंगे।
पथ में अतिरिक्त आर्ग्युमेंट्स को एक एसोसिएटिव ऐरे के रूप में परिभाषित किया जा सकता है। यह सूची जटिल और सरल दोनों प्रकार के मान रख सकती है। जब संख्याएँ उपयोग की जाती हैं और callback फ़ंक्शन (वह फ़ंक्शन जो पृष्ठ लौटाता है) बुलाया जाता है, तो संबंधित पथ को उस संख्या से प्रतिस्थापित किया जाता है। उदाहरण के लिए, पहला आर्ग्युमेंट arg(0) के माध्यम से, दूसरा arg(1) के माध्यम से प्राप्त किया जा सकता है, और इसी तरह।
<?php function mymodule_menu() { $items['abc/def'] = array( 'page callback' => 'mymodule_abc_view', 'page arguments' => array(1, 'foo'), ); return $items; } ?>
जब पथ 'abc/def' बुलाया जाएगा, तो लौटाया गया पृष्ठ “def” को पहले आर्ग्युमेंट और हमेशा “foo” को दूसरे आर्ग्युमेंट के रूप में उपयोग करेगा। हुक का पूर्ण विवरण आप इस पृष्ठ पर देख सकते हैं: http://api.drupal.org/api/drupal/modules--system--system.api.php/function/hook_menu/7
अब एक साधारण पृष्ठ बनाएँ:
function sitemade_menu(){ $items = array(); // हमारे मेनू आइटम्स का ऐरे इनिशियलाइज़ करें $items['page_example'] = array( // पथ 'page_example' पर पेज जोड़ें 'title' => 'पेज का उदाहरण', // पेज का शीर्षक 'description' => 'साधारण पेज', // पेज का विवरण 'page callback' => '_page_example', // वह फ़ंक्शन जो पेज की सामग्री लौटाता है 'access callback' => TRUE, // सभी को इस पेज को देखने की अनुमति दें 'expanded' => TRUE, ); return $items; // पेजों की सूची लौटाएँ } function _page_example($content = NULL) { $content = ''; // खाली कंटेंट वेरिएबल इनिशियलाइज़ करें $query = db_select('node_revision', 'n'); // 'node_revision' टेबल चुनें जिसमें दस्तावेज़ का वर्तमान संशोधन होता है $query->innerJoin('field_revision_body', 'b', 'b.revision_id = n.vid'); // 'field_revision_body' टेबल जोड़ें जिसमें body होता है $query->innerJoin('node', 'd', 'n.nid=d.nid'); // 'node' टेबल जोड़ें जिसमें नोड का शीर्षक होता है $query->fields('n', array('title'), array('nid'), array('vid')); // फील्ड्स चुनें $query->fields('b', array('body_value')); $query->condition('d.type', 'news'); // केवल 'news' प्रकार के कंटेंट का चयन करें $query->orderBy('n.timestamp', 'DESC'); // नवीनतम समाचार पहले दिखाएँ $query->range(0, 10); // केवल 10 नवीनतम रिकॉर्ड चुनें $result = $query->execute(); // क्वेरी निष्पादित करें while($nodes = $result->fetch()){ // परिणामों को संसाधित करें $content .= '<h3>' . $nodes->title . '</h3>'; // शीर्षक प्रदर्शित करें $content .= $nodes->body_value; // body प्रदर्शित करें } return $content; // तैयार कंटेंट लौटाएँ }
आप हुक की type विशेषता का उपयोग करके यह निर्धारित कर सकते हैं कि पृष्ठ किस मेनू में प्रदर्शित होगा — जैसे कि एडमिन मेनू या मुख्य (main) मेनू।
आइए ऐसा करें:
function sitemade_menu(){ $items = array(); // हमारे मेनू आइटम्स का ऐरे इनिशियलाइज़ करें $items['page_example'] = array( // पथ 'page_example' पर पेज जोड़ें 'title' => 'पेज का उदाहरण', // पेज का शीर्षक 'description' => 'साधारण पेज', // पेज का विवरण 'page callback' => '_page_example', // वह फ़ंक्शन जो पेज की सामग्री लौटाता है 'access callback' => TRUE, // सभी को देखने की अनुमति दें 'expanded' => TRUE, 'type' => MENU_NORMAL_ITEM, 'menu_name' => 'main-menu', ); return $items; // पेजों की सूची लौटाएँ }
कैश को साफ़ करें, और अब इस पृष्ठ के लिए मेनू में एक लिंक दिखाई देगा।
साधारण मेनू आइटम्स के अलावा, आप Drupal एडमिन क्षेत्र में भी एक पृष्ठ जोड़ सकते हैं:
function sitemade_menu(){ $items = array(); // हमारे मेनू आइटम्स का ऐरे इनिशियलाइज़ करें $items['admin/config/content/page_example'] = array( // पथ 'admin/config/content/page_example' पर पेज जोड़ें 'title' => 'पेज का उदाहरण', // पेज का शीर्षक 'description' => 'साधारण पेज', // पेज का विवरण 'page callback' => '_page_example', // वह फ़ंक्शन जो पेज की सामग्री लौटाता है 'access arguments' => array('administer site configuration'), // केवल एडमिन के लिए अनुमति सेट करें ); return $items; // पेजों की सूची लौटाएँ }
अब यह पृष्ठ केवल एडमिन के लिए प्रदर्शित होगा, और इसका लिंक एडमिन क्षेत्र में दिखाई देगा:
एडमिन क्षेत्र में लिंक इसलिए दिखाई देता है क्योंकि Drupal स्वचालित रूप से admin/config/content/* पथ के तहत लिंक जोड़ता है। यदि हम पथ admin/config/people/* का उपयोग करें, तो लिंक “यूज़र” अनुभाग में दिखाई देगा (जहाँ * को अपने पृष्ठ के नाम से बदल सकते हैं, जैसे कि page_example)।
अब हम ब्लॉक्स और पेज बनाना सीख चुके हैं। मेरा मानना है कि ये कंटेंट प्रदर्शित करने के लिए सबसे बुनियादी हुक्स हैं, जो आपके मॉड्यूल्स में अक्सर उपयोग किए जाएँगे।
अगले पाठ में हम hook_perm() का अध्ययन करेंगे, जिससे उपयोगकर्ताओं के लिए नई अनुमतियाँ (permissions) बनाई जा सकेंगी।