Перейти к основному содержимому

Отображение пользовательских макетов на основе данных объекта

Событие OBJECT_GET_PRE_SEND_DATA позволяет изменять ответ сервера перед тем, как данные объекта будут отправлены в интерфейс панели управления Pimcore при открытии детальной вкладки объекта.

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

Чтобы упростить работу редакторов, они должны видеть только те атрибуты, которые им необходимо заполнять на конкретном уровне иерархии.

Решение

  1. Создайте Пользовательский макет (Custom Layout) для каждого уровня иерархии. Определение пользовательского макета
  2. Используйте событие 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;
}
}




Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.