मैंने प्रोग्रामेटिक रूप से एक ब्लॉक बनाया है, लेकिन मुझे नहीं पता कि मैं प्रोग्रामेटिकली इसे कैसे एक्सेस कर सकता हूं। मैं इसे कैसे प्राप्त कर सकता हूं?
मैंने प्रोग्रामेटिक रूप से एक ब्लॉक बनाया है, लेकिन मुझे नहीं पता कि मैं प्रोग्रामेटिकली इसे कैसे एक्सेस कर सकता हूं। मैं इसे कैसे प्राप्त कर सकता हूं?
जवाबों:
सरणी में "भूमिका" सरणी सेट करने से वापस लौटे hook_block_info()
क्योंकि काम नहीं करता है:
भूमिकाओं को एक ब्लॉक को देखने की अनुमति है, और जो उपयोगकर्ता इंटरफ़ेस में सेट की गई हैं , "block_role" तालिका में block_admin_configure_submit () से बचाई गई हैं
$query = db_insert('block_role')->fields(array('rid', 'module', 'delta'));
foreach (array_filter($form_state['values']['roles']) as $rid) {
$query->values(array(
'rid' => $rid,
'module' => $form_state['values']['module'],
'delta' => $form_state['values']['delta'],
));
}
$query->execute();
कोड तय करता है कि कौन-से ब्लॉक करने के लिए वर्तमान में दिखाया जाना चाहिए लॉग इन हुए प्रयोक्ता में निहित है block_block_list_alter () , के एक कार्यान्वयन है जो hook_block_list_alter () का उपयोग करता है केवल उस तालिका की सामग्री, और
$result = db_query('SELECT module, delta, rid FROM {block_role}');
foreach ($result as $record) {
$block_roles[$record->module][$record->delta][] = $record->rid;
}
foreach ($blocks as $key => $block) {
if (!isset($block->theme) || !isset($block->status) || $block->theme != $theme_key || $block->status != 1) {
// This block was added by a contrib module, leave it in the list.
continue;
}
// If a block has no roles associated, it is displayed for every role.
// For blocks with roles associated, if none of the user's roles matches
// the settings from this block, remove it from the block list.
if (isset($block_roles[$block->module][$block->delta]) && !array_intersect($block_roles[$block->module][$block->delta], array_keys($user->roles))) {
// No match.
unset($blocks[$key]);
continue;
}
// …
}
एक और Drupal फ़ंक्शन नहीं है, जो डेटा से रोल्स प्रॉपर्टी की जांच करता है hook_block_info()
, और न ही "block_role" टेबल की सामग्री को मर्ज किए गए कार्यों से लौटाया गया hook_block_info()
है।
आप सत्यापित कर सकते हैं कि उपयोगकर्ता के पास ब्लॉक को देखने के लिए आवश्यक भूमिका है hook_block_view()
, लेकिन उस समय Drupal पहले से ही ब्लॉक प्रदान कर रहा है; इसका मतलब है कि उपयोगकर्ता अभी भी ब्लॉक का शीर्षक देखेगा, अगर कोई पहले से सेट हो चुका है।
hook_block_list_alter()
जब उपयोगकर्ता आवश्यक भूमिका नहीं करता है तो आप उस ब्लॉक के बारे में जानकारी निकालने के लिए क्या कर रहे हैं ।
ब्लॉक का प्रबंधन करने वाले उपयोगकर्ताओं को भ्रम से बचने के लिए, मैं ब्लॉक को संपादित करने के लिए उपयोग किए जाने वाले फ़ॉर्म को भी बदल दूंगा, और उस फ़ील्ड को सेट करने के लिए उपयोग किए जाने वाले फ़ॉर्म फ़ील्ड को अक्षम कर दूंगा, क्योंकि इसे लागू करने वाला मॉड्यूल अपनी सूची का उपयोग करने जा रहा है भूमिकाओं की; न्यूनतम कोड को कम से कम भूमिका सेटिंग्स के बारे में एक संदेश दिखाना चाहिए जिसका कोई प्रभाव नहीं है, लेकिन मैं भूमिका सेटिंग्स के लिए फार्म तत्वों को भी अक्षम कर दूंगा।
चूंकि ब्लॉक मॉड्यूल पहले से ही प्रपत्र फ़ील्ड दिखाता है जो यह चुनने के लिए कि कौन सी भूमिकाएँ एक ब्लॉक को देखती हैं, आप बस अपने ब्लॉक के लिए एक डिफ़ॉल्ट सेट कर सकते हैं, और यदि आवश्यक हो तो व्यवस्थापक उपयोगकर्ताओं को इसे बदलने दें।
उपयोगकर्ता द्वारा की जाने वाली अनुमतियों की जाँच करने के लिए उपयोगकर्ता के पास उन भूमिकाओं की जाँच करने के अनुसार, अंतिम को प्राथमिकता दी जाती है, विशेष रूप से जब विकल्प किसी मॉड्यूल में भूमिकाओं की सूची को हार्ड-कोडिंग करना होगा।
जैसा कि ब्लॉक मॉड्यूल से दिखाया गया है, अनुमति का उपयोग करना एकमात्र विकल्प नहीं है: एक मॉड्यूल यह तय करने के लिए सेटिंग कर सकता है कि किन भूमिकाओं को कुछ देखने की अनुमति है।
स्पष्ट रूप से, यह हमेशा एक सेटिंग के लायक नहीं है जिसके लिए भूमिकाओं को कुछ करने की अनुमति है। मैं कल्पना करता हूं कि प्रशासक उपयोगकर्ताओं के लिए क्या मतलब होगा यदि 10 मॉड्यूल की अपनी सेटिंग होगी जिसके लिए भूमिकाओं को अनुमतियों का उपयोग करने के बजाय कुछ करने की अनुमति है, और व्यवस्थापक उपयोगकर्ताओं को उन्हें सेट करने के लिए एक पृष्ठ का उपयोग करने की अनुमति देता है।
अपने हुक_ब्लॉक_इनफो में आप कुछ इस तरह की कोशिश कर सकते हैं:
$blocks['myblock'] = array(
...
'roles' => array(
'administrator' => '3',
'authenticated user' => '2',
)
यह मानते हुए कि आप अपने आप को hook_block_info () के साथ ब्लॉक कर रहे हैं, तो आप अपने hook_block_view () फ़ंक्शन में केवल user_access () कर सकते हैं। की जाँच करें एपीआई डॉक्स के बाद से वे इस का एक उदाहरण है।
यह hook_block_info () में असंभव है, लेकिन आप इसे प्राप्त करने के लिए इस क्वेरी का उपयोग कर सकते हैं। तदनुसार MODULE_NAME, BLOCK_DELTA और RID बदलें
$query = db_insert('block_role')
->fields(array(
'module' => 'MODULE_NAME',
'delta' => 'BLOCK_DELTA',
'rid' => 2, // Authenticated User
))
->execute();
हुक_ब्लॉक_व्यू में, आप global $user
उपयोगकर्ता के बारे में जानकारी प्राप्त करने के लिए उपयोग कर सकते हैं , फिर उपयोगकर्ता की भूमिका के आधार पर आप अलग block['subject']
- अलग असाइन कर सकते हैं और block['content']
यहां तक कि यदि वह उस भूमिका के लिए अदृश्य होने जा रहा है तो ब्लॉक करने के लिए किसी भी विषय और सामग्री को असाइन नहीं करते हैं। यहाँ एक उदाहरण है :
function ModuleNAME_block_view($delta = '') {
switch ($delta) {
case 'Your_BLOCK' :
Global $user;
if($user->uid != '0') {
$block['subject'] = 'SUBJECT';
$block['content'] = 'SOME CONTENT OR A FUNCTION FOR BLOCK';
}
break;
}
return $block;
}
इस कोड का उपयोग करके प्रमाणित उपयोगकर्ता (मेहमान नहीं) ब्लॉक होंगे जो प्रमाणित उपयोगकर्ताओं के लिए दिखाई देंगे।