Новый хук, предлагаемый на замену сразу двум предыдущим хукам — integarete_load_permissions и integrate_load_illegal_guest_permissions, используемым до SMF 3.0.
Расположение
Actions/Admin/Permissions.php
IntegrationHook::call('integrate_permissions_list', [&self::$permissions]);
Хук принимает в качестве единственного параметра массив разрешений, через изменение которого можно добавить необходимые разрешения для вашего мода.
Использование
Рассмотрим пример (добавление своего разрешения в категорию «Основные права»):
<?php
if (!defined('SMF'))
die('No direct access...');
class YourModName
{
// В этой функции подключаем используемые хуки
public function hooks()
{
add_integration_function('integrate_permissions_list', __CLASS__ . '::permissionsList#', false, __FILE__);
}
public function permissionsLis(array &$permissions)
{
// В языковом файле должна быть строчка $txt['permissionname_your_permission']
// Добавление вашего рарзрешения в группу «Общие»
$permissions['your_permission'] = [
'view_group' => 'general',
'scope' => 'global',
// Добавляем `'never_guests' => true`, чтобы разрешение было недоступно гостям
'never_guests' => true
];
}
}
Расширенный пример
До появления этого хука нам нужно было использовать хуки integrate_load_permissions и integrate_load_illegal_guest_permissions. На примере Light Portal:
<?php
final class Integration
{
// Подключение хуков
public function hooks(): void
{
add_integration_function('integrate_load_illegal_guest_permissions', __CLASS__ . '::loadIllegalGuestPermissions#', false, __FILE__);
add_integration_function('integrate_load_permissions', __CLASS__ . '::loadPermissions#', false, __FILE__);
}
// Указываем разрешения, которые не должны быть доступны гостям
public function loadIllegalGuestPermissions(): void
{
global $context;
$context['non_guest_permissions'] = array_merge(
$context['non_guest_permissions'],
[
'light_portal_manage_pages_own',
'light_portal_manage_pages_any',
'light_portal_manage_pages',
'light_portal_approve_pages',
]
);
}
// Добавляем разрешения в левый столбец в разделе с названием «Light Portal»
public function loadPermissions(array &$permissionGroups, array &$permissionList, array &$leftPermissionGroups): void
{
global $txt;
$txt['permissiongroup_light_portal'] = LP_NAME;
$permissionList['membergroup']['light_portal_view'] = [false, 'light_portal'];
$permissionList['membergroup']['light_portal_manage_pages'] = [true, 'light_portal'];
$permissionList['membergroup']['light_portal_approve_pages'] = [false, 'light_portal'];
$permissionGroups['membergroup'][] = $leftPermissionGroups[] = 'light_portal';
}
}
А вот как выглядит замена всего этого в SMF 3.0:
<?php
use SMF\Actions\Admin\Permissions;
final class Integration
{
// Подключение хука
public function hooks(): void
{
add_integration_function('integrate_permissions_list', __CLASS__ . '::permissionsList#', false, __FILE__);
}
// Реализация разрешений
public function permissionsList(array &$permissions): void
{
// Заголовок группы
Lang::$txt['permissiongroup_light_portal'] = LP_NAME;
// Объявляем отдельную группу рарзешений
Permissions::$permission_groups['global'][] = 'light_portal';
// Помещаем её в левый столбец
Permissions::$left_permission_groups[] = 'light_portal';
// Просмотр элементов портала, можно настроить для всех
$permissions['light_portal_view'] = [
'view_group' => 'light_portal',
'scope' => 'global',
];
// Дальнейшие разрешения недоступны гостям (`'never_guests' => true`)
// Управление собственными страницами
$permissions['light_portal_manage_pages_own'] = [
'generic_name' => 'light_portal_manage_pages',
'own_any' => 'own',
'view_group' => 'light_portal',
'scope' => 'global',
'never_guests' => true,
];
// Управление любыми страницами
$permissions['light_portal_manage_pages_any'] = [
'generic_name' => 'light_portal_manage_pages',
'own_any' => 'any',
'view_group' => 'light_portal',
'scope' => 'global',
'never_guests' => true,
];
// Публикация страниц без модерации
$permissions['light_portal_approve_pages'] = [
'view_group' => 'light_portal',
'scope' => 'global',
'never_guests' => true,
];
}
}
Как видите, реализация прав доступа через хук integrate_permissions_list выглядит более объёмной, зато всё можно сделать в одном хуке. Однако вы по-прежнему можете пользоваться прежними хуками, если этот вас пугает. Но в одной из следующих версий (после SMF 3.0) они будут удалены.