مساعد الأذونات
يتمتع XOOPS بنظام أذونات قوي ومرن بناءً على عضوية مجموعة المستخدم. يبسط مساعد الأذونات XMF العمل مع هذه الأذونات، مما يقلل فحوصات الأذونات المعقدة إلى استدعاءات طريقة واحدة.
نظرة عامة
Section titled “نظرة عامة”يربط نظام الأذونات في XOOPS المجموعات مع:
- معرف الوحدة
- اسم الإذن
- معرف العنصر
يتطلب فحص الأذونات تقليدياً البحث عن مجموعات المستخدمين والبحث عن معرفات الوحدات والاستعلام عن جداول الأذونات. يتعامل مساعد الأذونات XMF مع كل هذا تلقائياً.
إنشاء مساعد الأذونات
Section titled “إنشاء مساعد الأذونات”// For the current module$permHelper = new \Xmf\Module\Helper\Permission();
// For a specific module$permHelper = new \Xmf\Module\Helper\Permission('mymodule');يستخدم المساعد تلقائياً مجموعات المستخدم الحالية ومعرف الوحدة المحدد.
فحص الأذونات
Section titled “فحص الأذونات”هل يمتلك المستخدم الإذن؟
Section titled “هل يمتلك المستخدم الإذن؟”تحقق من ما إذا كان المستخدم الحالي يمتلك إذن محدد لعنصر ما:
$permHelper = new \Xmf\Module\Helper\Permission();
// Check if user can view topic ID 42$canView = $permHelper->checkPermission('viewtopic', 42);
if ($canView) { // Display the topic} else { // Show access denied message}التحقق مع إعادة التوجيه
Section titled “التحقق مع إعادة التوجيه”إعادة توجيه المستخدمين الذين لا يملكون الإذن تلقائياً:
$permHelper = new \Xmf\Module\Helper\Permission();$topicId = 42;
// Redirects to index.php after 3 seconds if no permission$permHelper->checkPermissionRedirect( 'viewtopic', $topicId, 'index.php', 3, 'You are not allowed to view that topic');
// Code here only runs if user has permissiondisplayTopic($topicId);إلغاء تجاوز المسؤول
Section titled “إلغاء تجاوز المسؤول”افتراضياً، يتمتع مستخدمو الإدارة دائماً بالإذن. للتحقق حتى من المسؤولين:
// Normal check - admins always have permission$hasPermission = $permHelper->checkPermission('viewtopic', $id);
// Check even for admins (third parameter = false)$hasPermission = $permHelper->checkPermission('viewtopic', $id, false);الحصول على معرفات العناصر المسموح بها
Section titled “الحصول على معرفات العناصر المسموح بها”استرجع جميع معرفات العناصر التي لها أذونات مجموعات محددة:
// Get items the current user's groups can view$viewableIds = $permHelper->getItemIds('viewtopic', $GLOBALS['xoopsUser']->getGroups());
// Get items a specific group can view$viewableIds = $permHelper->getItemIds('viewtopic', [XOOPS_GROUP_USERS]);
// Use in queries$criteria = new Criteria('topic_id', '(' . implode(',', $viewableIds) . ')', 'IN');إدارة الأذونات
Section titled “إدارة الأذونات”الحصول على المجموعات لعنصر
Section titled “الحصول على المجموعات لعنصر”ابحث عن المجموعات التي لها إذن محدد:
$permHelper = new \Xmf\Module\Helper\Permission();
// Get groups that can view topic 42$groups = $permHelper->getGroupsForItem('viewtopic', 42);// Returns: [1, 2, 5] (array of group IDs)حفظ الأذونات
Section titled “حفظ الأذونات”منح الإذن لمجموعات محددة:
$permHelper = new \Xmf\Module\Helper\Permission();
// Allow groups 1, 2, and 3 to view topic 42$groups = [1, 2, 3];$permHelper->savePermissionForItem('viewtopic', 42, $groups);حذف الأذونات
Section titled “حذف الأذونات”إزالة جميع الأذونات لعنصر ما (عادة عند حذف العنصر):
$permHelper = new \Xmf\Module\Helper\Permission();$topicId = 42;
// Delete view permission for this topic$permHelper->deletePermissionForItem('viewtopic', $topicId);لأنواع أذونات متعددة:
// Delete multiple permission types at once$permissionNames = ['viewtopic', 'posttopic', 'edittopic'];$permHelper->deletePermissionForItem($permissionNames, $topicId);تكامل النموذج
Section titled “تكامل النموذج”إضافة اختيار الأذونات إلى النماذج
Section titled “إضافة اختيار الأذونات إلى النماذج”يمكن للمساعد إنشاء عنصر نموذج لاختيار المجموعات:
$permHelper = new \Xmf\Module\Helper\Permission();
// Build your form$form = new XoopsThemeForm('Edit Topic', 'topicform', 'save.php');
// Add title field, etc.$form->addElement(new XoopsFormText('Title', 'title', 50, 255, $topic->getVar('title')));
// Add permission selector$form->addElement( $permHelper->getGroupSelectFormForItem( 'viewtopic', // Permission name $topicId, // Item ID 'Groups with View Topic Permission' // Caption ));
$form->addElement(new XoopsFormButton('', 'submit', 'Save', 'submit'));خيارات عنصر النموذج
Section titled “خيارات عنصر النموذج”توقيع الطريقة الكامل:
getGroupSelectFormForItem( $gperm_name, // Permission name $gperm_itemid, // Item ID $caption, // Form element caption $name, // Element name (auto-generated if empty) $include_anon, // Include anonymous group (default: false) $size, // Number of visible rows (default: 5) $multiple // Allow multiple selection (default: true))معالجة تقديم النموذج
Section titled “معالجة تقديم النموذج”use Xmf\Request;
$permHelper = new \Xmf\Module\Helper\Permission();$topicId = Request::getInt('topic_id', 0);
// Get the auto-generated field name$fieldName = $permHelper->defaultFieldName('viewtopic', $topicId);
// Get selected groups from form$selectedGroups = Request::getArray($fieldName, [], 'POST');
// Save the permissions$permHelper->savePermissionForItem('viewtopic', $topicId, $selectedGroups);اسم الحقل الافتراضي
Section titled “اسم الحقل الافتراضي”ينشئ المساعد أسماء حقول متسقة:
$fieldName = $permHelper->defaultFieldName('viewtopic', 42);// Returns something like: 'mymodule_viewtopic_42'مثال كامل: عناصر محمية بالأذونات
Section titled “مثال كامل: عناصر محمية بالأذونات”إنشاء عنصر بأذونات
Section titled “إنشاء عنصر بأذونات”<?phpuse Xmf\Request;use Xmf\Module\Helper;use Xmf\Module\Helper\Permission;
require_once dirname(dirname(__DIR__)) . '/mainfile.php';require_once XOOPS_ROOT_PATH . '/header.php';
$helper = Helper::getHelper('mymodule');$permHelper = new Permission('mymodule');
$op = Request::getCmd('op', 'form');$itemId = Request::getInt('id', 0);
switch ($op) { case 'save': // Save item data $handler = $helper->getHandler('items');
if ($itemId > 0) { $item = $handler->get($itemId); } else { $item = $handler->create(); }
$item->setVar('title', Request::getString('title', '')); $item->setVar('content', Request::getText('content', ''));
if ($handler->insert($item)) { $newId = $item->getVar('item_id');
// Save view permission $viewFieldName = $permHelper->defaultFieldName('view', $newId); $viewGroups = Request::getArray($viewFieldName, [], 'POST'); $permHelper->savePermissionForItem('view', $newId, $viewGroups);
// Save edit permission $editFieldName = $permHelper->defaultFieldName('edit', $newId); $editGroups = Request::getArray($editFieldName, [], 'POST'); $permHelper->savePermissionForItem('edit', $newId, $editGroups);
redirect_header('index.php', 2, 'Item saved'); } break;
case 'form': default: $handler = $helper->getHandler('items');
if ($itemId > 0) { $item = $handler->get($itemId); } else { $item = $handler->create(); $itemId = 0; }
$form = new XoopsThemeForm('Edit Item', 'itemform', 'edit.php'); $form->addElement(new XoopsFormHidden('op', 'save')); $form->addElement(new XoopsFormHidden('id', $itemId));
$form->addElement(new XoopsFormText('Title', 'title', 50, 255, $item->getVar('title'))); $form->addElement(new XoopsFormTextArea('Content', 'content', $item->getVar('content')));
// View permission selector $form->addElement( $permHelper->getGroupSelectFormForItem('view', $itemId, 'Groups that can view') );
// Edit permission selector $form->addElement( $permHelper->getGroupSelectFormForItem('edit', $itemId, 'Groups that can edit') );
$form->addElement(new XoopsFormButton('', 'submit', 'Save', 'submit'));
$form->display(); break;}
require_once XOOPS_ROOT_PATH . '/footer.php';العرض مع فحص الأذونات
Section titled “العرض مع فحص الأذونات”<?phpuse Xmf\Request;use Xmf\Module\Helper;use Xmf\Module\Helper\Permission;
require_once dirname(dirname(__DIR__)) . '/mainfile.php';
$helper = Helper::getHelper('mymodule');$permHelper = new Permission('mymodule');
$itemId = Request::getInt('id', 0);
// Check view permission - redirects if denied$permHelper->checkPermissionRedirect( 'view', $itemId, 'index.php', 3, 'You do not have permission to view this item');
require_once XOOPS_ROOT_PATH . '/header.php';
// User has permission, display the item$handler = $helper->getHandler('items');$item = $handler->get($itemId);
$xoopsTpl->assign('item', $item->toArray());
// Show edit button only if user has edit permissionif ($permHelper->checkPermission('edit', $itemId)) { $xoopsTpl->assign('can_edit', true); $xoopsTpl->assign('edit_url', $helper->url('edit.php?id=' . $itemId));}
require_once XOOPS_ROOT_PATH . '/footer.php';الحذف مع تنظيف الأذونات
Section titled “الحذف مع تنظيف الأذونات”<?phpuse Xmf\Request;use Xmf\Module\Helper;use Xmf\Module\Helper\Permission;
$helper = Helper::getHelper('mymodule');$permHelper = new Permission('mymodule');
$itemId = Request::getInt('id', 0);
// Delete the item$handler = $helper->getHandler('items');$item = $handler->get($itemId);
if ($item && $handler->delete($item)) { // Clean up all permissions for this item $permissionNames = ['view', 'edit', 'delete']; $permHelper->deletePermissionForItem($permissionNames, $itemId);
redirect_header('index.php'