src/V4/EventSubscriber/QuoteLineInfoProductAttributeFormEventSubscriber.php line 60

Open in your IDE?
  1. <?php
  2. namespace App\V4\EventSubscriber;
  3. use App\Model\Exception\MethodForProductAttributeDefaultValueFieldNotFoundException;
  4. use App\Model\Product\Product;
  5. use App\V4\Form\Type\QuoteLineInfo\QuoteLineInfoType;
  6. use App\V4\Logger\SentryLogger;
  7. use App\V4\Model\ProductConfiguration\ProductConfiguration;
  8. use App\V4\Model\QuoteLineInfo\QuoteLineInfo;
  9. use App\V4\Model\QuoteLineInfoProductAttribute\QuoteLineInfoProductAttribute;
  10. use Doctrine\Common\Collections\ArrayCollection;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Symfony\Component\Form\Event\PostSetDataEvent;
  13. use Symfony\Component\Form\FormEvents;
  14. class QuoteLineInfoProductAttributeFormEventSubscriber implements EventSubscriberInterface
  15. {
  16.     /**
  17.      * @var SentryLogger
  18.      */
  19.     private $sentryLogger;
  20.     public function __construct(SentryLogger $sentryLogger)
  21.     {
  22.         $this->sentryLogger $sentryLogger;
  23.     }
  24.     /**
  25.      * @return array
  26.      */
  27.     public static function getSubscribedEvents(): array
  28.     {
  29.         return [
  30.             FormEvents::POST_SET_DATA => 'onPostSetData',
  31.         ];
  32.     }
  33.     /**
  34.      * @param PostSetDataEvent $event
  35.      *
  36.      * @return bool
  37.      */
  38.     public function supports(PostSetDataEvent $event): bool
  39.     {
  40.         return $event->getForm()->getConfig()->getType()->getInnerType() instanceof QuoteLineInfoType
  41.             && $event->getForm()->getData() instanceof QuoteLineInfo
  42.             && $event->getForm()->getData()->getProduct() instanceof Product
  43.             && $event->getForm()->getData()->getProduct()->getProductConfiguration() instanceof ProductConfiguration
  44.         ;
  45.     }
  46.     /**
  47.      * @param PostSetDataEvent $event
  48.      *
  49.      * @return void
  50.      *
  51.      * @throws \Exception
  52.      */
  53.     public function onPostSetData(PostSetDataEvent $event): void
  54.     {
  55.         /** @var QuoteLineInfo $quoteLineInfo */
  56.         $quoteLineInfo $event->getForm()->getData();
  57.         if ($this->supports($event)) {
  58.             $quoteLineInfoProductAttributesToForm = new ArrayCollection();
  59.             foreach ($quoteLineInfo->getProduct()->getProductConfiguration()->getProductAttributes() as $productAttribute) {
  60.                 // se baser sur getData et non la requete qui est pas bonne
  61.                 $quoteLineInfoProductAttributes $quoteLineInfo->getQuoteLineInfoProductAttributes();
  62.                 $quoteLineInfoProductAttributeFind null;
  63.                 /** @var QuoteLineInfoProductAttribute $quoteLineInfoProductAttribute */
  64.                 foreach ($quoteLineInfoProductAttributes as $quoteLineInfoProductAttribute) {
  65.                     if ($productAttribute->getLabel() === $quoteLineInfoProductAttribute->getProductAttributeLabel()) {
  66.                         $quoteLineInfoProductAttributeFind $quoteLineInfoProductAttribute;
  67.                         break;
  68.                     }
  69.                 }
  70.                 if (null === $quoteLineInfoProductAttributeFind) {
  71.                     $quoteLineInfoProductAttributeFind = (new QuoteLineInfoProductAttribute())
  72.                         ->setProductAttribute($productAttribute)
  73.                         ->setProductAttributeLabel($productAttribute->getLabel())
  74.                         ->setProductAttributePosition($productAttribute->getPosition())
  75.                     ;
  76.                     if (null !== $productAttribute->getDefaultValueField()) {
  77.                         try {
  78.                             $getter 'get'.ucfirst($productAttribute->getDefaultValueField());
  79.                             if (!method_exists($quoteLineInfo->getProduct(), $getter)) {
  80.                                 throw new MethodForProductAttributeDefaultValueFieldNotFoundException(sprintf('method %s not found for Product class'$getter));
  81.                             }
  82.                             $quoteLineInfoProductAttributeFind->setValue($quoteLineInfo->getProduct()->$getter());
  83.                         } catch (MethodForProductAttributeDefaultValueFieldNotFoundException $e) {
  84.                             $this->sentryLogger->captureException(
  85.                                 SentryLogger::CHANNEL_SUBSCRIBER,
  86.                                 $e,
  87.                                 [
  88.                                     'catchOnClass' => self::class,
  89.                                     'defaultValueField' => $productAttribute->getDefaultValueField(),
  90.                                     'getter' => $getter,
  91.                                 ]
  92.                             );
  93.                         }
  94.                     }
  95.                 }
  96.                 $quoteLineInfoProductAttributesToForm->add($quoteLineInfoProductAttributeFind);
  97.             }
  98.             $event->getForm()->get('quoteLineInfoProductAttributes')->setData($quoteLineInfoProductAttributesToForm);
  99.         }
  100.     }
  101. }