/** * {@inheritDoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { /** @var User $user */ $user = $this->securityContext->getToken()->getUser(); if (!$user) { throw new \LogicException('The DeliveryType cannot be used without an authenticated user!'); } $numDeliveryAddresses = $this->em->getRepository('EcommerceBundle:Address')->countTotal($user->getId(), false); // initialize delivery addresses options $selectDelivery['same'] = 'account.address.select.same'; if ($numDeliveryAddresses > 0) { $selectDelivery['existing'] = 'account.address.select.existing'; } $selectDelivery['new'] = 'account.address.select.new'; $builder->add('fullName', null, array('required' => false))->add('dni', null, array('required' => false))->add('address', null, array('required' => false))->add('city', TextType::class, array('required' => false))->add('state', EntityType::class, array('class' => 'CoreBundle:State', 'query_builder' => function (EntityRepository $er) { return $er->createQueryBuilder('c'); }, 'required' => false, 'placeholder' => 'Selecciona tu provincia', 'empty_data' => null))->add('postalCode', null, array('required' => false))->add('phone', null, array('required' => false))->add('phone2', null, array('required' => false))->add('preferredSchedule', ChoiceType::class, array('choices' => Delivery::getSchedules(), 'required' => false, 'choices_as_values' => true))->add('deliveryDni', TextType::class, array('required' => false))->add('deliveryAddress', TextType::class, array('required' => false))->add('deliveryCity', TextType::class, array('required' => false))->add('deliveryState', EntityType::class, array('class' => 'CoreBundle:State', 'query_builder' => function (EntityRepository $er) { return $er->createQueryBuilder('c'); }, 'required' => false, 'placeholder' => 'Selecciona tu provincia', 'empty_data' => null))->add('deliveryPostalCode', TextType::class, array('required' => false))->add('deliveryPhone', TextType::class, array('required' => false))->add('deliveryPhone2', TextType::class, array('required' => false))->add('deliveryPreferredSchedule', ChoiceType::class, array('choices' => Delivery::getSchedules(), 'required' => false))->add('notes', TextareaType::class, array('required' => false)); $factory = $builder->getFormFactory(); $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use($user, $numDeliveryAddresses, $factory) { $form = $event->getForm(); // delivery addresses if ($numDeliveryAddresses > 0) { $existingDeliveryAddress = null; // if ($this->session->has('select-delivery') && 'existing' === $this->session->get('select-delivery')) { // $existingDeliveryAddress = $this->session->get('existing-delivery-address'); // } $deliveryAddressData = !is_null($existingDeliveryAddress) ? $this->em->getReference('EcommerceBundle:Address', $existingDeliveryAddress) : null; $formOptions = array('class' => 'EcommerceBundle\\Entity\\Address', 'multiple' => false, 'expanded' => false, 'mapped' => false, 'required' => false, 'auto_initialize' => false, 'data' => $deliveryAddressData, 'query_builder' => function (EntityRepository $er) use($user) { return $er->createQueryBuilder('a')->where('a.actor = :user')->andWhere('a.forBilling = false')->setParameter('user', $user); }); $form->add($factory->createNamed('existingDeliveryAddress', 'entity', null, $formOptions)); } }); $builder->add('selectDelivery', ChoiceType::class, array('choices' => $selectDelivery, 'multiple' => false, 'expanded' => true, 'required' => true, 'label' => false, 'mapped' => false, 'data' => $this->session->has('select-delivery') ? $this->session->get('select-delivery') : 'same')); }