it-swarm.asia

كيف أقوم بإضافة شرط وصول إلى عنصر قائمة؟

كيف يمكنني إضافة شروط جديدة فوق الشروط الحالية التي تحدد ما إذا كان عنصر القائمة مرئيًا أم لا؟ يجب ألا تقتصر هذه الشروط على إعدادات الأذونات.

كمثال على حالة استخدام (ليس بالضرورة سبب هذا السؤال): لنفترض أن لدي نوع محتوى يُسمح للمستخدمين بإنشاء عقدة واحدة فقط. لدي عنصر قائمة لإضافة هذا النوع من المحتوى. ولكن إذا كان المستخدم قد أنشأ بالفعل عقدة من نوع المحتوى هذا ، فأريد إخفاء عنصر القائمة. فكرتي الأولى هي تشغيل استعلام للتحقق من وجود عقدة أنشأها المستخدم الحالي من نوع محتوى معين. إذا كان هناك واحد ، قم بإخفاء عنصر القائمة.

أعتقد أن هذا النوع من الوظائف يجب أن يدخل hook_menu_alter() وإضافة المنطق المطلوب هناك. لكنني لست متأكدًا من كيفية القيام بذلك دون تجاوز عمليات التحقق الحالية ، مثل التحقق مما إذا كان لدى المستخدم أذونات لإنشاء هذا النوع من المحتوى. هل يجب أن أدرج هذا المنطق في حالتي الخاصة؟ أو هل يمكنني الإضافة إلى منطق الوصول الحالي دون استبداله؟


تحرير: يبدو أن بعض الناس يركزون على الإجابة "كيف أقصر المستخدم على إنشاء عقدة واحدة من نوع المحتوى". ليس هذا هو السؤال هنا. السؤال هو كيفية إضافة شروط وصول مخصصة إلى عنصر قائمة.

16
Chaulky

ما عليك القيام به هو إضافة رد الاتصال الخاص بك عبر hook_menu_alter () ، ثم داخل رد الاتصال الخاص بك تقوم ببساطة بمنطقك ثم تعيد البيانات عبر رد الاتصال الأصلي.

للتأكد من عدم الكتابة فوق أي تغييرات 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);
}
11
Decipher

أنت تبحث عن Chain Menu Access API الوحدة النمطية.

تتيح واجهة برمجة تطبيقات Access Menu Chain للوحدة النمطية الخاصة بك ربط وظائف رد اتصال الوصول إلى القائمة الخاصة بها إلى إدخالات موجه قائمة الوحدات النمطية الأخرى.

هناك على الأقل مثال واحد في Drupal Stack Exchange عن كيفية استخدامه.

1
crantok

رداً على التعليقات أعلاه ، فإن الحل في 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
Dave Reid