لا تسمح للمستخدم بحذف عقدة ولكن السماح بحذف من خلال عمليات العرض بالجملة

StackOverflow https://stackoverflow.com/questions/3690519

سؤال

لدي السيناريو التالي:

  • دور المحرر يجب ليس يسمح لحذف العقد. لذلك يتم إلغاء الإذن المقابل في صفحة الأذونات.
  • ومع ذلك ، يجب أن يكون المحرر قادرًا على حذف العقد من عمليات العرض بالجملة. باستخدام القواعد يتم إنشاء إجراء يسمى "Safe Delete" يتحقق من الأشياء مثل إذا لم يتم نشر العقدة وما إلى ذلك قبل حذف العقدة.

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

أنا متأكد من أن هذا شرط رئيسي ولكن لا يبدو لي أن أجد حلاً.

سيتم تفضيل الحلول التي لا تتضمن البرمجة.

هل كانت مفيدة؟

المحلول

الطريقة البسيطة ، ولكن غير المنهكة ، هي الطريق الذي اتخذته بالفعل ، ولكن مع وحدة صغيرة إضافية لمساعدتها.

  • لديه وظيفة my_module_can_delete($user), ، هذا يعود TRUE إذا سمح للمستخدم بالحذف ، FALSE إذا لم يكن المستخدم كذلك.
  • الأدوات hook_form_alter() لتعديل وحذف الزر الموجود في نموذج node_edit ، إذا my_module_can_delete($user)
  • الأدوات hook_form_alter() لتعديل نموذج التأكيد الذي يتم استدعاؤه على/node/٪ nid/delete ، وإضافة رسالة هناك ، وإخبار المستخدم هو أو هي my_module_can_delete($user). يجب أن يكون هذا كافيًا ، لأن تعطيل هذا النموذج سيؤدي إلى عدم تمكن المستخدمين من تجاوز هذا النموذج. سوف يعتني Form-Api بذلك.

ومع ذلك ، يمكنك جعلها أكثر قوية ، للقبض على وحدات الحذف الأخرى:

  • الأدوات hook_nodeapi(), $op == 'delete' لالتقاط الإجراءات الحذف والتوقف (من خلال التذرع drupal_goto(), أو الاتصال drupal_access_denied() لتطبيق مخاطر المستخدم. فقط صيد تمثيل الحذف إذا كان المرجع هو الحذف- النمط كما هو مذكور أعلاه. أو ، أكثر أمانًا ، قائمة البيت الخاصة بك VBO-action وإرجاع FALSE على جميع المرتبات الأخرى. غالبًا ما يمكن العثور على أحد المراجع عن طريق قراءة عقدة $ التي تم تمريرها إلى hook_nodeapi().

A ، Imho ، أكثر نظافة ، ولكن ربما أكثر كثافة لبديل, ، سيكون ببساطة التأكد من أن دفعاتك/أفعالك تسمى كل إجراء حذف.

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

نصائح أخرى

حسنًا ، يبدو لي أن لديك إعدادًا لا تريد أن يحذف فيه مستخدمو دور المحرر الأشياء ، إلا في بعض المواقف المتطرفة. هذا اقتراحي:

1) تثبيت وحدة العلم. قم بإنشاء علامة "ليتم حذفها" لا يمكن تعيينها إلا من قبل دور المحرر.

2) لم أتطلع إلى ذلك ، لكنني متأكد من أنه من المحتمل أن يكون هناك مجموعة أو تحريك/عمل/حركة من شأن .

3) بعد ذلك ، قم بإعداد بعض نشاط تشغيل cron (المشغل/الإجراء أو القاعدة) لحذف العقد باستخدام العلم "المراد حذفه" ، أو وجود مستخدم آخر مع أذونات أعلى يأتي من حين لآخر وحذف العناصر الموضحة.

وبهذه الطريقة ، لا تتجاوز في الواقع نظام الأذونات ، ومع ذلك لا تزال الأمور تتم إزالتها من موقعك.

لقد وقعت من هذا لفترة من الوقت حتى لاحظت وحدة "Actions_permissions" ، وتمكين هذا وعلى صفحة الأذونات ، يمكنك توفير الوصول إلى إجراءات محددة على أساس الدور.

ليس لدي حل جيد لعدم الترميز ، ولست متأكدًا من أنني سأسمي هذا الحل "رائع" - ولكن قد تكون إحدى الطرق هي تنفيذ وحدة بسيطة مع خطاف form_alter يزيل زر الحذف من تحرير العقدة النماذج كما تم بناؤها.

بشكل عام ، يبدو أن الدور إما لديه إذن لحذف العقد أم لا ، وسيكون القتل مثل هذا أقل قوة قد ترغب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top