src/EventListener/AssetListener.php line 38

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Service\Validator\Asset\NamingValidator;
  4. use Pimcore\Event\Model\Asset\ResolveUploadTargetEvent;
  5. use Pimcore\Event\Model\AssetEvent;
  6. use Pimcore\Logger;
  7. use Pimcore\Model\Asset;
  8. use Pimcore\Model\DataObject\Data\Hotspotimage;
  9. use Pimcore\Model\DataObject\Data\ImageGallery;
  10. use Pimcore\Model\DataObject\Good;
  11. class AssetListener
  12. {
  13.     private static bool $fileRewrite false;
  14.     private NamingValidator $namingValidator;
  15.     private array $assetsPossibleTypesToUpdateMethods = [
  16.         'preview' => 'updatePreview',
  17.         'preview_flip' => 'updatePreviewFlip',
  18.         'gallery' => 'updateGallery',
  19.         'white' => 'updateWhite',
  20.         'gray' => 'updateGray',
  21.         'panorama' => 'updatePanorama',
  22.         'model' => 'update3DModel',
  23.         'scheme' => 'updateSchemes',
  24.         'manual' => 'updateManuals'
  25.     ];
  26.     public function __construct(NamingValidator $namingValidator)
  27.     {
  28.         $this->namingValidator $namingValidator;
  29.     }
  30.     // event handlers
  31.     public function onResolveUploadTarget(ResolveUploadTargetEvent $ev)
  32.     {
  33.         if ( isset($ev->getContext()['containerType']) ){
  34.             //Если asset залит через родительский объект
  35.             //@todo автозаливка файлов в связанную с объектом папку
  36.         }else{
  37.             if (isset($ev->getContext()['fromZip']) && $ev->getContext()['fromZip'] === true) {
  38.                 //Загрузка архива в списке ассетов
  39.                 $this->processUnzippedFile($ev->getFilename(), $ev->getParentId());
  40.             } elseif ( !is_null($ev->getParentId()) ){
  41.                 $this->deleteAssetIfExists($ev->getParentId());
  42.             }
  43.         }
  44.     }
  45.     public function onPostAdd(AssetEvent $ev)
  46.     {
  47.         $asset $ev->getAsset();
  48.         $ftype $this->detectPossibleFileTypeByName($asset->getFilename());
  49.         if (!$ftype) return;
  50.         $methodName $this->assetsPossibleTypesToUpdateMethods[$ftype] ?? '';
  51.         if (method_exists($this$methodName) && $this->assetMeetsNamingRequirements($asset$ftype)) $this->$methodName($asset);
  52.     }
  53.     // resolveUploadTarget methods
  54.     private function deleteAssetIfExists(int $goodAssetsFolderId)
  55.     {
  56.         $goodAssetFolder Asset::getById($goodAssetsFolderId);
  57.         $good Good::getByAssetFolder($goodAssetFolder)->getObjects();
  58.         if (!$good) return;
  59.         $goodAssets $goodAssetFolder->getChildren();
  60.         $existing array_filter($goodAssets, fn($goodAsset) => $goodAsset->getFilename() === $_FILES['Filedata']['name']);
  61.         $existing $existing array_values($existing)[0] : $existing;
  62.         if (!$existing) return;
  63.         self::$fileRewrite true;
  64.         $existing->delete();
  65.     }
  66.     private function processUnzippedFile($fileName$parentId)
  67.     {
  68.         $currentAssets Asset::getById($parentId)->getChildren();
  69.         $targetAsset array_filter($currentAssets, fn($asset) => $asset->getFilename() === $fileName);
  70.         if ($targetAssetarray_values($targetAsset)[0]->delete();
  71.     }
  72.     // postAdd methods
  73.     private function detectPossibleFileTypeByName($fName)
  74.     {
  75.         if (str_contains($fName'preview_flip')) return 'preview_flip';
  76.         $fNameParts explode('_'$fName);
  77.         if (count($fNameParts) <= 1) return false;
  78.         foreach ($this->assetsPossibleTypesToUpdateMethods as $type => $method) {
  79.             foreach ($fNameParts as $part) {
  80.                 if (str_contains($part$type)) {
  81.                     return $type;
  82.                 }
  83.             }
  84.         }
  85.         return false;
  86.     }
  87.     private function updatePreview(Asset $asset)
  88.     {
  89.         $good Good::getByAssetFolder($asset->getParent())->getObjects();
  90.         if (!$good) return;
  91.         $good $good[0];
  92.         $marketingBrick $good->getMarketingProps()->getMarketingBrick();
  93.         $marketingBrick->setPreviewImg($asset);
  94.         $good->save();
  95.     }
  96.     private function updatePreviewFlip(Asset $asset)
  97.     {
  98.         $good Good::getByAssetFolder($asset->getParent())->getObjects();
  99.         if (!$good) return;
  100.         $good $good[0];
  101.         $marketingBrick $good->getMarketingProps()->getMarketingBrick();
  102.         $marketingBrick->setPreviewImgFlip($asset);
  103.         $good->save();
  104.     }
  105.     private function updateGallery(Asset $asset)
  106.     {
  107.         $goodAssetFolder $asset->getParent();
  108.         $good Good::getByAssetFolder($goodAssetFolder)->getObjects();
  109.         if (!$good) return;
  110.         $good $good[0];
  111.         $goodAssets $goodAssetFolder->getChildren();
  112.         $galleryAssets array_values(array_filter($goodAssets, fn($goodAsset) => str_contains($goodAsset->getFilename(), '_gallery_')));
  113.         $galleryAssets $this->processSpecificAssetsArray($asset$galleryAssetsself::$fileRewrite);
  114.         $galleryItems array_map(function($galleryAsset){
  115.             $hotSpotImg = new Hotspotimage();
  116.             $hotSpotImg->setImage($galleryAsset);
  117.             return $hotSpotImg;
  118.         }, $galleryAssets);
  119.         $gallery = new ImageGallery($galleryItems);
  120.         $marketingBrick $good->getMarketingProps()->getMarketingBrick();
  121.         $marketingBrick->setGallery($gallery);
  122.         $good->save();
  123.     }
  124.     private function updateWhite(Asset $asset)
  125.     {
  126.         $good Good::getByAssetFolder($asset->getParent())->getObjects();
  127.         if (!$good) return;
  128.         $good $good[0];
  129.         $marketingBrick $good->getMarketingProps()->getMarketingBrick();
  130.         $marketingBrick->setMainPhotoWhite($asset);
  131.         $good->save();
  132.     }
  133.     private function updateGray(Asset $asset)
  134.     {
  135.         $good Good::getByAssetFolder($asset->getParent())->getObjects();
  136.         if (!$good) return;
  137.         $good $good[0];
  138.         $marketingBrick $good->getMarketingProps()->getMarketingBrick();
  139.         $marketingBrick->setMainPhotoGray($asset);
  140.         $good->save();
  141.     }
  142.     private function updatePanorama(Asset $asset)
  143.     {
  144.         $good Good::getByAssetFolder($asset->getParent())->getObjects();
  145.         if (!$good) return;
  146.         $good $good[0];
  147.         $marketingBrick $good->getMarketingProps()->getMarketingBrick();
  148.         $marketingBrick->setPanoramaGIF($asset);
  149.         $good->save();
  150.     }
  151.     private function update3DModel(Asset $asset)
  152.     {
  153.         $good Good::getByAssetFolder($asset->getParent())->getObjects();
  154.         if (!$good) return;
  155.         $good $good[0];
  156.         $marketingBrick $good->getMarketingProps()->getMarketingBrick();
  157.         $marketingBrick->setModel3d($asset);
  158.         $good->save();
  159.     }
  160.     private function updateSchemes(Asset $asset)
  161.     {
  162.         $goodAssetFolder $asset->getParent();
  163.         $good Good::getByAssetFolder($goodAssetFolder)->getObjects();
  164.         if (!$good) return;
  165.         $good $good[0];
  166.         $goodAssets $goodAssetFolder->getChildren();
  167.         $schemasAssets array_values(array_filter($goodAssets, fn($goodAsset) => str_contains($goodAsset->getFilename(), '_scheme_')));
  168.         $schemasAssets $this->processSpecificAssetsArray($asset$schemasAssetsself::$fileRewrite);
  169.         $schemasItems array_map(function($galleryAsset){
  170.             $hotSpotImg = new Hotspotimage();
  171.             $hotSpotImg->setImage($galleryAsset);
  172.             return $hotSpotImg;
  173.         }, $schemasAssets);
  174.         $schemas = new ImageGallery($schemasItems);
  175.         $marketingBrick $good->getMarketingProps()->getMarketingBrick();
  176.         $marketingBrick->setSchemes($schemas);
  177.         $good->save();
  178.     }
  179.     private function updateManuals(Asset $asset)
  180.     {
  181.         $goodAssetFolder $asset->getParent();
  182.         $good Good::getByAssetFolder($goodAssetFolder)->getObjects();
  183.         if (!$good) return;
  184.         $good $good[0];
  185.         $goodAssets $goodAssetFolder->getChildren();
  186.         $manualsAssets array_filter($goodAssets, fn($asset)=> str_contains($asset->getFilename(), '_manual_'));
  187.         $manualsAssets $this->processSpecificAssetsArray($asset$manualsAssetsself::$fileRewrite);
  188.         $marketingBrick $good->getMarketingProps()->getMarketingBrick();
  189.         $marketingBrick->setManuals($manualsAssets);
  190.         $good->save();
  191.     }
  192.     private function processSpecificAssetsArray(Asset $currentAsset$assets = [], $isRewrite false) : array
  193.     {
  194.         $out $assets;
  195.         if ($assets) {
  196.             if ($isRewrite) {
  197.                 $rewritingFileIndex array_search($currentAsset->getFilename(), array_map(fn($arrayAsset) => $arrayAsset $arrayAsset->getFilename() : false$assets));
  198.                 if ($rewritingFileIndex !== false) {
  199.                     $out[$rewritingFileIndex] = $currentAsset;
  200.                 } else {
  201.                     $out[] = $currentAsset;
  202.                 }
  203.             } else {
  204.                 $out[] = $currentAsset;
  205.             }
  206.         } else {
  207.             $out = [$currentAsset];
  208.         }
  209.         return $out;
  210.     }
  211.     private function assetMeetsNamingRequirements(Asset $assetstring $type ""): bool
  212.     {
  213.         $good Good::getByAssetFolder($asset->getParent())->getObjects();
  214.         if (!$good) return false;
  215.         $this->namingValidator->setAsset($asset);
  216.         return $this->namingValidator->validateByType($type$good[0]->getArticle());
  217.     }
  218. }