Запрет редактирования заказов определенной группе пользователей
Материал из Umicms
Актуально для 2.9.6.
Задача: Требуется определенной группе пользователей дать права только на просмотр заказов, но запретить их редактирование или удаление.
Решение: Так как заказы являются объектами, то с помощью системы прав пользователей запретить их редактирования нельзя, но мы можем написать кастомный макрос, который будет работать на события изменения объектов и проверять группу пользователя. Если пользователь будет в группе с правами только на чтение заказов, то при попытке их редактирования мы будем показывать ошибку.
В файле __custom_adm.php пишем:
public function editOrderDenied ($event) {
$mode = $event->getMode();
if ($mode == 'before'){
$subject = $event->getRef('object');
if( !($subject instanceof umiObject) ) {
$subject = $event->getRef('entity');
}
$typesCollection = umiObjectTypesCollection::getInstance();
$umiHierarchy = umiHierarchy::getInstance();
$subjectTypeId = $subject->getTypeId();
$subjectType = $typesCollection->getType($subjectTypeId);
$subjectModule = $subjectType->getModule();
$subjectMethod = $subjectType->getMethod();
if ($subjectModule == 'emarket' && $subjectMethod == 'order'){
$user_id = permissionsCollection::getInstance()->getUserId();
$user_object = umiObjectsCollection::getInstance()->getObject($user_id);
$groups = $user_object->getValue("groups");
foreach ($groups as $val) {
if ($val == 1) {
$this->errorNewMessage(getLabel("error-require-edit-permissions"));
$this->errorPanic();
}
}
}
}
}
В фрагменте кода if ($val == 1) { мы проверяем равенство с ID запрещаемой группой пользователей. В файле custom_events.php пропишем события:
<?php
new umiEventListener('systemModifyObject', 'emarket', 'editOrderDenied');
new umiEventListener('systemDeleteObject', 'emarket', 'editOrderDenied');
new umiEventListener('systemModifyPropertyValue', 'emarket', 'editOrderDenied');
?>