मुझे हुक_मेनू () कैसे लागू करना चाहिए?


103

लागू करने के मूल सिद्धांत क्या हैं hook_menu()?

मैं एक ही सवाल में शामिल मूल बातें देखना चाहता हूं, एक ही तरह के लेकिन अलग-अलग सवालों के जवाब देने से बचने के लिए।

जवाबों:


148

यह जानकारी Drupal 6 और 7 के लिए मान्य है। Drupal 8 में, नए रूटिंग सिस्टमhook_menu() को बदल दिया गया है । नीचे हम hook_menu()तीन सरल चरणों में लागू करते हैं ।

पहला कदम

खाली मॉड्यूल बनाने के निर्देशों के बाद एक खाली मॉड्यूल बनाएं । यहां दिखाए गए कोड में, यह मान लिया गया है कि मॉड्यूल का नाम हेलोवर्ल्ड है

दूसरा चरण

मॉड्यूल फ़ाइल में निम्न कोड जोड़ें।

/**
 * Implements hook_menu().
 */
function helloworld_menu() {
  $items['hello'] = array(
    'title' => 'Hello world!',
    'page callback' => 'helloworld_page',
    'access callback' => TRUE,
  );

  return $items;
}

/**
 * Page callback for /hello.
 */
function helloworld_page() {
  return 'Hello world!';
}

तीसरा कदम

मॉड्यूल को सक्षम करें, और http://example.com/hello पर जाएं । (अपने सर्वर के डोमेन नाम के साथ example.com बदलें।)
आपको "हैलो वर्ल्ड!" संदेश देखना चाहिए। बस! आपके पास पूरी तरह से hook_menu()कार्यान्‍वयन है। विभिन्न प्रकार के और अधिक उन्नत विषय निम्नलिखित हैं hook_menu()। विशेष रूप से, आप अनुमतियों के बारे में पढ़ना चाह सकते हैं, क्योंकि ऊपर का पृष्ठ किसी के द्वारा देखा जा सकेगा।

तर्क

यदि आप पृष्ठ कॉलबैक में अधिक डेटा पास करना चाहते हैं, तो आप इसे प्राप्त करने के लिए पेज तर्क का उपयोग कर सकते हैं। पेज कॉलबैक पर पास करने के लिए पेज आर्ग्युमेंट का एक प्रकार का तर्क होना चाहिए। यदि पूर्णांक का उपयोग एक तर्क के रूप में किया जाता है तो यह URL के एक भाग का प्रतिनिधित्व करेगा, 0 से शुरू होकर, प्रत्येक स्लैश (/) के लिए एक बार बढ़ा हुआ। निम्नलिखित उदाहरण में, इसका मतलब है कि 0 को 'हैलो' में बदल दिया जाएगा।

function helloworld_menu() {
  $items['hello'] = array(
    'page callback' => 'helloworld_page',
    'page arguments' => array(0),
  );

  return $items;
}

function helloworld_page($argument1) {
  return $argument1;
}

स्ट्रिंग को शब्दशः पर भेजा जाएगा, ताकि फिर से बाहर निकलने के array(0, 'world')लिए इस्तेमाल किया जा सके hello world

function helloworld_page($argument1, $argument2) {
  return $argument1 . ' ' . $argument2;
}

"वाइल्डकार्ड" का उपयोग URL के मनमाने डेटा को स्वीकार करने के लिए किया जा सकता है।

function helloworld_menu() {
  $items['hello/%'] = array(
    'page callback' => 'helloworld_page',
    'page arguments' => array(1),
  );

  return $items;
}

function helloworld_page($argument1) {
  return $argument1;
}

हेल्लो / वर्ल्ड विजिट करना, $argument1बराबर होगा world

तर्क ऑटोलडिंग

अक्सर एक URL तर्क संख्या की पहचान करेगा, उदाहरण के लिए, एक इकाई। डुप्लिकेटिंग कोड से बचने के लिए जो इस आईडी को अपनी संबंधित वस्तु में परिवर्तित करता है, Drupal "नामित" वाइल्डकार्ड के लिए ऑटोलॉडिंग का समर्थन करता है। जब एक नामित वाइल्डकार्ड का उपयोग किया जाता है, तो Drupal वाइल्डकार्ड के समान नाम के साथ एक फ़ंक्शन की जांच करेगा _load। यदि ऐसा कोई फ़ंक्शन पाया जाता है, तो उसे URL में मूल्य के मूल्य के साथ बुलाया जाएगा, और लोडर फ़ंक्शन द्वारा जो कुछ भी लौटाया जाएगा, वह मूल मूल्य के स्थान पर पेज कॉलबैक को दिया जाएगा। चूंकि द्रुपाल के पास पहले से ही नोड्स को लोड करने के लिए ऐसा फ़ंक्शन है node_load(), इसलिए हम नोड्स को ऑटोलॉइड और पेज कॉलबैक में पास कर सकते हैं।

function helloworld_menu() {
  $items['hello/%node'] = array(
    'page callback' => 'helloworld_page',
    'page arguments' => array(1),
  );

  return $items;
}

function helloworld_page($node) {
  return t('Hello node (ID = !nid)', array('!nid' => $node->nid));
}

उन्नत ऑटोलडिंग

