src/Form/Web/Order/OrderType.php line 108

  1. <?php
  2. namespace App\Form\Web\Order;
  3. use App\Entity\Catalogue\Option;
  4. use App\Entity\Catalogue\Product;
  5. use App\Entity\Order\Order;
  6. use App\Facade\Order\OrderDTO;
  7. use Doctrine\ORM\EntityRepository;
  8. use Doctrine\ORM\QueryBuilder;
  9. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  10. use Symfony\Component\Form\AbstractType;
  11. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  12. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  13. use Symfony\Component\Form\Extension\Core\Type\TextType;
  14. use Symfony\Component\Form\FormBuilderInterface;
  15. use Symfony\Component\OptionsResolver\OptionsResolver;
  16. use Symfony\Component\Validator\Constraints\NotBlank;
  17. class OrderType extends AbstractType
  18. {
  19.     public function buildForm(FormBuilderInterface $builder, array $options)
  20.     {
  21.         $builder
  22.             ->add('customerName'TextType::class, [
  23.                 'required' => true,
  24.                 'constraints' => [
  25.                     new NotBlank,
  26.                 ],
  27.                 'label' => 'Jméno a příjmení',
  28.                 'attr' => [
  29.                     'placeholder' => 'Zadejte jméno a příjmení'
  30.                 ]
  31.             ])
  32.             ->add('customerEmail'TextType::class, [
  33.                 'required' => true,
  34.                 'constraints' => [
  35.                     new NotBlank,
  36.                 ],
  37.                 'label' => 'E-mailová adresa',
  38.                 'attr' => [
  39.                     'placeholder' => 'Zadejte e-mailovou adresu'
  40.                 ]
  41.             ])
  42.             ->add('customerPhone'TextType::class, [
  43.                 'required' => true,
  44.                 'constraints' => [
  45.                     new NotBlank,
  46.                 ],
  47.                 'label' => 'Telefon',
  48.                 'attr' => [
  49.                     'placeholder' => 'Zadejte telefonní číslo'
  50.                 ]
  51.             ])
  52.             ->add('message'TextareaType::class, [
  53.                 'required' => false,
  54.                 'label' => 'Zpráva',
  55.                 'attr' => [
  56.                     'placeholder' => 'Zadejte dotazy nebo poznámky s poptávce'
  57.                 ]
  58.             ])
  59.             ->add('product'EntityType::class, [
  60.                 'label' => 'Garáž',
  61.                 'class' => Product::class,
  62.                 'placeholder' => 'Vyberte garáž ...',
  63.                 'required' => true,
  64.                 'query_builder' => function (EntityRepository $er): QueryBuilder {
  65.                     return $er->createQueryBuilder('p')
  66.                         ->leftJoin('p.orders''o')
  67.                         ->andWhere('p.deleted = :deleted')
  68.                         ->setParameter('deleted'false)
  69.                         ->andWhere('p.active = :active')
  70.                         ->setParameter('active'true)
  71.                         ->andWhere('o.status IS NULL OR o.status IN (:status)')
  72.                         ->setParameter('status', [Order::STATUS_CANCELLEDOrder::STATUS_NEW])
  73.                         ->orderBy('p.id''ASC');
  74.                 },
  75.                 'choice_label' => static function (Product $product): string {
  76.                     return sprintf('%s - %d. etapa - cena: %s Kč'$product->getName(), $product->getPhase(), number_format($product->getPrice(), 0',''.'));
  77.                 },
  78.             ])
  79.             /*
  80.             ->add('deposit', ChoiceType::class, [
  81.                 'label' => 'Výše zálohy',
  82.                 'required' => false,
  83.                 'multiple' => false,
  84.                 'expanded' => false,
  85.                 'placeholder' => 'Vyberte výši zálohy ...',
  86.                 'choices' => [
  87.                     '50.000 Kč' => 50000,
  88.                     '400.000 Kč - sleva 25.000 Kč z ceny garáže' => 400000,
  89.                 ]
  90.             ])
  91.             */
  92.             ->add('productOption'EntityType::class, [
  93.                 'label' => 'Nadstandardní vybavení',
  94.                 'class' => Option::class,
  95.                 'required' => false,
  96.                 'multiple' => true,
  97.                 'expanded' => true,
  98.                 'query_builder' => function (EntityRepository $er): QueryBuilder {
  99.                     return $er->createQueryBuilder('o')
  100.                         ->andWhere('o.deleted = :deleted')
  101.                         ->setParameter('deleted'false)
  102.                         ->andWhere('o.free = :free')
  103.                         ->setParameter('free'false)
  104.                         ->orderBy('o.id''ASC');
  105.                 },
  106.                 'choice_label' => static function (Option $option): string {
  107.                     return sprintf('%s:<br />%s<br />Cena: %s Kč'$option->getName(), $option->getDescription(), number_format($option->getPrice(), 0',''.'));
  108.                 },
  109.                 'label_html' => true,
  110.             ])
  111.         ;
  112.     }
  113.     public function configureOptions(OptionsResolver $resolver)
  114.     {
  115.         $resolver->setDefaults([
  116.             'data_class' => OrderDTO::class,
  117.         ]);
  118.     }
  119. }