hook_permission Drupal 7 में विभिन्न भूमिकाओं (roles) के लिए एक्सेस अनुमतियाँ
पिछले पाठों में हमने विभिन्न स्थानों पर पेज और ब्लॉक प्रदर्शित किए थे, और हमने पेजों तक पहुँच को सीमित करने के लिए 'access arguments' और 'access callback' जैसी विशेषताओं का भी उपयोग किया था। इस पाठ में, हम प्रशासनिक पेजों के माध्यम से क्रियाओं तक पहुँच अधिकारों (access permissions) को और अधिक लचीले ढंग से संपादित करने की संभावना बनाएंगे। इसके लिए हम hook_permission() (Drupal 6 में यह hook_perm() था) का उपयोग करेंगे।
hook_permission()
यह उपयोगकर्ताओं के लिए अनुमतियाँ (permissions) निर्धारित करता है।
यह हुक नई अनुमतियाँ जोड़ सकता है, ताकि आपका मॉड्यूल यह निर्धारित कर सके कि उपयोगकर्ता अनुमतियों के पृष्ठ पर कौन सी चुनी जाएँ। इसके अलावा, यह हुक उस मॉड्यूल द्वारा किए जाने वाले कार्यों (actions) के पूर्ण या आंशिक एक्सेस को नियंत्रित करने के लिए उपयोग किया जाता है।
अनुमतियों की जाँच user_access() फ़ंक्शन के माध्यम से की जाती है।
वापसी मान (Return Values)
यह हुक एक ऐरे लौटाता है, जहाँ कुंजियाँ (keys) अनुमति के नाम होते हैं, और उनके मान (values) उन कुंजियों के अनुरूप विवरणों वाले ऐरे होते हैं, जिनमें निम्नलिखित कुंजी-मूल्य जोड़े होते हैं:
title: अनुमति का मानव-पठनीय नाम, जो अनुमतियों के पृष्ठ पर प्रदर्शित होता है। इस मान को t() फ़ंक्शन में लपेटना चाहिए, ताकि बाद में इसे किसी अन्य भाषा में अनुवाद किया जा सके।
description: (वैकल्पिक) यह बताता है कि अनुमति क्या करती है। इसे भी t() फ़ंक्शन में लपेटना चाहिए ताकि इसका अनुवाद किया जा सके।
restrict access: (वैकल्पिक) Boolean (तार्किक मान, 0 या 1, true या false) जो TRUE हो सकता है, यह दर्शाने के लिए कि साइट प्रशासक को इस अनुमति तक पहुँच केवल विश्वसनीय उपयोगकर्ताओं तक सीमित रखनी चाहिए। यह गुण उन अनुमतियों के लिए उपयोग किया जाना चाहिए जहाँ सुरक्षा जोखिम संभावित रूप से किसी हमलावर के लिए प्रवेश बिंदु बन सकते हैं। (उदाहरण: "इनपुट फ़िल्टर प्रबंधन" और "सभी नोड्स पर पूर्ण नियंत्रण", जो Drupal कोर द्वारा प्रदान किए जाते हैं)। जब इसे TRUE पर सेट किया जाता है, तो user_admin_permissions() में परिभाषित मानक त्रुटि संदेश theme_user_permission_description() के माध्यम से प्रदर्शित किया जाएगा और यह प्रशासन पृष्ठ पर संबंधित अनुमति से जुड़ा होगा। डिफ़ॉल्ट रूप से, restrict access का मान FALSE होता है।
warning: (वैकल्पिक) यह प्रशासनिक पृष्ठ पर इस अनुमति के लिए एक अनुवाद योग्य त्रुटि संदेश प्रदर्शित करता है। यह गुण restrict access द्वारा उत्पन्न स्वचालित त्रुटि को ओवरराइड करता है, यदि यह TRUE पर सेट है। इस गुण का उपयोग बहुत कम किया जाना चाहिए, ताकि सभी अनुमतियाँ स्पष्ट और एकसमान दिखें और सुरक्षा चेतावनी संदेशों की शैली से मेल खाएँ। किसी अनुमति के विवरण को परिभाषित करने के लिए description का उपयोग करें।
अब पिछले पाठ के कोड में इस हुक को जोड़ते हैं:
function sitemade_permission(){ return array('view page example' => array( 'title' => t('View page example'), 'description' => t('View simple page example'), ), ); } 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('view page example'), // hook_permission में निर्दिष्ट अनुमति का उपयोग करें ); return $items; // पेजों की सूची लौटाएँ } function _page_example($content = NULL) { $content = ''; // खाली कंटेंट वेरिएबल इनिशियलाइज़ करें $query = db_select('node_revision', 'n'); // 'node_revision' टेबल चुनें जिसमें वर्तमान नोड संशोधन (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; // तैयार कंटेंट लौटाएँ }
अब अनुमति पृष्ठ admin/people/permissions पर एक नई अनुमति दिखाई देगी:
हम यह अनुमति केवल प्रशासक के लिए सेट करेंगे ताकि सामान्य उपयोगकर्ता इस पेज को न देख सकें। अब जब कोई सामान्य उपयोगकर्ता admin/config/content/page_example पर जाने की कोशिश करेगा, तो Drupal उसे 403 त्रुटि (पहुंच अस्वीकृत) दिखाएगा।
अगले पाठ में हम Drupal Forms API का उपयोग करके हमारे साइट की सेटिंग्स चयन करने वाली एक प्रशासनिक फॉर्म पेज बनाएंगे।