Хук integrate_permissions_list

Новый хук, предлагаемый на замену сразу двум предыдущим хукам — 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) они будут удалены.