আমি কীভাবে কোনও মেনু আইটেমটিতে অ্যাক্সেস শর্ত যুক্ত করব?


17

বিদ্যমান শর্তগুলির উপরে আমি কীভাবে নতুন শর্ত যুক্ত করতে পারি যা মেনু আইটেমটি দৃশ্যমান কিনা তা নির্ধারণ করে? এই শর্তগুলি অনুমতি সেটিংসে সীমাবদ্ধ করা উচিত নয়।

উদাহরণ হিসাবে ব্যবহারের কেস হিসাবে (অগত্যা এই প্রশ্নের কারণ নয়): ধরুন আমার কাছে এমন একটি সামগ্রী রয়েছে যা ব্যবহারকারীদের কেবল একটি নোড তৈরি করার অনুমতিপ্রাপ্ত। এই ধরণের সামগ্রী যুক্ত করার জন্য আমার কাছে একটি মেনু আইটেম রয়েছে। তবে ব্যবহারকারী যদি ইতিমধ্যে সেই বিষয়বস্তুর ধরণের একটি নোড তৈরি করে থাকে তবে আমি মেনু আইটেমটি আড়াল করতে চাই। আমার প্রথম চিন্তাটি হ'ল বর্তমান ব্যবহারকারীর দ্বারা তৈরি করা নোডের সুনির্দিষ্ট সামগ্রীর ধরণের অস্তিত্বের জন্য একটি অনুসন্ধান চালানো। যদি একটি বিদ্যমান থাকে তবে মেনু আইটেমটি লুকান।

আমি ভাবব এই ধরণের কার্যকারিতাটি hook_menu_alter()সেখানে প্রয়োজনীয় যুক্তি যুক্ত করা উচিত । তবে আমি নিশ্চিত নই যে বিদ্যমান চেকগুলি বাইপাস না করে কীভাবে এটি করা যায়, যেমন এই ধরণের সামগ্রী তৈরির ব্যবহারকারীর অনুমতি আছে কিনা তা যাচাই করা। আমি কি আমার নিজের অবস্থার মধ্যে সেই যুক্তি যুক্ত করতে পারি? বা আমি এটিকে ওভাররাইট না করে বিদ্যমান অ্যাক্সেস যুক্তিতে যুক্ত করতে পারি?


সম্পাদনা: কিছু লোক "আমি কীভাবে কোনও সামগ্রীর ধরণের একটি নোড তৈরি করতে কোনও ব্যবহারকারীর সীমাবদ্ধ রাখি" তার উত্তর দেওয়ার দিকে মনোনিবেশিত বলে মনে হয়। এখানেই প্রশ্ন নেই। প্রশ্নটি কীভাবে আমি একটি মেনু আইটেমটিতে কাস্টম অ্যাক্সেস শর্তাদি যুক্ত করব।

উত্তর:


11

আপনার যা করা দরকার তা হুক_মেনু_াল্টার () এর মাধ্যমে আপনার কলব্যাক যুক্ত করা এবং তারপরে আপনার কলব্যাকের ভিতরে আপনি কেবল নিজের যুক্তিটি করেন তবে মূল কলব্যাকের মাধ্যমে ডেটা ফিরিয়ে দিন।

আপনি অন্য কোনও হুক_মেনু_াল্টার () পরিবর্তনগুলি ওভাররাইট করবেন না তা নিশ্চিত হওয়ার জন্য, অ্যাক্সেস আর্গুমেন্টের মাধ্যমে আপনার পূর্ববর্তী কলব্যাকটি আপনার কলব্যাকটিতে পাস করা উচিত।

এটি সমস্ত তাত্ত্বিক, তবে কোডটির এমন কিছু হওয়া উচিত:

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);
}

সুতরাং যদি আমি একটি নতুন অ্যাক্সেস কলব্যাক ফাংশন বরাদ্দ করি তবে এটি অবশ্যই মূল কলব্যাকটি ওভাররাইট করে?
চৌলকি

হ্যাঁ, আপনার মেনু আইটেমের জন্য কেবল একটি অ্যাক্সেস কলব্যাক থাকতে পারে, সুতরাং এটি নিশ্চিত করুন যে আপনি মূল কলব্যাকটিতে ফিরে এসেছেন। আমি এমন একটি মডিউল দেখেছি যা এটির মতো কিছু করে, ভারী অনুমতিগুলির মধ্যে একটি ভারী মডিউল, এটি কোনটি মনে করতে পারে না।
ডিসিফার

$ আরগগুলিতে অ্যারে_শিফট কী করছে?
চৌলকি

এটি 'অ্যাক্সেস আর্গুমেন্ট' থেকে প্রথম যুক্তিটি বের করে, যা আমরা পুরানো 'অ্যাক্সেস কলব্যাক' করেছিলাম। সুতরাং যদি পুরানো কলব্যাকটি ছিল 'MYMODULE2_access_callback', এটি অ্যারে_শিফটটি ফিরে আসবে। এটি অ্যারে থেকে এটিকে সরিয়ে দেয় যাতে আমরা কেবল কলব্যাকটি প্রত্যাশা করে যে যুক্তিগুলি পাস করি।
ডিসিফার

