src/UserPanel/Modules/OnlineService/Form/CreatorType.php line 18

  1. <?php
  2. namespace App\UserPanel\Modules\OnlineService\Form;
  3. use Symfony\Component\OptionsResolver\OptionsResolver;
  4. use Symfony\Component\Form\AbstractType;
  5. use Symfony\Component\Form\FormBuilderInterface;
  6. use Symfony\Component\Form\Form;
  7. use Symfony\Component\Form\FormEvent;
  8. use Symfony\Component\Form\FormEvents;
  9. use Symfony\Component\Validator\Constraints as Assert;
  10. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  11. use App\Service\CurrencyHelperService;
  12. use App\Admin\Modules\OnlineService\Service\SettingsService as AdminOnlineServiceSettingsService;
  13. use App\Admin\Modules\OnlineService\Service\CreatorPriceListService as AdminCreatorPriceListService;
  14. use App\Admin\Modules\OnlineService\Entity\OnlineServiceCreatorCategoryItem;
  15. class CreatorType extends AbstractType
  16. {
  17.     public $category;
  18.     public $summaryData;
  19.     
  20.     private $_currencyHelperService;
  21.     private $_adminOnlineServiceSettingsService;
  22.     private $_adminCreatorPriceListService;
  23.     private $_settingsData;
  24.     
  25.     public function __construct(
  26.             CurrencyHelperService $currencyHelperService,
  27.             AdminOnlineServiceSettingsService $adminOnlineServiceSettingsService,
  28.             AdminCreatorPriceListService $adminCreatorPriceListService)
  29.     {
  30.         $this->_currencyHelperService $currencyHelperService;
  31.         $this->_adminOnlineServiceSettingsService $adminOnlineServiceSettingsService;
  32.         $this->_adminCreatorPriceListService $adminCreatorPriceListService;
  33.     }
  34.     
  35.     public function configureOptions(OptionsResolver $resolver)
  36.     {
  37.         $resolver->setRequired('category');
  38.     }
  39.     
  40.     public function buildForm(FormBuilderInterface $builder, array $options)
  41.     {
  42.         $this->category $options['category'];
  43.         
  44.         if (!count($this->category->getItems()))
  45.             throw new \Exception('Brak pozycji w kategorii.');
  46.         
  47.         $this->_settingsData $this->_adminOnlineServiceSettingsService->getData();
  48.         $builder
  49.             ->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event)
  50.             {
  51.                 $form $event->getForm();
  52.                 $data $event->getData();
  53.                 
  54.                 $this->_initForm($form$dataFormEvents::PRE_SET_DATA);
  55.                 
  56.                 $event->setData($data);
  57.             })
  58.             ->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event)
  59.             {
  60.                 $form $event->getForm();
  61.                 $data $event->getData();
  62.                 
  63.                 foreach($form as $name => $field)
  64.                     $form->remove($name);
  65.                 
  66.                 $this->_initForm($form$dataFormEvents::PRE_SUBMIT);
  67.                 $event->setData($data);
  68.             })
  69.             ->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event)
  70.             {
  71.                 $this->_setSummary($event->getData());
  72.             });                
  73.     }
  74.     
  75.     private function _initForm(Form $form, &$data$eventName)
  76.     {
  77.         $requiredItems = array();
  78.             
  79.         foreach($this->category->getItems() as $item)
  80.         {
  81.             if ($item->getIsRequired())
  82.                 $requiredItems[] = $item;
  83.         }
  84.         
  85.         if ($eventName == FormEvents::PRE_SET_DATA)
  86.         {
  87.             if (!$data)
  88.                 $data = array();
  89.             
  90.             foreach($requiredItems as $requiredItem)
  91.                 $data['items'][] = $requiredItem;
  92.         }
  93.         else
  94.         {
  95.             $items $data['items'] ?? [];
  96.             
  97.             foreach($requiredItems as $requiredItem)
  98.             {
  99.                 if (!in_array($requiredItem->getId(), $items))
  100.                     $items[] = $requiredItem->getId();
  101.             }
  102.             
  103.             $data['items'] = $items;
  104.         }
  105.       
  106.         $form->add('items'EntityType::class, array(
  107.                 'class' => OnlineServiceCreatorCategoryItem::class,
  108.                 'label' => false,
  109.                 'multiple' => true,
  110.                 'expanded' => true,
  111.                 'placeholder' => false,
  112.                 'choices' => $this->category->getItems(),
  113.                 'constraints' => array(
  114.                     new Assert\Count(['min' => 1])
  115.                 )            
  116.             ));
  117.         
  118.         if ($eventName == FormEvents::PRE_SET_DATA)
  119.             $this->_setSummary($data);
  120.     }
  121.     
  122.     private function _setSummary(array $data)
  123.     {
  124.         $this->summaryData = array(
  125.             'vat' => $this->_settingsData['vat'] ?? 0,
  126.             'total_price' => 0,
  127.             'total_gross_price' => 0
  128.         );
  129.         
  130.         if (empty($data['items']))
  131.             return;
  132.         
  133.         foreach($data['items'] as $item)
  134.         {
  135.             $priceListItemData $this->_adminCreatorPriceListService->getItemDetails($item->getPriceListItem());
  136.             
  137.             $this->summaryData['total_price'] += $item->getPriceListItem()->getPrice();
  138.             $this->summaryData['total_gross_price'] += $priceListItemData['gross_price'];
  139.         }
  140.     }
  141. }