<?phpnamespace App\V4\EventSubscriber;use App\Model\Exception\MethodForProductAttributeDefaultValueFieldNotFoundException;use App\Model\Product\Product;use App\V4\Form\Type\QuoteLineInfo\QuoteLineInfoType;use App\V4\Logger\SentryLogger;use App\V4\Model\ProductConfiguration\ProductConfiguration;use App\V4\Model\QuoteLineInfo\QuoteLineInfo;use App\V4\Model\QuoteLineInfoProductAttribute\QuoteLineInfoProductAttribute;use Doctrine\Common\Collections\ArrayCollection;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Symfony\Component\Form\Event\PostSetDataEvent;use Symfony\Component\Form\FormEvents;class QuoteLineInfoProductAttributeFormEventSubscriber implements EventSubscriberInterface{ /** * @var SentryLogger */ private $sentryLogger; public function __construct(SentryLogger $sentryLogger) { $this->sentryLogger = $sentryLogger; } /** * @return array */ public static function getSubscribedEvents(): array { return [ FormEvents::POST_SET_DATA => 'onPostSetData', ]; } /** * @param PostSetDataEvent $event * * @return bool */ public function supports(PostSetDataEvent $event): bool { return $event->getForm()->getConfig()->getType()->getInnerType() instanceof QuoteLineInfoType && $event->getForm()->getData() instanceof QuoteLineInfo && $event->getForm()->getData()->getProduct() instanceof Product && $event->getForm()->getData()->getProduct()->getProductConfiguration() instanceof ProductConfiguration ; } /** * @param PostSetDataEvent $event * * @return void * * @throws \Exception */ public function onPostSetData(PostSetDataEvent $event): void { /** @var QuoteLineInfo $quoteLineInfo */ $quoteLineInfo = $event->getForm()->getData(); if ($this->supports($event)) { $quoteLineInfoProductAttributesToForm = new ArrayCollection(); foreach ($quoteLineInfo->getProduct()->getProductConfiguration()->getProductAttributes() as $productAttribute) { // se baser sur getData et non la requete qui est pas bonne $quoteLineInfoProductAttributes = $quoteLineInfo->getQuoteLineInfoProductAttributes(); $quoteLineInfoProductAttributeFind = null; /** @var QuoteLineInfoProductAttribute $quoteLineInfoProductAttribute */ foreach ($quoteLineInfoProductAttributes as $quoteLineInfoProductAttribute) { if ($productAttribute->getLabel() === $quoteLineInfoProductAttribute->getProductAttributeLabel()) { $quoteLineInfoProductAttributeFind = $quoteLineInfoProductAttribute; break; } } if (null === $quoteLineInfoProductAttributeFind) { $quoteLineInfoProductAttributeFind = (new QuoteLineInfoProductAttribute()) ->setProductAttribute($productAttribute) ->setProductAttributeLabel($productAttribute->getLabel()) ->setProductAttributePosition($productAttribute->getPosition()) ; if (null !== $productAttribute->getDefaultValueField()) { try { $getter = 'get'.ucfirst($productAttribute->getDefaultValueField()); if (!method_exists($quoteLineInfo->getProduct(), $getter)) { throw new MethodForProductAttributeDefaultValueFieldNotFoundException(sprintf('method %s not found for Product class', $getter)); } $quoteLineInfoProductAttributeFind->setValue($quoteLineInfo->getProduct()->$getter()); } catch (MethodForProductAttributeDefaultValueFieldNotFoundException $e) { $this->sentryLogger->captureException( SentryLogger::CHANNEL_SUBSCRIBER, $e, [ 'catchOnClass' => self::class, 'defaultValueField' => $productAttribute->getDefaultValueField(), 'getter' => $getter, ] ); } } } $quoteLineInfoProductAttributesToForm->add($quoteLineInfoProductAttributeFind); } $event->getForm()->get('quoteLineInfoProductAttributes')->setData($quoteLineInfoProductAttributesToForm); } }}