src/Component/RFQ/Form/Type/RFQType.php line 43

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace BitBag\OpenMarketplace\Component\RFQ\Form\Type;
  4. use BitBag\OpenMarketplace\Component\Addressing\Entity\Country;
  5. use BitBag\OpenMarketplace\Component\Addressing\Form\Resolver\AllowedCountriesResolverInterface;
  6. use BitBag\OpenMarketplace\Component\Customer\Model\CustomerInterface;
  7. use BitBag\OpenMarketplace\Component\Organization\Entity\OrganizationInterface;
  8. use BitBag\OpenMarketplace\Component\Organization\Form\Type\CustomerType;
  9. use BitBag\OpenMarketplace\Component\RFQ\Entity\MessageInterface;
  10. use BitBag\OpenMarketplace\Component\RFQ\Entity\RFQInterface;
  11. use BitBag\OpenMarketplace\Component\RFQ\Factory\MessageFactoryInterface;
  12. use Doctrine\Common\Collections\ArrayCollection;
  13. use EWZ\Bundle\RecaptchaBundle\Form\Type\EWZRecaptchaV3Type;
  14. use Sylius\Bundle\AddressingBundle\Form\Type\CountryChoiceType;
  15. use Sylius\Bundle\ResourceBundle\Form\Type\AbstractResourceType;
  16. use Sylius\Component\Core\Context\ShopperContextInterface;
  17. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  18. use Symfony\Component\Form\Extension\Core\Type\CollectionType;
  19. use Symfony\Component\Form\Extension\Core\Type\IntegerType;
  20. use Symfony\Component\Form\Extension\Core\Type\TextType;
  21. use Symfony\Component\Form\FormBuilderInterface;
  22. use Symfony\Component\Form\FormEvent;
  23. use Symfony\Component\Form\FormEvents;
  24. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  25. final class RFQType extends AbstractResourceType
  26. {
  27.     public function __construct(
  28.         protected string $dataClass,
  29.         private ShopperContextInterface $shopperContext,
  30.         private MessageFactoryInterface $messageFactory,
  31.         private AllowedCountriesResolverInterface $allowedCountriesResolver,
  32.         private SessionInterface $session,
  33.         ) {
  34.         parent::__construct($this->dataClass);
  35.     }
  36.     public function buildForm(FormBuilderInterface $builder, array $options): void
  37.     {
  38.         $sessionData $this->session->get('rfq_form_data', []);
  39.         $sessionRfqData $sessionData['app_rfq'] ?? [];
  40.         $sessionRfqMessage = new ArrayCollection(
  41.             array_map(function ($messageData) {
  42.                 $messageText $messageData['message'] ?? '';
  43.                 if (!empty($messageText)) {
  44.                     /** @var MessageInterface $message */
  45.                     $message $this->messageFactory->createNew();
  46.                     $message->setMessage($messageText);
  47.                     return $message;
  48.                 }
  49.                 return null;
  50.             }, $sessionRfqData['messages'] ?? [])
  51.         );
  52.         $sessionRfqMessage $sessionRfqMessage->filter(fn ($msg) => null !== $msg);
  53.         if ($sessionRfqMessage->isEmpty()) {
  54.             /** @var MessageInterface $defaultMessage */
  55.             $defaultMessage $this->messageFactory->createNew();
  56.             $defaultMessage->setMessage('');
  57.             $sessionRfqMessage->add($defaultMessage);
  58.         }
  59.         $builder
  60.             ->add('country'CountryChoiceType::class, [
  61.                 'label' => 'sylius.ui.country',
  62.                 'required' => true,
  63.                 'multiple' => false,
  64.                 'expanded' => false,
  65.                 'choices' => $this->allowedCountriesResolver->resolveForRfq($options['data']),
  66.                 'data' => $this->getSelectedCountryEntity($sessionRfqData['country'] ?? null$this->allowedCountriesResolver->resolveForRfq($options['data'])),
  67.             ])
  68.             ->add('quantity'IntegerType::class, [
  69.                 'label' => 'sylius.ui.quantity',
  70.                 'required' => true,
  71.                 'data' => $sessionRfqData['quantity'] ?? null,
  72.             ])
  73.             ->add('messages'CollectionType::class, [
  74.                 'entry_type' => MessageType::class,
  75.                 'required' => false,
  76.                 'prototype' => true,
  77.                 'allow_add' => false,
  78.                 'allow_delete' => false,
  79.                 'by_reference' => false,
  80.                 'label' => false,
  81.                 'data' => $sessionRfqMessage,
  82.             ])
  83.             ->add('subject'TextType::class, [
  84.                 'required' => false,
  85.                 'label' => 'sylius.ui.subject',
  86.                 'empty_data' => 'Request for quote',
  87.             ])
  88.             ->add('termsAccepted'CheckboxType::class, [
  89.                 'required' => true,
  90.                 'label' => false,
  91.                 'help' => 'app.form.inquiry.terms',
  92.             ])
  93.             ->add('customer'CustomerType::class)
  94.             ->add('recaptcha'EWZRecaptchaV3Type::class, [
  95.                 'label' => false,
  96.                 'error_bubbling' => true,
  97.                 'mapped' => true,
  98.             ])
  99.         ;
  100.         $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
  101.             /** @var RFQInterface $rfq */
  102.             $rfq $event->getData();
  103.             if (false === $rfq->getMessages()->isEmpty()) {
  104.                 return;
  105.             }
  106.             /** @var ?CustomerInterface $customer */
  107.             $customer $this->shopperContext->getCustomer();
  108.             $organization $customer?->getOrganization();
  109.             if (!$organization instanceof OrganizationInterface) {
  110.                 /** @var MessageInterface $message */
  111.                 $message $this->messageFactory->createNew();
  112.                 $rfq->addMessage($message);
  113.                 return;
  114.             }
  115.             $form $event->getForm();
  116.             $form
  117.                 ->add('customer'CustomerType::class, [
  118.                     'data' => $customer,
  119.                     'disabled' => true,
  120.                 ]);
  121.             $message $this->messageFactory->createForCustomer($customer);
  122.             $rfq->setBuyer($organization);
  123.             $rfq->addMessage($message);
  124.         });
  125.     }
  126.     public function getBlockPrefix(): string
  127.     {
  128.         return 'app_rfq';
  129.     }
  130.     private function getSelectedCountryEntity(?string $countryCode, array $allowedCountries): ?Country
  131.     {
  132.         if (!$countryCode) {
  133.             return null;
  134.         }
  135.         foreach ($allowedCountries as $country) {
  136.             if ($country->getCode() === $countryCode) {
  137.                 return $country;
  138.             }
  139.         }
  140.         return null;
  141.     }
  142. }