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

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