<?php
namespace 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);
}
}
}