src/AppBundle/EventListener/PromotionsEventListener.php line 27

Open in your IDE?
  1. <?php
  2. namespace AppBundle\EventListener;
  3. use AppBundle\EventListener\Validator\PromotionsEventListenerValidator;
  4. use AppBundle\Service\TrimSpacesService;
  5. use Pimcore\Event\Model\ElementEventInterface;
  6. use Pimcore\Model\DataObject\Promotions;
  7. use Symfony\Component\Messenger\MessageBusInterface;
  8. class PromotionsEventListener extends DataObjectEventListener
  9. {
  10.     const PIMCORE_DATA_OBJECT_CLASS_PATH Promotions::class;
  11.     protected $object;
  12.     private $trimSpacesService;
  13.     public function __construct(MessageBusInterface $messageBus){
  14.         parent::__construct($messageBus);
  15.         $this->trimSpacesService = new TrimSpacesService();
  16.     }
  17.     /**
  18.      * @param ElementEventInterface $event
  19.      * @return void
  20.      * @throws \Doctrine\DBAL\DBALException
  21.      */
  22.     public function onObjectPreAdd(ElementEventInterface $event): void {
  23.         // Not Promotions DataObject?
  24.         if(!$this->eventBelongsToThisClass($event)){
  25.             return;
  26.         }
  27.         $validator = new PromotionsEventListenerValidator();
  28.         $validator->validatePreAdd($this->object);
  29.         $this->onObjectPrePersist($event);
  30.     }
  31.     /**
  32.      * @param ElementEventInterface $event
  33.      * @return void
  34.      * @throws \Doctrine\DBAL\DBALException
  35.      */
  36.     public function onObjectPreUpdate(ElementEventInterface $event): void {
  37.         // Not Promotions DataObject?
  38.         if(!$this->eventBelongsToThisClass($event)){
  39.             return;
  40.         }
  41.         $validator = new PromotionsEventListenerValidator();
  42.         $validator->validatePreUpdate($this->object);
  43.         $this->onObjectPrePersist($event);
  44.         $this->forceUpdateCategoryAndBrandTimestamps();
  45.     }
  46.     /**
  47.      * @param ElementEventInterface $event
  48.      * @return void
  49.      */
  50.     public function onObjectPrePersist(ElementEventInterface $event): void {
  51.         $promotion $this->trimSpacesService->trimSpaces($this->object->getPromotion());
  52.         $this->object->setPromotion($promotion);
  53.     }
  54.     /**
  55.      * @return void
  56.      * @throws \Doctrine\DBAL\DBALException
  57.      */
  58.     private function forceUpdateCategoryAndBrandTimestamps(): void {
  59.         $db = \Pimcore\Db::get();
  60.         // Get list of all Marken assigned to this object:
  61.         $marken $this->object->getMarken();
  62.         $markenIdsArr = [];
  63.         // Iterate through them and fetch the ids
  64.         foreach($marken as $marke){
  65.             $markenIdsArr[] = $marke->getObjectId();
  66.         }
  67.         $markenIdsStr implode(","$markenIdsArr);
  68.         // Update it in the DB
  69.         $markenQuery "UPDATE objects
  70.                     SET o_modificationDate = UNIX_TIMESTAMP()
  71.                     WHERE o_id IN ({$markenIdsStr})";
  72.         $kategorien $this->object->getKategorien();
  73.         $kategorienIdsArr = [];
  74.         // Iterate through them and fetch the ids
  75.         foreach($kategorien as $category){
  76.             $kategorienIdsArr[] = $category->getObjectId();
  77.         }
  78.         $kategorienIdsStr implode(","$kategorienIdsArr);
  79.         // Update it in the DB
  80.         $kategorienQuery "UPDATE objects
  81.                     SET o_modificationDate = UNIX_TIMESTAMP()
  82.                     WHERE o_id IN ({$kategorienIdsStr})";
  83.         try{
  84.             $db->beginTransaction();
  85.             if(count($markenIdsArr) > 0){
  86.                 $db->executeQuery($markenQuery);
  87.             }
  88.             if(count($kategorienIdsArr) > 0){
  89.                 $db->executeQuery($kategorienQuery);
  90.             }
  91.             $db->commit();
  92.         }catch(\Throwable $throwable){
  93.             $db->rollBack();
  94.             throw new \Exception("Failed to update timestamps for Brands and Categories, please try saving again!");
  95.         }
  96.     }
  97. }