src/EventListener/LogChangesListener.php line 45

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use Exception;
  4. use Pimcore\Db;
  5. use Pimcore\Event\Model\ElementEventInterface;
  6. use Pimcore\Model\Asset;
  7. use Pimcore\Model\DataObject;
  8. use Pimcore\Model\DataObject\Krankheitsmeldung;
  9. use Pimcore\Model\DataObject\Unfallmeldung;
  10. use Pimcore\Model\User;
  11. use Pimcore\Tool\Admin;
  12. use Pimcore\Tool\Session;
  13. class LogChangesListener
  14. {
  15.     const CHANGES_FOLDER_PATH 'Ă„nderungen';
  16.     const CLASS_ID 'Krankheitsmeldung';
  17.     const CLASS_ID_UNFALLMELDUNG 'Unfallmeldung';
  18.     const ASSET_FIELD_NAME 'assets'// many-to-many relation
  19.     const CHANGELOG_FIELD_NAME 'changeLog'// many-to-many object relation
  20.     const CHANGED_ACTION 'changed';
  21.     const REMOVED_ACTION 'removed';
  22.     const ASSIGNED_ACTION 'assigned';
  23.     const UNASSIGNED_ACTION 'unassigned';
  24.     
  25.     /**
  26.      * @param ElementEventInterface $e
  27.      * @return void
  28.      * @throws Exception
  29.      */
  30.     public function onPreUpdate(ElementEventInterface $e)
  31.     {
  32.         $asset $e->getAsset();
  33.         $this->createLogFileForAsset($assetself::CHANGED_ACTION);
  34.     }
  35.     /**
  36.      * @param ElementEventInterface $e
  37.      * @return void
  38.      * @throws Exception
  39.      */
  40.     public function onPreDelete(ElementEventInterface $e)
  41.     {
  42.         $asset $e->getAsset();
  43.         $this->createLogFileForAsset($assetself::REMOVED_ACTION);
  44.     }
  45.     /**
  46.      * @param $assetId
  47.      * @param $assetName
  48.      * @param $userName
  49.      * @param $action
  50.      * @return DataObject
  51.      * @throws Exception
  52.      */
  53.     private function createLogFile(Asset $asset$action): DataObject
  54.     {
  55.         $folderPath '/'.ltrim(self::CHANGES_FOLDER_PATH'/');
  56.         $folder DataObject\Service::createFolderByPath($folderPath);
  57.         if (!$folder) {
  58.             throw new \LogicException('Could not create folder "'.$folderPath.'"');
  59.         }
  60.         $logFile = new \Pimcore\Model\DataObject\LogFile();
  61.         $logFile->setParent($folder);
  62.         $logFile->setKey($asset->getId().'_'.$action.'_'.date('Y-m-d-H-i-s'));
  63.         $logFile->setLog('Asset '.$asset->getFilename().' '.$action);
  64.         $user Admin::getCurrentUser();
  65.         if($user) {
  66.             $logFile->setUser($user->getName());
  67.         }
  68.         $logFile->setPublished(true);
  69.         $logFile->save();
  70.         return $logFile;
  71.     }
  72.     /**
  73.      * @param Asset asset
  74.      * @param string $action
  75.      * @return void
  76.      * @throws Exception
  77.      */
  78.     private function createLogFileForAsset(Asset $asset$action)
  79.     {
  80.         $className $this->getClassId($asset);
  81.         if(!$className) {
  82.             return false;
  83.         }
  84.         $relations Db::get()->fetchAll('SELECT src_id FROM object_relations_'.$className.' WHERE dest_id = ? AND fieldname = ?', [$asset->getId(), self::ASSET_FIELD_NAME]);
  85.         try {
  86.             $logFile $this->createLogFile($asset$action);
  87.         } catch (Exception $exception) {
  88.             return;
  89.         }
  90.         $changeLogGetter 'get'.ucfirst(self::CHANGELOG_FIELD_NAME);
  91.         $changeLogSetter 'set'.ucfirst(self::CHANGELOG_FIELD_NAME);
  92.         foreach ($relations as $rel) {
  93.             $objectWithCurrentAsset DataObject::getById($rel['src_id']);
  94.             if(!$objectWithCurrentAsset instanceof DataObject) {
  95.                 continue;
  96.             }
  97.             $changeLogs $objectWithCurrentAsset->$changeLogGetter();
  98.             $changeLogs[] = $logFile;
  99.             $objectWithCurrentAsset->$changeLogSetter($changeLogs);
  100.             $objectWithCurrentAsset->save();
  101.         }
  102.     }
  103.     /**
  104.      * @param ElementEventInterface $e
  105.      * @return void
  106.      * @throws Exception
  107.      */
  108.     public function objectUpdate(ElementEventInterface $e)
  109.     {
  110.         if (method_exists($e'getArgument')) {
  111.             try {
  112.                 $saveVersionOnly $e->getArgument('saveVersionOnly');
  113.                 if ($saveVersionOnly) {
  114.                     return;
  115.                 }
  116.             } catch (\InvalidArgumentException $exception) {
  117.             }
  118.         }
  119.         $object $e->getObject();
  120.         if (!method_exists($object'getClassId')) {
  121.             return;
  122.         }
  123.         if ($object->getClassId() === self::CLASS_ID || $object->getClassId() === self::CLASS_ID_UNFALLMELDUNG) {
  124.             $versions $object->getVersions();
  125.             $previousVersion $versions[count($versions) - 1];
  126.             $assetGetter 'get'.ucfirst(self::ASSET_FIELD_NAME);
  127.             $prevAssets $previousVersion->getData()->$assetGetter();
  128.             $curAssets $object->$assetGetter();
  129.             $this->updateChangeLogList((array)$prevAssets, (array)$curAssets$objectself::UNASSIGNED_ACTION);
  130.             $this->updateChangeLogList((array)$curAssets, (array)$prevAssets$objectself::ASSIGNED_ACTION);
  131.         }
  132.     }
  133.     /**
  134.      * @param Asset[] $assetArray1
  135.      * @param Asset[] $assetArray2
  136.      * @param DataObject\Concrete$object
  137.      * @param string $action
  138.      * @return void
  139.      */
  140.     private function updateChangeLogList(array $assetArray1, array $assetArray2DataObject\Concrete $object$action)
  141.     {
  142.         foreach ($assetArray1 as $asset) {
  143.             if(!$asset instanceof Asset) {
  144.                 continue;
  145.             }
  146.             $exists false;
  147.             foreach ($assetArray2 as $item) {
  148.                 if(!$item instanceof Asset) {
  149.                     continue;
  150.                 }
  151.                 if ($item->getId() == $asset->getId()) {
  152.                     $exists true;
  153.                     break;
  154.                 }
  155.             }
  156.             if ($exists) {
  157.                 continue;
  158.             }
  159.             try {
  160.                 $changeLogsGetter 'get'.ucfirst(self::CHANGELOG_FIELD_NAME);
  161.                 $changeLogs $object->$changeLogsGetter();
  162.                 $logFile $this->createLogFile($asset$action);
  163.                 $changeLogs[] = $logFile;
  164.                 $object->setChangeLog($changeLogs);
  165.                 //TODO: prakash
  166.                 if($action === self::UNASSIGNED_ACTION) {
  167.                     $asset->delete();
  168.                 }
  169.             } catch (Exception $exception) {
  170.                 continue;
  171.             }
  172.         }
  173.     }
  174.     private function getClassId(Asset $asset)
  175.     {
  176.         $path $asset->getPath();
  177.         $uuid trim($path'/');
  178.         $sickness Krankheitsmeldung::getByInterne_Schadennummer($uuid)->current();
  179.         if ($sickness instanceof Krankheitsmeldung && $sickness->getId()) {
  180.            return self::CLASS_ID;
  181.         }
  182.         $accident Unfallmeldung::getByInterne_Schadennummer($uuid)->current();
  183.         if ($accident instanceof Unfallmeldung && $accident->getId()) {
  184.                 return self::CLASS_ID_UNFALLMELDUNG;
  185.         }
  186.         return false;
  187.     }
  188. }