Изменение разрешений на основе данных объектов
Событие OBJECT_GET_PRE_SEND_DATA
Можно использовать для манипулирования ответом сервера до отправки данных объекта в Backend UI Pimcore при открытии детализации
Просмотр объекта Pimcore.
Представьте, что следующий вариант использования: Ваша система PIM собирает различные источники (например, несколько систем ERP от разных подразделений) продуктов и слияний их к одному дереву иерархии продукта, чтобы иметь одно дерево продуктов. Таким образом, все редакторы могут видеть все продукты в одном месте и получить хороший обзор всех доступных продуктов, что великолепно.
Когда дело доходит до редактирования, не все редакторы должны иметь возможность редактировать все продукты. Разрешения на редактирование для продуктов должен основываться на системе ERP, из которой они происходят. Поскольку продукты объединяются в одну структуру дерева, настройка такой разрешающей структуры может стать гглетом, Особенно, когда продукты перемещаются в дереве объектов.
Решение
- Определите дополнительные разрешения, добавив дополнительные записи в таблицу
users_permission_definitions. Это разрешение Записи видны и могут быть настроены в настройках разрешений пользователей и ролей.
- Используйте событие
OBJECT_GET_PRE_SEND_DATA, чтобы изменить разрешения пользователей на FLUTE на основе данных объектов (например, Object Origin) При открытии объекта. Для этого создать {p2} С следующим контентом:
config/services.yaml
services:
app.event_listener.my_event_listner:
class: App\EventListener\MyEventListener
arguments:
- '@Pimcore\Security\User\UserLoader'
tags:
- { name: kernel.event_listener, event: pimcore.admin.dataobject.get.preSendData, method: checkPermissions }
src/EventListener/MyEventListener
<?php
namespace App\EventListener;
use ...
class MyEventListener
{
protected UserLoader $userLoader;
public function __construct(UserLoader $userLoader)
{
$this->userLoader = $userLoader;
}
public function checkPermissions(GenericEvent $event): void
{
$object = $event->getArgument("object");
if($object instanceof Product) {
//data element that is send to Pimcore backend UI
$data = $event->getArgument("data");
//get product origin
$origin = 'erp1';
//get current user
$user = $this->userLoader->getUser();
//check if allowed and if not change permission
if(!$user || !$user->isAllowed("editing_origin_$origin")) {
$data['userPermissions']['save'] = false;
$data['userPermissions']['publish'] = false;
$data['userPermissions']['unpublish'] = false;
$data['userPermissions']['delete'] = false;
$data['userPermissions']['create'] = false;
$data['userPermissions']['rename'] = false;
}
$event->setArgument("data", $data);
}
}
}
Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.