Разрешения фронтэнда позволяют администраторам контролировать, какие группы пользователей могут выполнять какие-либо действия (к примеру, возможность просматривать элементы контента внутри ноды, создание новых элементов контента, комментирование элементов контента, и так далее). Ваши ноды могут иметь до 7 различных разрешений, настраиваемых в зависимости от потребностей вашего приложения. Реализация разрешения изменяет поведение нескольких методов ноды, и добавляет несколько новых методов на основе разрешений, которые вы можете вызвать.
Настройка вашей модели
Для того, чтобы использовать фронтэнд разрешения, ваша модель должна расширить интерфейс \IPS\Node\Permissions, например так:
class _ExampleModel extends \IPS\Node\Model implements \IPS\Node\Permissions
{
//...
}
Далее вам нужно определить три свойства для вашей модели.
public static $permType = 'string';
Уникальный (для вашего приложения) ключ, который представляет данный набор разрешений на сайте, например 'форумы' или 'категории'.
public static $permApp = 'string';
Ключ вашего приложения, позволяющий сайту корректно ассоциировать ваши разрешения с вашим приложением.
public static $permissionMap = array();
Это свойство представляет собой массив, который сопоставляет ключи разрешений, которые вы хотите определить, с индексом разрешений, который должен иметь либо значение 'view' или целое число от 2 до 7. Как отмечено выше, вы должны, по крайней мере, определить ключ со значением 'view'; вам не нужно определять все 7 разрешений, если вы не планируете их использовать. В качестве примера:
$permissionMap = array(
'view' => 'view',
'read' => 2,
'add' => 3,
'reply' => 4,
'export' => 5,
'download' => 6
);
В данном примере мы определяем обязательный ключ view, а также пять других ключей, которые будут использоваться нашим приложением. Ключи, которые вы определяете здесь, - это средства, с помощью которых вы будете проверять разрешения в других методах, а так же формируют ключи языковых строк, которые предназначены для названия ваших разрешений.
Некоторые ключи требуются, если ваши модели реализуют некоторые другие функции:
- view (можно просматривать ноду) всегда необходим (определяется как значение 'view').
- read (можно читать элементы контента) всегда необходим.
- add (можно добавлять элементы контента) всегда необходим.
- reply (можно отвечать на элементы контента) обязателен, если ваши элементы контента могут быть прокомментированы.
- review (можно оставлять отзывы на элементы контента) обязателен, если ваши элементы контента поддерживают отзывы.
Интерфейс матрицы разрешений в админцентре покажет разрешения в порядке, который вы определяете здесь. Имена столбцов определяются строкой языка с ключом perm__{$key}, где $key это ключ из вышеприведённого массива, поэтому вам нужно добавить их в файл lang.php вашего приложения.
Изменённые поведения после реализации \IPS\Node\Permissions
После реализации в вашей модели, следующие три метода (по умолчанию) будут возвращать дочерние ноды, которые текущий авторизованный пользователь имеет разрешения просматривать:
- hasChildren()
- childrenCount()
- children()
Эти методы принимают два необязательных параметра, которые позволяют вам контролировать это поведение. Подпись параметра одинакова для всех трех; В качестве примера здесь показан children().
array children( [ string $permissionCheck='view' [, \IPS\Member $member=NULL ] ] )
$permissionCheck (string, optional, default 'view')
Определяет, какое разрешение проверяется при работе с потомком; должен быть одним из ключей разрешения, которые вы определили ранее. Разрешение просмотра используется, если ни один не указан.
$member (\IPS\Member, optional)
Контролирует какие разрешения пользователя проверяются. По умолчанию, используется авторизованный в настоящее время пользователь, однако, вы можете переназначит это и указать другого пользователя.
В дополнение к вышупомянутым, метод loadAndCheckPerms() теперь будет бросать исключение OutOfRangeException, если нода загружена у авторизованного пользователя, не имеющего разрешения на просмотр..
Дополнительные методы
boolean static canOnAny( string $permission [, \IPS\Member $member ] )
Возвращает true, если пользователь имеет запрашиваемое разрешение на любой ноде, которая использует эту модель.
- $permission (string, required) Тип разрешения для проверки.
- $member (\IPS\Member, optional) Если предоставлено, при выполнении проверки используется разрешение данного пользователя. По умолчанию, используется авторизованный в настоящее время пользователь.
boolean can( string $permission [, \IPS\Member $member ] )
Возвращает true, если пользователь имеет запрашиваемое разрешение для объекта ноды.
- $permission (string, required) Тип разрешения для проверки.
- $member (\IPS\Member, optional) Если предоставлено, при выполнении проверки используется разрешение данного пользователя. По умолчанию, используется авторизованный в настоящее время пользователь.
array permissions()
Возвращает массив, представляющий строку ноды из таблицы core_permission_index, которая содержит данные о том, какие группы какие имеют разрешения. Массив содержит ключи perm_view и с perm_2 до perm_7, предоставляющие настроенные вами типы разрешений. Каждое из этих значений представляет собой список идентификаторов групп, разделенных запятыми, которые имеют это разрешение. Например:
$permissions = $myNode->permissions();
$groupsWithPermission = explode( ",", $permissions['perm_2'] ); // perm_2 может быть 'read' в нашей ноде
foreach( $groupsWithPermission as $id )
{
echo "Группа #{$id} имеет разрешение на прочтение элементов в этой ноде";
}
Этот метод в первую очередь полезен при построении запросов на основе групп, имеющих указанное разрешение.