আমি প্রোগ্রামক্রমে একটি ব্লক তৈরি করেছি তবে আমি জানি না কীভাবে আমি প্রোগ্রামটিমে এটিতে অ্যাক্সেস নির্ধারণ করতে পারি। আমি কীভাবে এটি অর্জন করতে পারি?
আমি প্রোগ্রামক্রমে একটি ব্লক তৈরি করেছি তবে আমি জানি না কীভাবে আমি প্রোগ্রামটিমে এটিতে অ্যাক্সেস নির্ধারণ করতে পারি। আমি কীভাবে এটি অর্জন করতে পারি?
উত্তর:
অ্যারে থেকে "রোলস" অ্যারেটি সেট করা hook_block_info()
কাজ করে না কারণ:
যে ভূমিকাগুলি একটি ব্লক দেখার অনুমতি দেয় এবং যা ব্যবহারকারী ইন্টারফেসে সেট করা থাকে, "ব্লক_রোল" সারণীতে 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()
, তবে সেই সময়ে ড্রুপাল ইতিমধ্যে ব্লকটি সরবরাহ করছে; এর অর্থ ব্যবহারকারী ইতিমধ্যে একটি সেট করা থাকলে ব্লক শিরোনামটি দেখতে পাবেন।
আপনি যেটা করতে পারেন তা হ'ল hook_block_list_alter()
ব্লকের তথ্য মুছে ফেলার জন্য যখন ব্যবহারকারীর প্রয়োজনীয় ভূমিকা নেই implementing
ব্লকগুলি পরিচালনা করে এমন ব্যবহারকারীদের বিভ্রান্তি এড়াতে, আমি কোনও ব্লক সম্পাদনা করতে ব্যবহৃত ফর্মটিও পরিবর্তন করতে পারি এবং কোন ব্লকটি দেখতে পারে তা নির্ধারণের জন্য ব্যবহৃত ফর্ম ক্ষেত্রটি অক্ষম করে দেব, যেহেতু এটি প্রয়োগকারী মডিউলটি নিজস্ব তালিকা ব্যবহার করবে ভূমিকা; নূন্যতম কোডটিতে কমপক্ষে ভূমিকা রোল সেটিংসের কোনও প্রভাব না নেওয়ার বিষয়ে একটি বার্তা প্রদর্শন করা উচিত, তবে আমি ভূমিকা সেটিংসের জন্য ফর্ম উপাদানগুলিও অক্ষম করব।
যেহেতু ব্লক মডিউলটি ইতিমধ্যে ফর্ম ক্ষেত্রগুলি দেখায় যা রোলগুলি কোন রোল দেখে তা নির্বাচন করার জন্য, আপনি কেবল নিজের ব্লকের জন্য একটি ডিফল্ট সেট করতে পারেন, এবং প্রয়োজনে প্রশাসক ব্যবহারকারীদের এটি পরিবর্তন করতে দিন।
কোনও ব্যবহারকারীর ভূমিকাগুলি যাচাই করার ক্ষেত্রে কোনও ব্যবহারকারীের অনুমতি যাচাইয়ের বিপরীতে, সর্বশেষটি পছন্দ করা হয়, বিশেষত যখন বিকল্পটি মডিউলটিতে রোলগুলির তালিকা কঠোর কোডিং করে।
ব্লক মডিউল থেকে যেমন দেখানো হয়েছে, অনুমতি ব্যবহার করা একমাত্র বিকল্প নয়: কোন ভূমিকাটি কোনও কিছু দেখার অনুমতি দেয় তা নির্ধারণের জন্য একটি মডিউলে সেটিংস থাকতে পারে।
স্পষ্টতই, এটির সেটিংটি সর্বদা মূল্যবান নয় যার জন্য ভূমিকাগুলি কিছু করার অনুমতি দেয়। প্রশাসক ব্যবহারকারীদের জন্য কী বোঝাতে হবে তাও আমি ভেবে দেখছি যদি 10 মডিউলগুলির নিজস্ব সেটিংস থাকে যার জন্য ভূমিকা ব্যবহারের পরিবর্তে অনুমতি ব্যবহারের পরিবর্তে প্রশাসক ব্যবহারকারীদের একক পৃষ্ঠা ব্যবহার করার অনুমতি দেওয়া হয় to
আপনার হুক_ব্লক_ইনফোতে আপনি এর মতো কিছু চেষ্টা করতে পারেন:
$blocks['myblock'] = array(
...
'roles' => array(
'administrator' => '3',
'authenticated user' => '2',
)
ধরে নিই যে আপনি হুক_ব্লক_ইনফো () দিয়ে নিজেকে ব্লক তৈরি করছেন তবে আপনি কেবল আপনার হুক_ব্লক_ভিউ () ফাংশনে ইউজার_একসেস () করতে পারবেন। এপিআই ডক্স পরীক্ষা করে দেখুন যেহেতু এটির একটি উদাহরণ রয়েছে।
হুক_ব্লক_ইনফো () এ এটি অসম্ভব তবে আপনি এটি অর্জনের জন্য এই ক্যোয়ারীটি ব্যবহার করতে পারেন। 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;
}
এই কোডটি প্রমাণীকরণকারী ব্যবহারকারীদের (অতিথি নয়) ব্যবহারের ফলে অনুমোদনপ্রাপ্ত ব্যবহারকারীদের জন্য ব্লকটি দৃশ্যমান হয়ে উঠবে।