Хук integrate_load_permissions

Через этот хук добавляются новые права доступа, доступные для настройки в соответствующей секции форума.

Расположение

ManagePermissions.php

call_integration_hook('integrate_load_permissions', array(&$permissionGroups, &$permissionList, &$leftPermissionGroups, &$hiddenPermissions, &$relabelPermissions));

Хук принимает пять массивов, но обязательных из них два: $permissionGroups и $permissionList. В первом содержатся группы разрешений, во втором — списки. Остальные параметры используются реже, но примеры приведу и для них, в конце статьи.

Использование

Три варианта подключения, на ваш выбор.

Подключение хука через базу данных:

Используемые хуки подключаются с помощью PHP-файла (например, hooks.php). Укажите этот файл для запуска при установке или удалении приложения:

<?php

if (file_exists(dirname(__FILE__) . '/SSI.php') && !defined('SMF'))
    require_once(dirname(__FILE__) . '/SSI.php');
elseif (!defined('SMF'))
    exit('<b>Error:</b> Cannot install - please verify you put this in the same place as SMF\'s index.php.');

$hooks = array(
    'integrate_pre_include' => '$sourcedir/MyApplication.php',
    'integrate_load_permissions' => 'my_permissions'
);

if (!empty($context['uninstalling']))
    $call = 'remove_integration_function';
else
    $call = 'add_integration_function';

foreach ($hooks as $hook => $function)
    $call($hook, $function);

Подключение хука путем вызова в PHP-файле:

add_integration_function('integrate_load_permissions', 'my_permissions', false);

Подключение хука путем указания в package-info.xml (для SMF 2.1.x):

    <install for="2.1 RC2, 2.1 - 2.1.99">
        ...
        <hook hook="integrate_load_permissions" function="my_permissions" file="$sourcedir/MyApplication.php" />
        ...
    </install>

    <uninstall for="2.1 RC2, 2.1 - 2.1.99">
        ...
        <hook hook="integrate_load_permissions" function="my_permissions" file="$sourcedir/MyApplication.php" reverse="true" />
        ...
    </uninstall>

Пример функции my_permissions (добавление своего разрешения в раздел «Основные права»):

function my_permissions(&$permissionGroups, &$permissionList)
{
    global $context;

    // В массиве $context['non_guest_permissions'] содержатся права доступа, которые нельзя разрешать гостям:
    $context['non_guest_permissions'][] = 'your_permission';

    // Добавление вашего разрешения в раздел «Общие» в Основных правах доступа:
    $permissionList['membergroup']['your_permission'] = array(false, 'general', 'view_basic_info');
}

Можно не только добавлять свои права доступа в нужные разделы, но и создавать свои разделы, с произвольным количеством разрешений в них:

function my_permissions(&$permissionGroups, &$permissionList)
{
    // В SMF 2.0.x при просмотре прав доступа можно изменять вид отображения (простой или классический), поэтому нужно указывать параметры мода для каждого вида:
    $permissionGroups['membergroup']['simple']  = array('your_mod');
    $permissionGroups['membergroup']['classic'] = array('your_mod');

    // Далее перечисляются все добавляемые права доступа:
    $permissionList['membergroup']['your_mod_perm1'] = array(false, 'your_mod', 'your_mod');
    $permissionList['membergroup']['your_mod_perm2'] = array(false, 'your_mod', 'your_mod');
    $permissionList['membergroup']['your_mod_perm3'] = array(false, 'your_mod', 'your_mod');
    $permissionList['membergroup']['your_mod_perm4'] = array(false, 'your_mod', 'your_mod');
    $permissionList['membergroup']['your_mod_perm5'] = array(false, 'your_mod', 'your_mod');
    $permissionList['membergroup']['your_mod_perm6'] = array(false, 'your_mod', 'your_mod');
}

Подробнее о массиве с параметрами

Если добавляемое вами разрешение универсальное (например, «Просмотр форума»), то указывайте первым атрибутом false:

    ... = array(false, 'forum_view');

Если же нужно разделить настройку (например, для разрешения «Редактирование профиля»), указывайте true:

    ... = array(true, 'profile_edit');

В последнем случае можно будет отдельно разрешить редактирование только своего профиля, только чужих профилей, или же и своего и чужих вместе.

Пример секций в правах доступа, добавленных модами

Расширенный пример, с использованием всех параметров хука (для SMF 2.1.x):

function my_permissions(&$permissionGroups, &$permissionList, &$leftPermissionGroups, &$hiddenPermissions, &$relabelPermissions)
{
    global $modSettings;

    // Добавление секции с вашим модом в раздел «Основные права»:
    $permissionGroups['membergroup'][]  = 'your_mod_section';

    // Добавление нужных прав доступа в только что добавленную секцию:
    $permissionList['your_mod_perm1'] = array(false, 'your_mod_section');
    $permissionList['your_mod_perm2'] = array(false, 'your_mod_section');

    // Добавление секции с вашим модом в раздел «Права для разделов с глобальными привилегиями»:
    $permissionGroups['board'][] = 'your_mod_section';

    // Добавление нужных прав доступа в только что добавленную секцию:
    $permissionList['your_mod_perm3'] = array(false, 'your_mod_section');

    // Перечисленные в массиве $leftPermissionGroups группы разрешений отображаются всегда в левой колонке (при классическом виде раздела прав доступа):
    $leftPermissionGroups[] = 'your_mod_section';

    // Можно сделать так, что если какая-то опция выключена, некоторые права доступа не будут видны:
    if (empty($modSettings['your_mod_option_enabled'])) {
        $hiddenPermissions[] = 'your_mod_perm1';
        $hiddenPermissions[] = 'your_mod_perm2';
        $hiddenPermissions[] = 'your_mod_perm3';
    }

    // Также можно сделать, что в зависимости от включенных параметров мода некоторые права доступа будут называться иначе:
    if ($modSettings['your_mod_options'] == 1) {
        $relabelPermissions['your_mod_perm1'] = 'new_name1';
        $relabelPermissions['your_mod_perm2'] = 'new_name2';
    } elseif ($modSettings['your_mod_options'] == 2) {
        $relabelPermissions['your_mod_perm1'] = 'new_name3';
    }
}

Не забываем подключить языковой файл с переводом добавляемых прав доступа:

<?php

// Заголовок секции
$txt['permissiongroup_your_mod_section'] = 'Название вашего мода';

// Заголовок секции при простом виде отображения (в SMF 2.0.x)
$txt['permissiongroup_simple_your_mod_section'] = 'Название вашего мода';

// Названия прав доступа
$txt['permissionname_your_mod_section_perm1'] = 'Название разрешения 1';
$txt['permissionname_your_mod_section_perm2'] = 'Название разрешения 2';

// Названия прав доступа (используются в Генераторе отчётов)
$txt['group_perms_name_your_mod_section_perm1'] = 'Название разрешения 1';
$txt['group_perms_name_your_mod_section_perm2'] = 'Название разрешения 2';

// Если используется разрешение с раздельной настройкой:
$txt['permissionname_your_mod_section_perm3_own'] = 'Разрешение 3 - для своих элементов (например, «Редактирование своей подписи»)';
$txt['permissionname_your_mod_section_perm3_any'] = 'Разрешение 3 - для всех элементов (например, «Редактирование любых подписей»)';

Итак, хук integrate_load_permissions пригодится для добавления новых прав доступа, необходимых для работы модификации.

Поделиться
Отправить
Класснуть
Вотсапнуть