src/Zsdev/MarketplaceBundle/Controller/SiteAttributesController.php line 26

Open in your IDE?
  1. <?php
  2. namespace App\Zsdev\MarketplaceBundle\Controller;
  3. use Pimcore\Model\DataObject;
  4. use Pimcore\Model\Asset;
  5. use Pimcore\Controller\FrontendController;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\Routing\Annotation\Route;
  8. use Pimcore\Model\DataObject\Service;
  9. class SiteAttributesController extends FrontendController
  10. {
  11.     private $attributeSets;
  12.     private $availableAttributes;
  13.     private $attributes;
  14.     private $attributeSetRelations;
  15.     private $sites;
  16.     public function getAttributesAction(string $siteRequest $request)
  17.     {
  18.         $site trim(strip_tags($site)) ?? '';
  19.         if(!strlen($site)) {
  20.             return $this->json(['error' => 'Invalid site!']);
  21.         }
  22.         /**
  23.          * Memory limit
  24.          */
  25.         ini_set("memory_limit""-1");
  26.         /**
  27.          * Prepare current sites (classification store collection)
  28.          * -map by key
  29.          */
  30.         $this->sites = [];
  31.         $collectionListing = new \Pimcore\Model\DataObject\Classificationstore\CollectionConfig\Listing();
  32.         $sitesCollection $collectionListing->getList();
  33.         foreach($sitesCollection as $sitesItem) {
  34.             $this->sites[$sitesItem->getName()] = $sitesItem;
  35.         }
  36.         if(!isset($this->sites[$site])) {
  37.             return $this->json(['error' => 'Unknown site!']);
  38.         }
  39.         $this->attributes = [];
  40.         //Prepare groups (attribute sets)
  41.         $this->prepareAttributeSets($this->sites[$site]->getId());
  42.         $responseData = [];
  43.         $responseData[$site] = [
  44.             'attribute_sets' => $this->attributeSets,
  45.             'attributes' => $this->attributes
  46.         ];
  47.         return $this->json($responseData);
  48.     }
  49.     private function prepareAttributeSets($collectionId)
  50.     {
  51.         /**
  52.          * Prepare relations first
  53.          */
  54.         $validGroups = [];
  55.         $collectionGroupRelations = new \Pimcore\Model\DataObject\Classificationstore\CollectionGroupRelation\Listing();
  56.         foreach($collectionGroupRelations as $collectionGroupRelation) {
  57.             if($collectionGroupRelation->getColid() != $collectionId) continue;
  58.             $validGroups[] = $collectionGroupRelation->getGroupId();
  59.         }
  60.         $this->attributeSets = [];
  61.         $groupListing = new \Pimcore\Model\DataObject\Classificationstore\GroupConfig\Listing();
  62.         $groupCollection $groupListing->getList();
  63.         foreach($groupCollection as $groupConfig) {
  64.             if(!in_array($groupConfig->getId(), $validGroups)) continue;
  65.             $this->attributeSets[] = [
  66.                 'pimcore_id' => $groupConfig->getId(),
  67.                 'name' => $groupConfig->getName(),
  68.                 'attributes' => $this->getAttributeSetAttributes($groupConfig->getId()),
  69.             ];
  70.         }
  71.     }
  72.     private function getAttributeSetAttributes($attributeSetId)
  73.     {
  74.         //Get relations
  75.         if(!isset($this->attributeSetRelations[$attributeSetId])) {
  76.             $this->attributeSetRelations[$attributeSetId] = [];
  77.             $keyGroupRelations = new \Pimcore\Model\DataObject\Classificationstore\KeyGroupRelation\Listing();
  78.             foreach($keyGroupRelations as $keyGroupRelation) {
  79.                 if($keyGroupRelation->getGroupId() != $attributeSetId) continue;
  80.                 $this->attributeSetRelations[$attributeSetId][] = $keyGroupRelation->getKeyId();
  81.             }
  82.         }
  83.         //Get attributes
  84.         if(!$this->availableAttributes) {
  85.             $this->availableAttributes = [];
  86.             $allAtributes = new \Pimcore\Model\DataObject\Classificationstore\KeyConfig\Listing();
  87.             foreach($allAtributes as $attributeData) {
  88.                 $this->availableAttributes[$attributeData->getId()] = $attributeData;
  89.             }
  90.         }
  91.         //Loop prepared
  92.         if(!empty($this->attributeSetRelations[$attributeSetId])) {
  93.             //Insert attributes in attributes list
  94.             foreach($this->attributeSetRelations[$attributeSetId] as $attributeId) {
  95.                 if(isset($this->attributes[$attributeId])) continue;
  96.                 if(!isset($this->availableAttributes[$attributeId])) continue;
  97.                 $attributeValues = [];
  98.                 $definition json_decode($this->availableAttributes[$attributeId]->getDefinition());
  99.                 if (!empty($definition->options)) {
  100.                     foreach ($definition->options as $option) {
  101.                         $attributeValues[$option->value] = $option->key;
  102.                     }
  103.                 }
  104.                 $isMandatory false;
  105.                 try {
  106.                     $isMandatory $definition->mandatory;
  107.                 } catch (\Exception $e) {
  108.                     $isMandatory false;
  109.                 } catch (\Throwable $t) {
  110.                     $isMandatory false;
  111.                 }
  112.                 $this->attributes[$attributeId] = [
  113.                     'pimcore_id' => $attributeId,
  114.                     'name' => $this->availableAttributes[$attributeId]->getName(),
  115.                     'title' => $this->availableAttributes[$attributeId]->getTitle(),
  116.                     'type' => $this->availableAttributes[$attributeId]->getType(),
  117.                     'options' => $attributeValues,
  118.                     'mandatory' => $isMandatory
  119.                 ];
  120.             }
  121.         }
  122.         return $this->attributeSetRelations[$attributeSetId];
  123.     }
  124. }