मैं प्रोग्राम को ब्लॉक तक पहुंच प्रदान करने का कार्यक्रम कैसे बनाऊं?


10

मैंने प्रोग्रामेटिक रूप से एक ब्लॉक बनाया है, लेकिन मुझे नहीं पता कि मैं प्रोग्रामेटिकली इसे कैसे एक्सेस कर सकता हूं। मैं इसे कैसे प्राप्त कर सकता हूं?


क्या आप अपने प्रश्न का विस्तार कर सकते हैं और अपना कोड दिखा सकते हैं?
१६:१३

ब्लॉक कोड में ही आप उपयोगकर्ता (वैश्विक $ उपयोगकर्ता) को देख सकते हैं और लिंक में विधि का उपयोग करके उनकी भूमिका की जांच कर सकते हैं। bywombats.com/blog/ryan/10-25-2007/…
user6614

पैनल्स मॉड्यूल में क्षेत्रों का उपयोग करते हुए कुछ महान अभिगम नियंत्रण हैं, न कि ब्लॉक।
लुई

जवाबों:


10

सरणी में "भूमिका" सरणी सेट करने से वापस लौटे 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 मॉड्यूल की अपनी सेटिंग होगी जिसके लिए भूमिकाओं को अनुमतियों का उपयोग करने के बजाय कुछ करने की अनुमति है, और व्यवस्थापक उपयोगकर्ताओं को उन्हें सेट करने के लिए एक पृष्ठ का उपयोग करने की अनुमति देता है।


खैर मुझे स्पष्ट रूप से इस एक के साथ सबसे उपयुक्त उत्तर के रूप में जाना होगा। विस्तृत विवरण के लिए धन्यवाद, क्योंकि यह समझने में मदद करता है कि ड्रुपल पर्दे के पीछे कैसे काम करता है।
user5013

1

अपने हुक_ब्लॉक_इनफो में आप कुछ इस तरह की कोशिश कर सकते हैं:

$blocks['myblock'] = array(
   ...
   'roles' => array(
      'administrator' => '3',
      'authenticated user' => '2',
   )

यह प्रोग्रामेटिक दृष्टिकोण का उपयोग करके इसे लागू करने का सबसे अच्छा तरीका लगता है क्योंकि आप परिभाषित करते हैं कि किन भूमिकाओं तक पहुंच है और फिर ड्रुपल निर्धारित करें कि उपयोगकर्ता इसे एक्सेस कर सकता है या नहीं। क्या मुझे इस दृष्टिकोण में कोई कमी महसूस हुई?
user5013

यदि आप इसे प्रोग्रामेटिक रूप से करना चाहिए, हाँ। कोई नकारात्मक पहलू नहीं। हालाँकि मुझे लगता है कि वहाँ केवल / व्यवस्थापक / संरचना / ब्लॉक के लिए जा रहा है और ब्लॉक को भूमिकाओं को सौंपने के खिलाफ एक बहुत अच्छा उपयोग मामला होगा ।
Triskelion

उपयोग मामला स्वचालित रूप से उपयोगकर्ता के लिए सेट अप किया जाएगा ताकि उन्हें नहीं करना पड़े। सख्ती से सुविधा मुद्दा। एक बार सेट हो जाने पर, वे इसे तब बदल सकते हैं, जब वे चाहते हैं कि अगर यह उनकी विशेष आवश्यकताओं के अनुरूप नहीं है, तो वे इसे बदल सकते हैं।
user5013

1
यह काम नहीं करता है; यह क्यों नहीं के लिए मेरा जवाब देखें।
kiamlaluno

0

यह मानते हुए कि आप अपने आप को hook_block_info () के साथ ब्लॉक कर रहे हैं, तो आप अपने hook_block_view () फ़ंक्शन में केवल user_access () कर सकते हैं। की जाँच करें एपीआई डॉक्स के बाद से वे इस का एक उदाहरण है।


हां मुझे user_access का उपयोग करने के बारे में सोचना चाहिए था। पूरी तरह से मेरे दिमाग से फिसल गया - डी'ओएच। मैं रोल एक्सेस का उपयोग करने के बारे में सोच रहा हूं, लेकिन शायद अनुमति का उपयोग बेहतर तरीका हो सकता है।
user5013

0

यह 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();

0

हुक_ब्लॉक_व्यू में, आप 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;
}

इस कोड का उपयोग करके प्रमाणित उपयोगकर्ता (मेहमान नहीं) ब्लॉक होंगे जो प्रमाणित उपयोगकर्ताओं के लिए दिखाई देंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.