src/UserPanel/Modules/OnlineService/Form/CreatorType.php line 18
<?phpnamespace App\UserPanel\Modules\OnlineService\Form;use Symfony\Component\OptionsResolver\OptionsResolver;use Symfony\Component\Form\AbstractType;use Symfony\Component\Form\FormBuilderInterface;use Symfony\Component\Form\Form;use Symfony\Component\Form\FormEvent;use Symfony\Component\Form\FormEvents;use Symfony\Component\Validator\Constraints as Assert;use Symfony\Bridge\Doctrine\Form\Type\EntityType;use App\Service\CurrencyHelperService;use App\Admin\Modules\OnlineService\Service\SettingsService as AdminOnlineServiceSettingsService;use App\Admin\Modules\OnlineService\Service\CreatorPriceListService as AdminCreatorPriceListService;use App\Admin\Modules\OnlineService\Entity\OnlineServiceCreatorCategoryItem;class CreatorType extends AbstractType{public $category;public $summaryData;private $_currencyHelperService;private $_adminOnlineServiceSettingsService;private $_adminCreatorPriceListService;private $_settingsData;public function __construct(CurrencyHelperService $currencyHelperService,AdminOnlineServiceSettingsService $adminOnlineServiceSettingsService,AdminCreatorPriceListService $adminCreatorPriceListService){$this->_currencyHelperService = $currencyHelperService;$this->_adminOnlineServiceSettingsService = $adminOnlineServiceSettingsService;$this->_adminCreatorPriceListService = $adminCreatorPriceListService;}public function configureOptions(OptionsResolver $resolver){$resolver->setRequired('category');}public function buildForm(FormBuilderInterface $builder, array $options){$this->category = $options['category'];if (!count($this->category->getItems()))throw new \Exception('Brak pozycji w kategorii.');$this->_settingsData = $this->_adminOnlineServiceSettingsService->getData();$builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event){$form = $event->getForm();$data = $event->getData();$this->_initForm($form, $data, FormEvents::PRE_SET_DATA);$event->setData($data);})->addEventListener(FormEvents::PRE_SUBMIT, function(FormEvent $event){$form = $event->getForm();$data = $event->getData();foreach($form as $name => $field)$form->remove($name);$this->_initForm($form, $data, FormEvents::PRE_SUBMIT);$event->setData($data);})->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event){$this->_setSummary($event->getData());});}private function _initForm(Form $form, &$data, $eventName){$requiredItems = array();foreach($this->category->getItems() as $item){if ($item->getIsRequired())$requiredItems[] = $item;}if ($eventName == FormEvents::PRE_SET_DATA){if (!$data)$data = array();foreach($requiredItems as $requiredItem)$data['items'][] = $requiredItem;}else{$items = $data['items'] ?? [];foreach($requiredItems as $requiredItem){if (!in_array($requiredItem->getId(), $items))$items[] = $requiredItem->getId();}$data['items'] = $items;}$form->add('items', EntityType::class, array('class' => OnlineServiceCreatorCategoryItem::class,'label' => false,'multiple' => true,'expanded' => true,'placeholder' => false,'choices' => $this->category->getItems(),'constraints' => array(new Assert\Count(['min' => 1]))));if ($eventName == FormEvents::PRE_SET_DATA)$this->_setSummary($data);}private function _setSummary(array $data){$this->summaryData = array('vat' => $this->_settingsData['vat'] ?? 0,'total_price' => 0,'total_gross_price' => 0);if (empty($data['items']))return;foreach($data['items'] as $item){$priceListItemData = $this->_adminCreatorPriceListService->getItemDetails($item->getPriceListItem());$this->summaryData['total_price'] += $item->getPriceListItem()->getPrice();$this->summaryData['total_gross_price'] += $priceListItemData['gross_price'];}}}