Отображение пользовательских макетов на основе данных объекта
Событие OBJECT_GET_PRE_SEND_DATA
позволяет изменять ответ сервера перед тем, как данные объекта будут отправлены в интерфейс панели управления Pimcore при открытии детальной вкладки объекта.
Представьте следующий сценарий использования: Продукты организованы в определенную иерархию и используют механизм наследования данных Pimcore. Например, структура из демо-приложения e-commerce включает три уровня: артикул, цвет, размер. Чтобы минимизировать усилия по поддержке данных, определенные атрибуты должны редактироваться только на соответствующем уровне иерархии (например, название продукта — на уровне артикула, цвета и изображения — на уровне цвета, размер — на уровне размера).
Чтобы упростить работу редакторов, они должны видеть только те атрибуты, которые им необходимо заполнять на конкретном уровне иерархии.
Решение
- Создайте Пользовательский макет (Custom Layout)
для каждого уровня иерархии.

- Используйте событие
OBJECT_GET_PRE_SEND_DATA, чтобы определить, какой макет показать пользователю в зависимости от уровня иерархии объекта. Для этого создайте слушатель событий:
config/services.yaml
services:
app.event_listener.my_event_listner:
class: App\EventListener\MyEventListener
tags:
- { name: kernel.event_listener, event: pimcore.admin.dataobject.get.preSendData, method: selectCustomLayout }
src/EventListener/MyEventListener
<?php
namespace App\EventListener;
use ...
class MyEventListener
{
public function selectCustomLayout(GenericEvent $event): void
{
$object = $event->getArgument('object');
if ($object instanceof Product) {
// Определяем уровень иерархии продукта
$hierarchyLevel = $object->getLevel();
// Данные, которые отправляются в интерфейс Pimcore
$data = $event->getArgument('data');
switch ($hierarchyLevel) {
case 'Article':
$data = $this->doModifyCustomLayouts($data, $object, 2, [0, 1]);
break;
case 'Color Variant':
$data = $this->doModifyCustomLayouts($data, $object, 1, [0, 2]);
break;
default:
$data = $this->doModifyCustomLayouts($data, $object, 0, [1, 2]);
break;
}
$event->setArgument('data', $data);
}
}
private function doModifyCustomLayouts(array $data, Product $object, int $customLayoutToSelect, array $layoutsToRemove): array
{
//установите текущий макет в качестве макета подкатегории
$data['currentLayoutId'] = $customLayoutToSelect;
$customLayout = CustomLayout::getById($customLayoutToSelect);
$data['layout'] = $customLayout->getLayoutDefinitions();
Service::enrichLayoutDefinition($data['layout'], $object);
if (!empty($layoutsToRemove)) {
//удалите основной макет из допустимых макетов
$validLayouts = $data['validLayouts'];
foreach($validLayouts as $key => $validLayout) {
if(in_array($validLayout['id'], $layoutsToRemove)) {
unset($validLayouts[$key]);
}
}
$data['validLayouts'] = array_values($validLayouts);
}
return $data;
}
}
Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.