src/Form/Type/PersonParametersType.php line 30

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by simpson <simpsonwork@gmail.com>
  4.  * Date: 2019-04-30
  5.  * Time: 12:36
  6.  */
  7. namespace App\Form\Type;
  8. use App\Entity\Profile\BodyTypes;
  9. use App\Entity\Profile\BreastTypes;
  10. use App\Entity\Profile\Genders;
  11. use App\Entity\Profile\HairColors;
  12. use App\Entity\Profile\Nationalities;
  13. use App\Entity\Profile\PersonParameters;
  14. use App\Entity\Profile\PrivateHaircuts;
  15. use App\Service\Features;
  16. use Symfony\Component\Form\AbstractType;
  17. use Symfony\Component\Form\DataMapperInterface;
  18. use Symfony\Component\Form\Exception;
  19. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  20. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  21. use Symfony\Component\Form\Extension\Core\Type\IntegerType;
  22. use Symfony\Component\Form\FormBuilderInterface;
  23. use Symfony\Component\Form\FormInterface;
  24. use Symfony\Component\OptionsResolver\OptionsResolver;
  25. use Symfony\Component\Validator\Constraints\GreaterThanOrEqual;
  26. use Symfony\Component\Validator\Constraints\Range;
  27. class PersonParametersType extends AbstractType implements DataMapperInterface
  28. {
  29.     public function __construct(
  30.         private Features $features
  31.     ) {}
  32.     /**
  33.      * @inheritDoc
  34.      */
  35.     public function buildForm(FormBuilderInterface $builder, array $options): void
  36.     {
  37.         if($this->features->has_gigolo_and_trans()) {
  38.             $builder->add('gender'ChoiceType::class, [
  39.                 'choices' => Genders::getList(),
  40.                 'choice_translation_domain' => 'genders',
  41.             ]);
  42.         }
  43.         $builder->add('age'IntegerType::class, [
  44.             'constraints' => new GreaterThanOrEqual(18),
  45.         ]);
  46.         $builder->add('height'IntegerType::class, [
  47.             'required' => false,
  48.             'constraints' => new Range(['min' => 120'max' => 220]),
  49.         ]);
  50.         $builder->add('weight'IntegerType::class, [
  51.             'required' => false,
  52.             'constraints' => new Range(['min' => 25'max' => 250]),
  53.         ]);
  54.         $builder->add('breast_size'IntegerType::class, [
  55.             'required' => false,
  56.             'constraints' => new Range(['min' => 1'max' => 12]),
  57.         ]);
  58.         if($this->features->has_breast_type()) {
  59.             $builder->add('breast_type'ChoiceType::class, [
  60.                 'choices' => BreastTypes::getList(),
  61.                 'choice_translation_domain' => 'breast_types',
  62.             ]);
  63.         }
  64.         $builder->add('cloth_size'IntegerType::class, [
  65.             'required' => false,
  66.             'constraints' => new Range(['min' => 34'max' => 80]),
  67.         ]);
  68.         $builder->add('shoes_size'IntegerType::class, [
  69.             'required' => false,
  70.             'constraints' => new Range(['min' => 33'max' => 48]),
  71.         ]);
  72.         $builder->add('body_type'ChoiceType::class, [
  73.             'choices' => BodyTypes::getList(),
  74.             'choice_translation_domain' => 'body_types',
  75.         ]);
  76.         $builder->add('hair_color'ChoiceType::class, [
  77.             'choices' => HairColors::getList(),
  78.             'choice_translation_domain' => 'hair_colors',
  79.         ]);
  80.         $builder->add('private_haircut'ChoiceType::class, [
  81.             'choices' => PrivateHaircuts::getList(),
  82.             'choice_translation_domain' => 'private_haircuts',
  83.         ]);
  84.         $builder->add('nationality'ChoiceType::class, [
  85.             'choices' => Nationalities::getList(),
  86.             'choice_translation_domain' => 'nationalities',
  87.         ]);
  88.         if($this->features->extended_profile_form()) {
  89.             $builder->add('has_tattoo'CheckboxType::class, [
  90.                 'required' => false,
  91.             ]);
  92.             $builder->add('has_piercing'CheckboxType::class, [
  93.                 'required' => false,
  94.             ]);
  95.         }
  96.         $builder->setDataMapper($this);
  97.     }
  98.     /**
  99.      * @inheritDoc
  100.      */
  101.     public function configureOptions(OptionsResolver $resolver): void
  102.     {
  103.         $resolver->setDefaults([
  104.             'data_class' => PersonParameters::class,
  105.             'empty_data' => null,
  106.         ]);
  107.     }
  108.     /**
  109.      * @inheritDoc
  110.      */
  111.     public function mapDataToForms($viewData$forms)
  112.     {
  113.         if (null === $viewData) {
  114.             return null;
  115.         }
  116.         if (!$viewData instanceof PersonParameters) {
  117.             throw new Exception\UnexpectedTypeException($viewDataPersonParameters::class);
  118.         }
  119.         /** @var FormInterface[] $forms */
  120.         $forms iterator_to_array($forms);
  121.         if($this->features->has_gigolo_and_trans()) {
  122.             $forms['gender']->setData($viewData->getGender());
  123.         }
  124.         $forms['age']->setData($viewData->getAge());
  125.         $forms['height']->setData($viewData->getHeight());
  126.         $forms['weight']->setData($viewData->getWeight());
  127.         $forms['breast_size']->setData($viewData->getBreastSize());
  128.         if($this->features->has_breast_type()) {
  129.             $forms['breast_type']->setData($viewData->getBreastType());
  130.         }
  131.         $forms['cloth_size']->setData($viewData->getClothSize());
  132.         $forms['shoes_size']->setData($viewData->getShoesSize());
  133.         $forms['body_type']->setData($viewData->getBodyType());
  134.         $forms['hair_color']->setData($viewData->getHairColor());
  135.         $forms['private_haircut']->setData($viewData->getPrivateHaircut());
  136.         $forms['nationality']->setData($viewData->getNationality());
  137.         if($this->features->extended_profile_form()) {
  138.             $forms['has_tattoo']->setData($viewData->hasTattoo());
  139.             $forms['has_piercing']->setData($viewData->hasPiercing());
  140.         }
  141.     }
  142.     /**
  143.      * @inheritDoc
  144.      */
  145.     public function mapFormsToData($forms, &$viewData): void
  146.     {
  147.         /** @var FormInterface[] $forms */
  148.         $forms iterator_to_array($forms);
  149.         $gender $this->features->has_gigolo_and_trans() ? $forms['gender']->getData() : null;
  150.         $viewData = new PersonParameters(
  151.             $gender,
  152.             $forms['age']->getData(),
  153.             $forms['height']->getData(),
  154.             $forms['weight']->getData(),
  155.             $forms['breast_size']->getData(),
  156.             $this->features->has_breast_type() ? $forms['breast_type']->getData() : null,
  157.             $forms['cloth_size']->getData(),
  158.             $forms['shoes_size']->getData(),
  159.             $forms['body_type']->getData(),
  160.             $forms['hair_color']->getData(),
  161.             $forms['private_haircut']->getData(),
  162.             $forms['nationality']->getData(),
  163.             $this->features->extended_profile_form() ? $forms['has_tattoo']->getData() : null,
  164.             $this->features->extended_profile_form() ? $forms['has_piercing']->getData() : null
  165.         );
  166.     }
  167. }