<?php
namespace AppBundle\EventListener;
use Pimcore\Model\DataObject\ClassDefinition\CustomLayout;
use Pimcore\Model\DataObject\Pattern;
use Pimcore\Model\DataObject\Service;
use Symfony\Component\EventDispatcher\GenericEvent;
class AdminCustomLayoutDisplayListener
{
const DEFAULT_LAYOUT_ID = 0;
const HER_LAYOUT_ID = 'LV_HerLayout';
const WT_LAYOUT_ID = 'LV_WtLayout';
const SNK_LAYOUT_ID = 'LV_SnkLayout';
/**
* @param GenericEvent $event
*/
public function selectCustomLayout(GenericEvent $event)
{
$object = $event->getArgument("object");
if ($object instanceof Pattern && in_array($object->getTwistProcess(), ['Heritage', 'World-Tour', 'Sneaker'])) {
//data element that is send to Pimcore backend UI
$data = $event->getArgument("data");
switch ($object->getTwistProcess()) {
case "Heritage":
$data = $this->doModifyCustomLayouts($data, $object, self::HER_LAYOUT_ID, [self::DEFAULT_LAYOUT_ID, self::WT_LAYOUT_ID, self::SNK_LAYOUT_ID]);
break;
case "World-Tour":
$data = $this->doModifyCustomLayouts($data, $object, self::WT_LAYOUT_ID, [self::DEFAULT_LAYOUT_ID, self::HER_LAYOUT_ID, self::SNK_LAYOUT_ID]);
break;
case "Sneaker":
$data = $this->doModifyCustomLayouts($data, $object, self::SNK_LAYOUT_ID, [self::DEFAULT_LAYOUT_ID, self::HER_LAYOUT_ID, self::WT_LAYOUT_ID]);
break;
default:
$data = $this->doModifyCustomLayouts($data, $object, self::DEFAULT_LAYOUT_ID, [self::WT_LAYOUT_ID, self::HER_LAYOUT_ID, self::SNK_LAYOUT_ID]);
break;
}
$event->setArgument("data", $data);
}
}
/**
* @param $data
* @param $object
* @param null $customLayoutToSelect
* @param array $layoutsToRemove
* @return mixed
*/
private function doModifyCustomLayouts($data, $object, $customLayoutToSelect = null, $layoutsToRemove = [])
{
if ($customLayoutToSelect != null) {
//set current layout to subcategory layout
$data['currentLayoutId'] = $customLayoutToSelect;
$customLayout = CustomLayout::getById($customLayoutToSelect);
$data['layout'] = $customLayout->getLayoutDefinitions();
Service::enrichLayoutDefinition($data["layout"], $object);
}
if (!empty($layoutsToRemove)) {
//remove master layout from valid layouts
$validLayouts = $data["validLayouts"];
foreach ($validLayouts as $key => $validLayout) {
if (in_array($validLayout['id'], $layoutsToRemove)) {
unset($validLayouts[$key]);
}
}
$data["validLayouts"] = array_values($validLayouts);
}
return $data;
}
}