मैं मेनू आइटम में एक्सेस स्थिति कैसे जोड़ूं?


17

मैं मौजूदा स्थितियों के शीर्ष पर नई शर्तें कैसे जोड़ सकता हूं जो यह निर्धारित करती हैं कि मेनू आइटम दिखाई दे रहा है या नहीं? इन शर्तों को अनुमति सेटिंग्स तक सीमित नहीं किया जाना चाहिए।

एक उदाहरण के उपयोग के मामले के रूप में (जरूरी नहीं कि इस सवाल का कारण): मान लें कि मेरे पास एक सामग्री प्रकार है जिसमें उपयोगकर्ताओं को केवल एक नोड बनाने की अनुमति है। मेरे पास उस प्रकार की सामग्री जोड़ने के लिए एक मेनू आइटम है। लेकिन अगर उपयोगकर्ता ने उस सामग्री प्रकार का नोड पहले ही बना लिया है, तो मैं मेनू आइटम को छिपाना चाहता हूं। मेरा पहला विचार वर्तमान उपयोगकर्ता द्वारा बनाए गए नोड के अस्तित्व के लिए एक क्वेरी चलाने के लिए है जो विशिष्ट सामग्री प्रकार का है। यदि कोई मौजूद है, तो मेनू आइटम छिपाएँ।

मुझे लगता है कि इस प्रकार की कार्यक्षमता में जाना चाहिए hook_menu_alter()और वहां आवश्यक तर्क जोड़ना चाहिए । लेकिन मुझे यकीन नहीं है कि मौजूदा जांचों को दरकिनार किए बिना ऐसा कैसे किया जाए, जैसे कि अगर उपयोगकर्ता के पास उस प्रकार की सामग्री बनाने की अनुमति है या नहीं। क्या मुझे उस तर्क को अपनी स्थिति में शामिल करना होगा? या मैं इसे अधिलेखित किए बिना मौजूदा एक्सेस लॉजिक में जोड़ सकता हूं?


संपादित करें: कुछ लोग जवाब देने पर ध्यान केंद्रित करते हैं "मैं किसी उपयोगकर्ता को एक सामग्री प्रकार का एक नोड बनाने के लिए कैसे सीमित करता हूं"। यहां यह सवाल नहीं है। सवाल यह है कि मैं मेनू आइटम पर कस्टम एक्सेस की शर्तों को कैसे जोड़ूं।

जवाबों:


11

आपको क्या करने की आवश्यकता है अपने कॉलबैक को hook_menu_alter () के माध्यम से जोड़ने के लिए, और फिर अपने कॉलबैक के अंदर आप बस अपना तर्क करते हैं और फिर मूल कॉलबैक के माध्यम से डेटा वापस करते हैं।

यह सुनिश्चित करने के लिए कि आप किसी भी अन्य हुक_मेनू_लेटर () परिवर्तन को अधिलेखित नहीं करते हैं, आपको एक्सेस तर्क के माध्यम से अपने कॉलबैक में पिछले कॉलबैक को पास करना चाहिए।

यह सब सैद्धांतिक है, लेकिन कोड कुछ इस तरह से जाना चाहिए:

MYMODULE_menu_alter(&$items) {
  $items['menu']['access arguments'] = array_merge(array($items['menu']['access callback']), $item['menu']['access arguments']);
  $items['menu']['access callback'] = 'MYMODULE_access_callback';
}

MYMODULE_access_callback() {
  $args = func_get_args();

  // Do Stuff.
  if ($something == FALSE) {
    return FALSE;
  }

  $function = array_shift($args);
  return call_user_func_array($function, $args);
}

इसलिए अगर मैं एक नया एक्सेस कॉलबैक फ़ंक्शन देता हूं, तो क्या यह निश्चित रूप से मूल कॉलबैक को अधिलेखित करता है?
चौकी

हां, आपके पास प्रति मेनू आइटम पर केवल एक एक्सेस कॉलबैक हो सकता है, इसलिए सुनिश्चित करें कि आप मूल कॉलबैक पर वापस जाएं। मैंने एक ऐसा मॉड्यूल देखा है जो ऐसा कुछ करता है, जो अनुमतियों के भारी मॉड्यूलों में से एक है, हालांकि यह याद नहीं रख सकता है कि कौन सा है।
Decipher

