src/EventListener/LayoutSwitcher.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use Pimcore\Model\DataObject;
  4. use Pimcore\Model\DataObject\ClassDefinition\CustomLayout;
  5. use Pimcore\Model\DataObject\ClassDefinition\Data\Classificationstore;
  6. use Pimcore\Model\DataObject\Service;
  7. use Symfony\Component\EventDispatcher\GenericEvent;
  8. class LayoutSwitcher {
  9.     public function selectCustomLayout(GenericEvent $event) {
  10.         
  11.         $object $event->getArgument("object");
  12.         $data $event->getArgument("data");
  13.         $currentLayout $data['currentLayoutId'] ?? null;
  14.         
  15.         try {
  16.             if (!empty($object->getClass()->getGroup()) && $object->getClass()->getGroup() == "Products") {          
  17.                 
  18.                 $classId $object->getClassId();
  19.                 
  20.                 $level $object->getProductLevel();
  21.                 
  22.                 
  23.                 // $this->GetClassificationStore($object);
  24.                 
  25.                 $data $event->getArgument("data");
  26.                 
  27.                 
  28.                 switch ($level) {
  29.                     case "CHILD":
  30.                         $data $this->doModifyCustomLayouts($data$object"{$classId}2", ["{$classId}0""{$classId}1"], $currentLayout);
  31.                         break;
  32.                     case "STYLE":
  33.                         $data $this->doModifyCustomLayouts($data$object"{$classId}1", ["{$classId}0""{$classId}2"], $currentLayout);
  34.                         break;
  35.                     default:
  36.                     
  37.                         $data $this->doModifyCustomLayouts($data$object"{$classId}0", ["{$classId}1""{$classId}2"], $currentLayout);
  38.                         
  39.                         break;
  40.                 }
  41.                 $event->setArgument("data"$data);
  42.             }
  43.         } catch (\Exception $e) {
  44.         }
  45.     } 
  46.     // public function selectCustomLayout(GenericEvent $event) {
  47.         
  48.     //     $object = $event->getArgument("object");
  49.     //     $data = $event->getArgument("data");
  50.     //     $currentLayout = $data['currentLayoutId'] ?? null;
  51.         
  52.     //     try {
  53.     //         if (!empty($object->getClass()->getGroup()) && $object->getClass()->getGroup() == "Products") {          
  54.                 
  55.     //             $classId = $object->getClassId();
  56.                 
  57.     //             $level = $this->GetLevel($object);
  58.                 
  59.                 
  60.     //             $this->GetClassificationStore($object);
  61.                 
  62.     //             $data = $event->getArgument("data");
  63.                 
  64.                 
  65.     //             switch ($level) {
  66.     //                 case "3":
  67.     //                     $data = $this->doModifyCustomLayouts($data, $object, "{$classId}2", ["{$classId}0", "{$classId}1"], $currentLayout);
  68.     //                     break;
  69.     //                 case "2":
  70.     //                     $data = $this->doModifyCustomLayouts($data, $object, "{$classId}1", ["{$classId}0", "{$classId}2"], $currentLayout);
  71.     //                     break;
  72.     //                 default:
  73.                     
  74.     //                     $data = $this->doModifyCustomLayouts($data, $object, "{$classId}0", ["{$classId}1", "{$classId}2"], $currentLayout);
  75.                         
  76.     //                     break;
  77.     //             }
  78.     //             $event->setArgument("data", $data);
  79.     //         }
  80.     //     } catch (\Exception $e) {
  81.     //     }
  82.     // } 
  83.     private function GetClassificationStore(DataObject $dataObject) {
  84.         $classification = [];
  85.         $dataObject->setGetInheritedValues(true);
  86.         $classification[] = $dataObject->getDepartment();
  87.         $classification[] = $dataObject->getMainGroup();
  88.         $classification[] = $dataObject->getSubGroup();
  89.         
  90.         $groupConfig = new \Pimcore\Model\DataObject\Classificationstore\GroupConfig();
  91.         $activeGroup = [];
  92.         foreach ($classification as $path) {
  93.             if (!empty($path)) {
  94.                 for ($i 0$collection $groupConfig->getByName("{$path}_{$i}"); ++$i) {
  95.                     if (empty($collection)) {
  96.                         break;
  97.                     }
  98.                     $activeGroup[$collection->getId()] = true;
  99.                 }
  100.             }    
  101.         }
  102.         
  103.         $dataObject->getClassificationData()->setActiveGroups($activeGroup);
  104.         return $dataObject;
  105.     }
  106.     
  107.     private function doModifyCustomLayouts($data$object$customLayoutToSelect null$layoutsToRemove = [], $currentLayout null) {
  108.         
  109.         if($customLayoutToSelect != null) {
  110.             if ($currentLayout != $customLayoutToSelect."A") {
  111.                 //set current layout to subcategory layout
  112.                 $data['currentLayoutId'] = $customLayoutToSelect;
  113.                 $customLayout CustomLayout::getById($customLayoutToSelect);
  114.                 if ($customLayout == null) {
  115.                     return $data;
  116.                 }
  117.                 $data['layout'] = $customLayout->getLayoutDefinitions();
  118.                 Service::enrichLayoutDefinition($data["layout"], $object);     
  119.             }       
  120.         }
  121.         
  122.         if(!empty($layoutsToRemove)) {
  123.             //remove master layout from valid layouts
  124.             $validLayouts $data["validLayouts"];
  125.             foreach($validLayouts as $key => $validLayout) {
  126.                 if(in_array($validLayout['id'], $layoutsToRemove)) {
  127.                     unset($validLayouts[$key]);
  128.                 }
  129.             }
  130.             $data["validLayouts"] = array_values($validLayouts);            
  131.         }
  132.         $data['layout'] = $this->modifyClassificationName($data['layout']);
  133.         return $data
  134.     }
  135.     private function modifyClassificationName($layout) {
  136.         foreach ($layout->getChildren() as $childLayout) {
  137.             if ($childLayout->fieldtype == "classificationstore") {
  138.                 foreach ($childLayout->activeGroupDefinitions as $activeKey=>$activeGroup) {
  139.                     if (!empty($activeGroup['description'])) {
  140.                         $childLayout->activeGroupDefinitions[$activeKey]['name'] = "<div class=\"bg-indigo-500 text-white rounded-md p-1\">" $activeGroup['description'] . "</div>";
  141.                         $childLayout->activeGroupDefinitions[$activeKey]['description'] = '';
  142.                     }
  143.                 }
  144.             } else if (method_exists($childLayout'getChildren')) {
  145.                 $this->modifyClassificationName($childLayout);
  146.             }
  147.         }
  148.         return $layout;
  149.     }
  150.     private function GetLevel(DataObject $dataObject) {
  151.         $levelCount 0;
  152.         do {
  153.             $levelCount++;
  154.             $dataObject $dataObject->getParent();
  155.             if ($levelCount 5) {
  156.                 break;
  157.             }
  158.         } while ($dataObject->getType() != "folder");
  159.         
  160.         return $levelCount;
  161.     }
  162. }