कभी-कभी, एक से अधिक तर्क के आधार पर ऑटो-लोड को अधिक करना आवश्यक होगा। चूंकि केवल नामित तर्क लोडर को डिफ़ॉल्ट रूप से पारित हो जाता है, इसलिए ड्रुपल को स्पष्ट रूप से बताने की जरूरत है कि लोडर को कौन से अतिरिक्त तर्क दिए जाने चाहिए। उदाहरण के लिए, किसी नोड के विशिष्ट संशोधन को लोड करने के लिए, node_load()नोड आईडी और संशोधन आईडी को पास करना आवश्यक है । जिसे निम्नलिखित कोड द्वारा पूरा किया जा सकता है।

function helloworld_menu() {
  $items['hello/%node/revision/%'] = array(
    'page callback' => 'helloworld_page',
    'page arguments' => array(1),
    'load arguments' => array(3),
  );

  return $items;
}

function helloworld_page($node) {
  return t('Hello node (ID = !nid, revision ID = !rid)', array('!nid' => $node->nid, '!rid' => $node->vid));
}

अनुमतियां

'access callback' => TRUE,सरल उदाहरण को ऊपर से देखने योग्य बनाना आवश्यक है, लेकिन यह शायद ही आदर्श है, क्योंकि यह कभी भी ऐसा नहीं होने देता है। जो भी यात्रा / हेलो की कोशिश करेगा उसे पहुँच प्रदान की जाएगी। नियंत्रण के कुछ उपाय प्रदान करने का सबसे आसान तरीका, एक एक्सेस कॉलबैक प्रदान करना है, ऊपर से पेज कॉलबैक की तरह। निम्नलिखित कोड अभी भी किसी को भी एक्सेस करने की अनुमति देता है, लेकिन यह दर्शाता है कि तर्क को किसी फ़ंक्शन को एक्सेस टाइम पर कैसे स्थानांतरित करना है, जिससे अधिक जटिल तर्क की अनुमति मिलती है।

/**
 * Implements hook_menu().
 */
function helloworld_menu() {
  $items['hello'] = array(
    'page callback' => 'helloworld_page',
    'access callback' => 'helloworld_access',
  );

  return $items;
}

/**
 * Access callback for /hello.
 */
function helloworld_access() {
  return TRUE;
}

यह आवश्यक रूप से सबसे अच्छा तरीका नहीं है, क्योंकि कस्टम फ़ंक्शन का उपयोग करना अक्सर अनावश्यक रूप से डुप्लिकेट कोड होगा। एक बेहतर तरीका होगा, ज्यादातर समय, उपयोग करने के लिए user_access()। एक्सेस कॉलबैक के साथ-साथ एक्सेस दलीलें सेट करना संभव है। निम्नलिखित कोड के साथ एक्सेस उपयोगकर्ता प्रोफाइल अनुमति के साथ उपयोगकर्ताओं से पृष्ठ को देखने योग्य होना संभव है ।

/**
 * Implements hook_menu().
 */
function helloworld_menu() {
  $items['hello'] = array(
    'page callback' => 'helloworld_page',
    'access callback' => 'user_access',
    'access arguments' => array('access user profiles'),
  );

  return $items;
}

चूंकि डिफ़ॉल्ट रूप से एक्सेस कॉलबैक user_access है, इसलिए इसे उपरोक्त कोड के रूप में छोड़ा जा सकता है।

अधिक उन्नत विषय

hook_menu()हुक के लिए सबसे जटिल उपयोग-मामलों के बारे में आधिकारिक दस्तावेज बहुत अधिक जानकारी प्रदान करता है।


3
बहुत बढ़िया! बस पूर्णता के लिए के लिए, titleसंपत्ति की आवश्यकता है के लिए सभी वस्तुओं से लौटेhook_menu()
क्लाइव

1
मुझे पता है कि डॉक्स ऐसा कहते हैं, लेकिन जब मैंने डी 7 में परीक्षण किया, तो ऐसा नहीं था। मैं पहली बार उदाहरण मुझे लगता है कि करने के लिए इसे जोड़ सकते हैं, लेकिन मैं चीजों को रखना चाहता पूर्ण करना यथासंभव आसान बनाने के लिए कम से कम।
सुस्ती

1
मैं कहूंगा कि एक पृष्ठ पर एक शीर्षक जोड़ना पूर्ण न्यूनतम चीजों में से एक है जिसे आप हुक_मेनू () के साथ करना चाहते हैं, लेकिन यह आपकी पोस्ट है: पी सिंटैक्स त्रुटियों को ठीक करने के लायक हो सकता है (कोड उदाहरण 2, 4, 5 और 5) 6), ताकि लोगों को कॉपी और पेस्ट कर सकते हैं
क्लाइव

1
अर्घ, मैं शुरू में वास्तव में कोड चलाने में मेहनती था, लेकिन जैसे-जैसे समय बीतता गया मैं सुस्त हो गया और कॉपी पेस्ट करना शुरू कर दिया। सिंटैक्स त्रुटियों को ठीक किया, कम से कम जिन्हें मैंने देखा;) ठीक है, आप सही हैं कि निश्चित रूप से एक शीर्षक होना चाहिए, इसलिए मैंने प्रारंभिक उदाहरण में एक जोड़ा।
सुस्ती

1
मैं हुक_मेनू का उपयोग करके php फ़ाइल को पथ में कैसे पंजीकृत कर सकता हूं? यह एक कस्टम लिखित php फ़ाइल है जिसमें ड्रुपल बूटस्ट्रैप शामिल है, ड्रुपल सत्र चर का उपयोग करता है और एक तर्क को स्वीकार करता है जो एक उपयोगकर्ता आईडी है।
Елин Й
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.