<?php
namespace App\V4\Form\Type\QuoteLineInfo;
use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
use App\Form\Type\SpecificFieldType;
use App\Form\Type\SubresourceChoicesTrait;
use App\Model\Product\Product;
use App\Security\SecurityConfig;
use App\Service\Cache\CacheManager;
use App\V4\EventSubscriber\QuoteLineInfoProductAttributeFormEventSubscriber;
use App\V4\Form\AsyncSubresourceChoicesLoader;
use App\V4\Form\Type\QuoteLineInfoProductAttribute\QuoteLineInfoProductAttributeType;
use App\V4\Logger\SentryLogger;
use App\V4\Model\QuoteLineInfo\QuoteLineInfo;
use Psr\Cache\CacheException;
use Psr\Cache\InvalidArgumentException;
use Symfony\Component\Form\Event\PreSubmitEvent;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Validator\Constraints\Valid;
class QuoteLineInfoType extends SpecificFieldType
{
use SubresourceChoicesTrait {
getEntityChoices as private getEntityChoicesTrait;
}
/**
* @var CollectionDataProviderInterface
*/
private $collectionDataProvider;
/**
* @var CacheManager
*/
private $cacheManager;
/**
* @var Security
*/
private $security;
/**
* @var QuoteLineInfoProductAttributeFormEventSubscriber
*/
private $quoteLineInfoProductAttributeFormEventSubscriber;
/**
* @var SentryLogger
*/
private $sentryLogger;
/**
* @param CollectionDataProviderInterface $collectionDataProvider
* @param CacheManager $cacheManager
* @param Security $security
* @param QuoteLineInfoProductAttributeFormEventSubscriber $quoteLineInfoProductAttributeFormEventSubscriber
* @param SentryLogger $sentryLogger
*/
public function __construct(
CollectionDataProviderInterface $collectionDataProvider,
CacheManager $cacheManager,
Security $security,
QuoteLineInfoProductAttributeFormEventSubscriber $quoteLineInfoProductAttributeFormEventSubscriber,
SentryLogger $sentryLogger
) {
$this->collectionDataProvider = $collectionDataProvider;
$this->cacheManager = $cacheManager;
$this->security = $security;
$this->quoteLineInfoProductAttributeFormEventSubscriber = $quoteLineInfoProductAttributeFormEventSubscriber;
$this->sentryLogger = $sentryLogger;
}
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('product', ChoiceType::class, [
'choice_value' => 'id',
'choice_label' => 'name',
'choice_loader' => new AsyncSubresourceChoicesLoader(
$this->collectionDataProvider,
$this->cacheManager,
$this->sentryLogger,
Product::class
),
]);
if ($this->security->isGranted(SecurityConfig::MODULE_PRODUCT_CUSTOMIZE)) {
$builder->addEventSubscriber($this->quoteLineInfoProductAttributeFormEventSubscriber);
$builder
->add('quoteLineInfoProductAttributes', CollectionType::class, [
'label' => 'quote_line_info_product_attributes',
'entry_type' => QuoteLineInfoProductAttributeType::class,
'entry_options' => [
'allow_extra_fields' => $options['allow_extra_fields'] ?? false,
],
'prototype' => true,
'prototype_name' => 'quote_line_info_product_attributes__value__',
'allow_add' => true,
'allow_delete' => true,
'by_reference' => true,
'delete_empty' => true,
'required' => false,
'constraints' => [new Valid()],
'attr' => [
'data-hide-from-vieworders' => true,
],
]);
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (PreSubmitEvent $event) {
$quoteLineInfoType = $event->getData();
if ('[]' === $event->getData()['quoteLineInfoProductAttributes']) {
$quoteLineInfoType['quoteLineInfoProductAttributes'] = [];
$event->setData($quoteLineInfoType);
}
});
}
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => QuoteLineInfo::class,
'required' => false,
]);
}
/**
* @param string $entityFQCN
*
* @return array<string, object>
*
* @throws CacheException
* @throws InvalidArgumentException
*/
private function getEntityChoices(string $entityFQCN): array
{
return $this->getEntityChoicesTrait(
$this->collectionDataProvider,
$this->cacheManager,
$this->sentryLogger,
$entityFQCN
);
}
}