src/Component/Inquiry/Form/Type/InquiryType.php line 42

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