<?php
namespace App\Zsdev\MarketplaceBundle\Controller;
use Pimcore\Model\DataObject;
use Pimcore\Model\Asset;
use Pimcore\Controller\FrontendController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Pimcore\Model\DataObject\Service;
class SiteAttributesController extends FrontendController
{
private $attributeSets;
private $availableAttributes;
private $attributes;
private $attributeSetRelations;
private $sites;
public function getAttributesAction(string $site, Request $request)
{
$site = trim(strip_tags($site)) ?? '';
if(!strlen($site)) {
return $this->json(['error' => 'Invalid site!']);
}
/**
* Memory limit
*/
ini_set("memory_limit", "-1");
/**
* Prepare current sites (classification store collection)
* -map by key
*/
$this->sites = [];
$collectionListing = new \Pimcore\Model\DataObject\Classificationstore\CollectionConfig\Listing();
$sitesCollection = $collectionListing->getList();
foreach($sitesCollection as $sitesItem) {
$this->sites[$sitesItem->getName()] = $sitesItem;
}
if(!isset($this->sites[$site])) {
return $this->json(['error' => 'Unknown site!']);
}
$this->attributes = [];
//Prepare groups (attribute sets)
$this->prepareAttributeSets($this->sites[$site]->getId());
$responseData = [];
$responseData[$site] = [
'attribute_sets' => $this->attributeSets,
'attributes' => $this->attributes
];
return $this->json($responseData);
}
private function prepareAttributeSets($collectionId)
{
/**
* Prepare relations first
*/
$validGroups = [];
$collectionGroupRelations = new \Pimcore\Model\DataObject\Classificationstore\CollectionGroupRelation\Listing();
foreach($collectionGroupRelations as $collectionGroupRelation) {
if($collectionGroupRelation->getColid() != $collectionId) continue;
$validGroups[] = $collectionGroupRelation->getGroupId();
}
$this->attributeSets = [];
$groupListing = new \Pimcore\Model\DataObject\Classificationstore\GroupConfig\Listing();
$groupCollection = $groupListing->getList();
foreach($groupCollection as $groupConfig) {
if(!in_array($groupConfig->getId(), $validGroups)) continue;
$this->attributeSets[] = [
'pimcore_id' => $groupConfig->getId(),
'name' => $groupConfig->getName(),
'attributes' => $this->getAttributeSetAttributes($groupConfig->getId()),
];
}
}
private function getAttributeSetAttributes($attributeSetId)
{
//Get relations
if(!isset($this->attributeSetRelations[$attributeSetId])) {
$this->attributeSetRelations[$attributeSetId] = [];
$keyGroupRelations = new \Pimcore\Model\DataObject\Classificationstore\KeyGroupRelation\Listing();
foreach($keyGroupRelations as $keyGroupRelation) {
if($keyGroupRelation->getGroupId() != $attributeSetId) continue;
$this->attributeSetRelations[$attributeSetId][] = $keyGroupRelation->getKeyId();
}
}
//Get attributes
if(!$this->availableAttributes) {
$this->availableAttributes = [];
$allAtributes = new \Pimcore\Model\DataObject\Classificationstore\KeyConfig\Listing();
foreach($allAtributes as $attributeData) {
$this->availableAttributes[$attributeData->getId()] = $attributeData;
}
}
//Loop prepared
if(!empty($this->attributeSetRelations[$attributeSetId])) {
//Insert attributes in attributes list
foreach($this->attributeSetRelations[$attributeSetId] as $attributeId) {
if(isset($this->attributes[$attributeId])) continue;
if(!isset($this->availableAttributes[$attributeId])) continue;
$attributeValues = [];
$definition = json_decode($this->availableAttributes[$attributeId]->getDefinition());
if (!empty($definition->options)) {
foreach ($definition->options as $option) {
$attributeValues[$option->value] = $option->key;
}
}
$isMandatory = false;
try {
$isMandatory = $definition->mandatory;
} catch (\Exception $e) {
$isMandatory = false;
} catch (\Throwable $t) {
$isMandatory = false;
}
$this->attributes[$attributeId] = [
'pimcore_id' => $attributeId,
'name' => $this->availableAttributes[$attributeId]->getName(),
'title' => $this->availableAttributes[$attributeId]->getTitle(),
'type' => $this->availableAttributes[$attributeId]->getType(),
'options' => $attributeValues,
'mandatory' => $isMandatory
];
}
}
return $this->attributeSetRelations[$attributeSetId];
}
}