vendor/pimcore/asset-metadata-class-definitions/src/EventListener/MainListener.php line 288

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under following license:
  6.  * - Pimcore Commercial License (PCL)
  7.  *
  8.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  9.  *  @license    http://www.pimcore.org/license     PCL
  10.  */
  11. namespace Pimcore\AssetMetadataClassDefinitionsBundle\EventListener;
  12. use Pimcore\AssetMetadataClassDefinitionsBundle\Helper;
  13. use Pimcore\AssetMetadataClassDefinitionsBundle\Model\ClassDefinition\Data\CalculatedValue;
  14. use Pimcore\AssetMetadataClassDefinitionsBundle\Model\ClassDefinition\Data\Data;
  15. use Pimcore\AssetMetadataClassDefinitionsBundle\Model\ClassDefinition\Helper\CalculatorClassResolver;
  16. use Pimcore\AssetMetadataClassDefinitionsBundle\Model\Configuration;
  17. use Pimcore\AssetMetadataClassDefinitionsBundle\Service;
  18. use Pimcore\Event\AdminEvents;
  19. use Pimcore\Event\AssetEvents;
  20. use Pimcore\Event\Model\AssetEvent;
  21. use Pimcore\Logger;
  22. use Pimcore\Model\Asset;
  23. use Pimcore\Model\Metadata\Predefined;
  24. use Pimcore\Tool;
  25. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  26. use Symfony\Component\EventDispatcher\GenericEvent;
  27. class MainListener implements EventSubscriberInterface
  28. {
  29.     /**
  30.      * @return string[]
  31.      */
  32.     public static function getSubscribedEvents()
  33.     {
  34.         return [
  35.             AdminEvents::ASSET_GET_PRE_SEND_DATA => 'getPreSendData',
  36.             AdminEvents::ASSET_LIST_BEFORE_BATCH_UPDATE => 'assetListBeforeBatchUpdate',
  37.             AdminEvents::ASSET_LIST_BEFORE_UPDATE => 'assetListBeforeUpdate',
  38.             AdminEvents::ASSET_GET_FIELD_GRID_CONFIG => 'assetListGetFieldGridConfig',
  39.             AdminEvents::ASSET_METADATA_PRE_SET => 'assetMetadataPreSet',
  40.             AssetEvents::PRE_GET_METADATA => 'preGetMetadata',
  41.             AssetEvents::PRE_UPDATE => 'preUpdate'
  42.         ];
  43.     }
  44.     /**
  45.      * @throws \Pimcore\Model\Element\ValidationException
  46.      */
  47.     public function preUpdate(AssetEvent $event)
  48.     {
  49.         $asset $event->getAsset();
  50.         $collectionNames $asset->getCustomSetting('plugin_assetmetdata_collections');
  51.         foreach ($collectionNames ?? [] as $name) {
  52.             $configuration Configuration\Dao::getByName($name);
  53.             $layoutDefinitions $configuration->getLayoutDefinitions();
  54.             $definitions = [];
  55.             $localizedDefinitions = [];
  56.             Service::extractDataDefinitions($layoutDefinitionsfalse$definitions$localizedDefinitions);
  57.             foreach ($definitions as $name => $definition) {
  58.                 $key $configuration->getPrefix() . '.' $name;
  59.                 $data $asset->getMetadata($key''falsetrue);
  60.                 $data $data['data'] ?? null;
  61.                 if ($definition->isMandatory()) {
  62.                     Helper::performMandatoryCheck($key''$data$definition$asset);
  63.                 }
  64.                 Helper::performValidityCheck($key''$data$definition$asset);
  65.             }
  66.             foreach ($localizedDefinitions as $name => $definition) {
  67.                 $key $configuration->getPrefix() . '.' $name;
  68.                 $validLanguages Tool::getValidLanguages();
  69.                 foreach ($validLanguages as $language) {
  70.                     $data $asset->getMetadata($key$language);
  71.                     if ($definition->isMandatory()) {
  72.                         Helper::performMandatoryCheck($key$language$data$definition$asset);
  73.                     }
  74.                     Helper::performValidityCheck($key$language$data$definition$asset);
  75.                 }
  76.             }
  77.         }
  78.     }
  79.     public function preGetMetadata(AssetEvent $event)
  80.     {
  81.         $asset $event->getAsset();
  82.         $assetId $asset->getId();
  83.         $metadata $event->getArgument('metadata');
  84.         $metadata $metadata ?? [];
  85.         $collectionNames $asset->getCustomSetting('plugin_assetmetdata_collections') ?? [];
  86.         foreach ($collectionNames as $colName) {
  87.             $configuration Configuration\Dao::getByName($colName);
  88.             $definitions = [];
  89.             $localizedDefinitions = [];
  90.             $layoutDefinitions $configuration->getLayoutDefinitions();
  91.             Service::extractDataDefinitions($layoutDefinitionsfalse$definitions$localizedDefinitions);
  92.             /** @var Data $fd */
  93.             foreach ($definitions as $fd) {
  94.                 if ($fd instanceof CalculatedValue) {
  95.                     $this->evaluateField($asset$configuration$fd''$metadata);
  96.                 }
  97.             }
  98.             foreach ($localizedDefinitions as $fd) {
  99.                 if ($fd instanceof CalculatedValue) {
  100.                     $validLanguages Tool::getValidLanguages();
  101.                     foreach ($validLanguages as $language) {
  102.                         $this->evaluateField($asset$configuration$fd$language$metadata);
  103.                     }
  104.                 }
  105.             }
  106.         }
  107.         $event->setArgument('metadata'$metadata);
  108.     }
  109.     public function assetMetadataPreSet(GenericEvent $event)
  110.     {
  111.         $assetId $event->getArgument('id');
  112.         $metadata $event->getArgument('metadata');
  113.         $collectionsData $metadata['collections'] ?? [];
  114.         $asset Asset::getById($assetId);
  115.         $asset->setCustomSetting('plugin_assetmetdata_collections'$collectionsData);
  116.     }
  117.     public function assetListGetFieldGridConfig(GenericEvent $event)
  118.     {
  119.         $keyPrefix $event->getArgument('keyPrefix');
  120.         $field $event->getArgument('field');
  121.         $language $event->getArgument('language');
  122.         $defaulMetadataFields = ['copyright''alt''title'];
  123.         $predefined null;
  124.         if (isset($field['fieldConfig']['layout']['name'])) {
  125.             $predefined Predefined::getByName($field['fieldConfig']['layout']['name']);
  126.         }
  127.         $key $field['name'];
  128.         if ($keyPrefix) {
  129.             $key $keyPrefix $key;
  130.         }
  131.         $fieldDef explode('~'$field['name']);
  132.         $field['name'] = $fieldDef[0];
  133.         if (isset($fieldDef[1]) && $fieldDef[1] === 'system') {
  134.             $type 'system';
  135.         } elseif (in_array($fieldDef[0], $defaulMetadataFields)) {
  136.             $type 'input';
  137.         } else {
  138.             //check if predefined metadata exists, otherwise ignore
  139. //                    if (empty($predefined) || ($predefined->getType() != $field['fieldConfig']['type'])) {
  140. //                        return null;
  141. //                    }
  142.             $type $field['fieldConfig']['type'];
  143.             if (isset($fieldDef[1])) {
  144.                 $field['fieldConfig']['label'] = $field['fieldConfig']['layout']['title'] = $fieldDef[0] . ' (' $fieldDef[1] . ')';
  145.                 $field['fieldConfig']['layout']['icon'] = Tool::getLanguageFlagFile($fieldDef[1], true);
  146.             }
  147.         }
  148.         $result = [
  149.             'key' => $key,
  150.             'type' => $type,
  151.             'label' => $field['fieldConfig']['label'] ?? $key,
  152.             'width' => $field['width'],
  153.             'position' => $field['position'],
  154.             'language' => $field['fieldConfig']['language'] ?? null,
  155.             'layout' => $field['fieldConfig']['layout'] ?? null,
  156.         ];
  157.         if (isset($field['locked'])) {
  158.             $result['locked'] = $field['locked'];
  159.         }
  160.         if ($type === 'select') {
  161.             $field['fieldConfig']['layout']['config'] = $predefined->getConfig();
  162.             $result['layout'] = $field['fieldConfig']['layout'];
  163.         } elseif ($type === 'document' || $type === 'asset' || $type === 'object') {
  164.             $result['layout']['fieldtype'] = 'manyToOneRelation';
  165.             $result['layout']['subtype'] = $type;
  166.         }
  167.         $event->setArgument('processed'true);
  168.         $event->setArgument('result'$result);
  169.     }
  170.     public function assetListBeforeUpdate(GenericEvent $event)
  171.     {
  172.         $loader \Pimcore::getContainer()->get('pimcore_asset_metadata_classdefinitions.implementation_loader.data');
  173.         $data $event->getArgument('data');
  174.         $assetId $data['id'];
  175.         $asset Asset::getById($data['id']);
  176.         $collectionNames $asset->getCustomSetting('plugin_assetmetdata_collections') ?? [];
  177.         $collectionChanged false;
  178.         $metadata $asset->getMetadata(nullnullfalsetrue);
  179.         $dirty false;
  180.         unset($data['id']);
  181.         foreach ($data as $key => $value) {
  182.             $fieldDef explode('~'$key);
  183.             $language null;
  184.             $key $fieldDef[0];
  185.             if (isset($fieldDef[1])) {
  186.                 $language = ($fieldDef[1] == 'none' '' $fieldDef[1]);
  187.             }
  188.             foreach ($metadata as $idx => &$em) {
  189.                 if ($em['name'] == $key && $em['language'] == $language) {
  190.                     $dataImpl $loader->build($em['type']);
  191.                     $value $dataImpl->getDataFromListfolderGrid($value$em);
  192.                     $em['data'] = $value;
  193.                     $dirty true;
  194.                     break;
  195.                 }
  196.             }
  197.             if (!$dirty) {
  198.                 $configuration null;
  199.                 $fieldDefinition Helper::getFieldDefinition($key$configuration);
  200.                 if ($fieldDefinition) {
  201.                     $dataImpl $loader->build($fieldDefinition->getFieldtype());
  202.                     $newData = [
  203.                         'name' => $key,
  204.                         'language' => $language,
  205.                         'type' => $fieldDefinition->getFieldtype(),
  206.                         'data' => $value
  207.                     ];
  208.                     $newData['data'] = $dataImpl->getDataFromListfolderGrid($value$newData);
  209.                     $metadata[] = $newData;
  210.                     $dirty true;
  211.                     $configurationName $configuration->getName();
  212.                     if (!in_array($configuration$collectionNames)) {
  213.                         $collectionNames[] = $configurationName;
  214.                         $collectionChanged true;
  215.                     }
  216.                 } else {
  217.                     $defaulMetadata = ['title''alt''copyright'];
  218.                     if (in_array($key$defaulMetadata)) {
  219.                         $metadata[] = [
  220.                             'name' => $key,
  221.                             'language' => $language,
  222.                             'type' => 'input',
  223.                             'data' => $value
  224.                         ];
  225.                         $dirty true;
  226.                     } else {
  227.                         $predefined Predefined::getByName($key);
  228.                         if ($predefined && (empty($predefined->getTargetSubtype())
  229.                                 || $predefined->getTargetSubtype() == $asset->getType())) {
  230.                             $metadata[] = [
  231.                                 'name' => $key,
  232.                                 'language' => $language,
  233.                                 'type' => $predefined->getType(),
  234.                                 'data' => $value
  235.                             ];
  236.                             $dirty true;
  237.                         }
  238.                     }
  239.                 }
  240.             }
  241.         }
  242.         if ($dirty || $collectionChanged) {
  243.             $asset->setCustomSetting('plugin_assetmetdata_collections'$collectionNames);
  244.             $asset->setMetadataRaw($metadata);
  245.             $asset->save();
  246.         }
  247.         $event->setArgument('processed'true);
  248.     }
  249.     public function getPreSendData(GenericEvent $event)
  250.     {
  251.         $config \Pimcore::getContainer()->getParameter('pimcore_asset_metadata_classdefinitions');
  252.         $assetData $event->getArgument('data');
  253.         $assetData['asset_metadata_class_definitions_bundle_showgrid'] = $config['show_grid'] ?? false;
  254.         $assetData['asset_metadata_class_definitions_bundle_showgridicon'] = $config['show_gridicon'] ?? false;
  255.         if (is_array($assetData['metadata'])) {
  256.             foreach ($assetData['metadata'] as &$item) {
  257.                 $type $item['type'];
  258.                 $loader \Pimcore::getContainer()->get('pimcore_asset_metadata_classdefinitions.implementation_loader.data');
  259.                 $dataImpl $loader->build($type);
  260.                 $dataImpl->addGridConfig($item);
  261.             }
  262.         }
  263.         $assetId $assetData['id'];
  264.         $asset Asset::getById($assetId);
  265.         $collectionNames $asset->getCustomSetting('plugin_assetmetdata_collections') ?? [];
  266.         $assetData['asset_metadata_class_definitions_bundle_activeDefinitions'] = array_values($collectionNames);
  267.         $event->setArgument('data'$assetData);
  268.     }
  269.     public function assetListBeforeBatchUpdate(GenericEvent $event)
  270.     {
  271.         $loader \Pimcore::getContainer()->get('pimcore_asset_metadata_classdefinitions.implementation_loader.data');
  272.         $data $event->getArgument('data');
  273.         $assetId $data['job'];
  274.         $asset Asset::getById($assetId);
  275.         $collectionNames $asset->getCustomSetting('plugin_assetmetdata_collections');
  276.         $collectionChanged false;
  277.         $language null;
  278.         if (isset($data['language'])) {
  279.             $language $data['language'] != 'default' $data['language'] : null;
  280.         }
  281.         if ($asset) {
  282.             if (!$asset->isAllowed('publish')) {
  283.                 throw new \Exception("Permission denied. You don't have the rights to save this asset.");
  284.             }
  285.             $metadata $asset->getMetadata(nullnullfalsetrue);
  286.             $dirty false;
  287.             $name $data['name'];
  288.             $value $data['value'];
  289.             if ($data['valueType'] == 'object') {
  290.                 $value json_decode($valuetrue);
  291.             }
  292.             $fieldDef explode('~'$name);
  293.             $name $fieldDef[0];
  294.             if (count($fieldDef) > 1) {
  295.                 $language = ($fieldDef[1] == 'none' '' $fieldDef[1]);
  296.             }
  297.             foreach ($metadata as $idx => &$em) {
  298.                 if ($em['name'] == $name && $em['language'] == $language) {
  299.                     $dataImpl $loader->build($em['type']);
  300.                     $value $dataImpl->getDataFromListfolderGrid($value$em);
  301.                     $em['data'] = $value;
  302.                     $dirty true;
  303.                     break;
  304.                 }
  305.             }
  306.             if (!$dirty) {
  307.                 $configuration null;
  308.                 $fieldDefinition Helper::getFieldDefinition($name$configuration);
  309.                 if ($fieldDefinition) {
  310.                     $dataImpl $loader->build($fieldDefinition->getFieldtype());
  311.                     $newData = [
  312.                         'name' => $name,
  313.                         'language' => $language,
  314.                         'type' => $fieldDefinition->getFieldtype(),
  315.                         'data' => $value
  316.                     ];
  317.                     $newData['data'] = $dataImpl->getDataFromListfolderGrid($value$newData);
  318.                     $metadata[] = $newData;
  319.                     $dirty true;
  320.                     $configurationName $configuration->getName();
  321.                     if (!in_array($configuration$collectionNames)) {
  322.                         $collectionNames[] = $configurationName;
  323.                         $collectionChanged true;
  324.                     }
  325.                 } else {
  326.                     $defaulMetadata = ['title''alt''copyright'];
  327.                     if (in_array($name$defaulMetadata)) {
  328.                         $metadata[] = [
  329.                             'name' => $name,
  330.                             'language' => $language,
  331.                             'type' => 'input',
  332.                             'data' => $value,
  333.                         ];
  334.                         $dirty true;
  335.                     } else {
  336.                         $predefined Predefined::getByName($name);
  337.                         if ($predefined && (empty($predefined->getTargetSubtype())
  338.                                 || $predefined->getTargetSubtype() == $asset->getType())) {
  339.                             $metadata[] = [
  340.                                 'name' => $name,
  341.                                 'language' => $language,
  342.                                 'type' => $predefined->getType(),
  343.                                 'data' => $value,
  344.                             ];
  345.                             $dirty true;
  346.                         }
  347.                     }
  348.                 }
  349.             }
  350.             if ($dirty || $collectionChanged) {
  351.                 $asset->setCustomSetting('plugin_assetmetdata_collections'$collectionNames);
  352.                 $asset->setMetadataRaw($metadata);
  353.                 $asset->save();
  354.             }
  355.         }
  356.         $event->setArgument('processed'true);
  357.     }
  358.     /**
  359.      * @param string $language
  360.      * @param array $metadata
  361.      */
  362.     public function evaluateField(Asset $assetConfiguration $configurationCalculatedValue $fd$language, &$metadata)
  363.     {
  364.         $className $fd->getCalculatorClass();
  365.         $calculator CalculatorClassResolver::resolveCalculatorClass($className);
  366.         if (!$className || $calculator === null) {
  367.             Logger::error('Class does not exist: ' $className);
  368.             return;
  369.         }
  370.         $params = [
  371.             'name' => $configuration->getPrefix() . '.' $fd->getName(),
  372.             'configuration' => $configuration,
  373.             'fieldDefinition' => $fd
  374.         ];
  375.         $result call_user_func([$calculator'compute'], $asset$params);
  376.         $key $configuration->getPrefix() . '.' $fd->getName();
  377.         $found false;
  378.         foreach ($metadata as &$item) {
  379.             if ($item['name'] == $key && $item['language'] == $language) {
  380.                 $item['data'] = $result;
  381.                 $found true;
  382.                 break;
  383.             }
  384.         }
  385.         if (!$found) {
  386.             $metadata[] = [
  387.                 'name' => $key,
  388.                 'type' => $fd->getFieldtype(),
  389.                 'data' => $result,
  390.                 'language' => $language
  391.             ];
  392.         }
  393.     }
  394. }