1

উপরের মন্তব্যের প্রতিক্রিয়া হিসাবে, ডি 7 এর সমাধানটি ব্যবহার করা হবে:

/**
 * 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
এটি মেনু আইটেমগুলির সাথে কিছু করার আছে বলে মনে হচ্ছে না। আমি ডি 7 এর সাথে এখনও খুব বেশি পরিচিত নই, তবে দেখে মনে হচ্ছে এটি নোড তৈরির জন্য নির্দিষ্ট। প্রশ্নটি সাধারণভাবে মেনু আইটেমগুলিতে ফোকাস করে।
চৌলকি

ওহ আমি দেখছি ... এটি নোড সীমা মডিউলটি নির্দেশ করে যে উত্তরটিতে প্রস্তাবিত আপনার ডি 7 সমাধান সম্পর্কে আরও বিশদ জানতে চাইলে আমার মন্তব্যের জবাবে এটি হয়েছে। এখনও কিছুটা বন্ধ বিষয়, কিন্তু প্রশংসা।
চৌলকি

কারণ মায়োনিডেটাইপ লিঙ্কগুলি তৈরির দৃশ্যমানতা নোড_একসেস () ফাংশন দ্বারা নিয়ন্ত্রিত হয়, যা ড্রুপাল in-এ এই হুকটি ডাকে
ডেভ রেড

1

আপনি চেইন মেনু অ্যাক্সেস এপিআই মডিউলটি সন্ধান করছেন।

চেইন মেনু অ্যাক্সেস এআইপি আপনার মডিউলটিকে তার নিজস্ব মেনু অ্যাক্সেস কলব্যাক ফাংশনগুলিকে অন্যান্য মডিউলগুলির মেনু রাউটার এন্ট্রিগুলিতে চেইন করতে দেয়।

এটি কীভাবে ব্যবহার করা যায় তার ড্রুপাল স্ট্যাক এক্সচেঞ্জে কমপক্ষে একটি উদাহরণ রয়েছে।


-1

একটি বিকল্প হ'ল একটি নতুন ভূমিকা তৈরি করা যা আপনার সামগ্রী ধরণের জন্য সামগ্রীর অনুমতি তৈরি করেছে। কোনও ব্যবহারকারী এই ধরণের একটি নোড তৈরি করার পরে, সেই ভূমিকাটি সরিয়ে ফেলুন এবং তারা আর কোনও তৈরি করতে সক্ষম হবে না।


-1

সম্ভবত আপনি নোড সীমা মডিউল চেষ্টা করা উচিত ।

প্রকল্প পৃষ্ঠা থেকে:

নোড লিমিট মডিউল প্রশাসকদের ভূমিকা বা ব্যবহারকারীদের তৈরি করতে পারে এমন নির্দিষ্ট ধরণের নোডের সংখ্যা সীমাবদ্ধ করার অনুমতি দেয়। উদাহরণস্বরূপ, যদি কোনও সাইটের কোনও "বিজ্ঞাপনদাতা" ভূমিকা থাকে যা "বিজ্ঞাপন" নোড তৈরি করতে পারে, তবে নোড সীমা প্রশাসক সেই ভূমিকাটিতে সমস্ত ব্যবহারকারীকে নির্দিষ্ট নোডের মধ্যে সীমাবদ্ধ করতে পারে। তিনি প্রতি ব্যবহারকারী ভিত্তিতে ব্যবহারকারীদের সীমাবদ্ধ করতে পারেন।


একটি কাস্টম অ্যাক্সেস কলব্যাক পদ্ধতি যুক্ত করার জন্য একটি নোডের মধ্যে সীমাবদ্ধ করা কেবলমাত্র উদাহরণের ব্যবহার। এছাড়াও, নোড সীমা মেনু আইটেমটি সরিয়ে দেয় না, এটি কেবলমাত্র সেই সামগ্রীটির ধরণের অন্য নোড যুক্ত করা থেকে বাধা দেয়।
চৌকি

এখন সত্য যে আমি আবার মডিউল বিবরণ তাকান। যদি এটি ড্রুপাল on এ থাকে তবে এটি আসলে সহজ ছিল যেহেতু আপনি হুক_নোড_অ্যাক্সেস ($ নোড, 'তৈরি', $ অ্যাকাউন্ট) ব্যবহার করতে পারেন যা ক্রিয়ে নোড টাইপের লিঙ্কের দৃশ্যমানতার উপর প্রভাব ফেলবে।
ডেভ রেড

ইহা আকর্ষণীয়. আমি শীঘ্রই ডি 7 এ যাওয়ার পরিকল্পনা করি আপনি কি আরও বিস্তারিতভাবে লিখে এবং উত্তর পোস্ট করতে আপত্তি করবেন?
চৌলকি

উত্তরের ডি 7 সংস্করণ পোস্ট করা হয়েছে।
ডেভ রেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.