$ args पर array_shift क्या कर रहा है?
चुलकी

यह 'एक्सेस आर्गुमेंट्स' से पहला तर्क निकालता है, जिसे हमने पुराना 'एक्सेस कॉलबैक' बनाया था। इसलिए यदि पुराना कॉलबैक 'MYMODULE2_access_callback' था, तो यह है कि array_shift वापस आ रहा है। यह इसे सरणी से भी निकालता है ताकि हम केवल उन तर्कों को पास करें जो कॉलबैक की अपेक्षा कर रहा है।
Decipher

1

उपरोक्त टिप्पणियों के जवाब में, D7 में समाधान का उपयोग करना होगा:

/**
 * Implements hook_node_access().
 */
function mymodule_node_access($node, $op, $account) {
  $type = is_string($node) ? $node : $node->type;

  if ($op == 'create' && $type == 'mynodetype' && db_query("SELECT 1 FROM {node} WHERE type = :type AND uid = :uid", array(':type' => $type, ':uid' => $account->uid))->fetchField()) {
    // If the user has already created a node of a specific type, they cannot
    // create any more.
    return NODE_ACCESS_DENY;
  }

  // Otherwise do not affect any node access.
  return NODE_ACCESS_IGNORE;
}

1
यह मेनू आइटम के साथ कुछ भी नहीं लगता है। मैं अभी तक D7 से परिचित नहीं हूँ, लेकिन ऐसा लगता है कि यह नोड निर्माण के लिए विशिष्ट है। सवाल सामान्य रूप से मेनू आइटम पर केंद्रित है।
चॉल्की

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

चूँकि बनाएँ mynodetype लिंक की दृश्यता नोड_एसीस () फ़ंक्शन द्वारा नियंत्रित की जाती है, जो ड्रुपल 7 में इस हुक को लागू करेगा
डेव रीड

1

आप चेन मेनू एक्सेस एपीआई मॉड्यूल की तलाश कर रहे हैं ।

चेन मेनू एक्सेस एपीआई आपके मॉड्यूल को अन्य मॉड्यूल मेनू मेनू प्रविष्टियों में अपने स्वयं के मेनू एक्सेस कॉलबैक फ़ंक्शन को चेन करने की अनुमति देता है।

इसका उपयोग कैसे करें, Drupal Stack Exchange पर कम से कम एक उदाहरण है।


-1

एक विकल्प यह होगा कि आप अपनी सामग्री प्रकार के लिए सामग्री की अनुमति के लिए एक नई भूमिका बनाएँ। एक उपयोगकर्ता के बाद उस प्रकार का एक नोड बनाता है, उस भूमिका को हटा दें और वे किसी भी अधिक बनाने में सक्षम नहीं होंगे।


-1

शायद आपको नोड सीमा मॉड्यूल की कोशिश करनी चाहिए ।

परियोजना पृष्ठ से:

नोड सीमा मॉड्यूल प्रशासकों को एक विशिष्ट प्रकार के नोड्स की संख्या को प्रतिबंधित करने की अनुमति देता है जो भूमिका या उपयोगकर्ता बना सकते हैं। उदाहरण के लिए, यदि किसी साइट में "विज्ञापनदाता" भूमिका है जो "विज्ञापन" नोड बना सकती है, तो नोड सीमा व्यवस्थापक उस भूमिका के सभी उपयोगकर्ताओं को एक विशिष्ट संख्या में नोड्स तक सीमित कर सकता है। वह प्रति-उपयोगकर्ता आधार पर उपयोगकर्ताओं को प्रतिबंधित भी कर सकता है।


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

यह अब सच है कि मैं मॉड्यूल विवरण पर फिर से देखता हूं। यदि यह ड्रुपल 7 पर था, तो वास्तव में यह आसान होगा क्योंकि आप हुक_नोड_केस ($ नोड, 'क्रिएट', $ खाता) का उपयोग कर सकते हैं, जो स्वयं नोड प्रकार लिंक बनाने की दृश्यता को प्रभावित करेगा।
डेव रीड

यह तो दिलचस्प है। मैं जल्द ही D7 में जाने की योजना बना रहा हूं। क्या आप इसे और अधिक विस्तार से लिखने और एक उत्तर पोस्ट करने का मन करेंगे?
चुलकी

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