<?php
/**
* Created by simpson <simpsonwork@gmail.com>
* Date: 2019-04-30
* Time: 12:36
*/
namespace App\Form\Type;
use App\Entity\Profile\BodyTypes;
use App\Entity\Profile\BreastTypes;
use App\Entity\Profile\Genders;
use App\Entity\Profile\HairColors;
use App\Entity\Profile\Nationalities;
use App\Entity\Profile\PersonParameters;
use App\Entity\Profile\PrivateHaircuts;
use App\Service\Features;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\DataMapperInterface;
use Symfony\Component\Form\Exception;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\GreaterThanOrEqual;
use Symfony\Component\Validator\Constraints\Range;
class PersonParametersType extends AbstractType implements DataMapperInterface
{
public function __construct(
private Features $features
) {}
/**
* @inheritDoc
*/
public function buildForm(FormBuilderInterface $builder, array $options): void
{
if($this->features->has_gigolo_and_trans()) {
$builder->add('gender', ChoiceType::class, [
'choices' => Genders::getList(),
'choice_translation_domain' => 'genders',
]);
}
$builder->add('age', IntegerType::class, [
'constraints' => new GreaterThanOrEqual(18),
]);
$builder->add('height', IntegerType::class, [
'required' => false,
'constraints' => new Range(['min' => 120, 'max' => 220]),
]);
$builder->add('weight', IntegerType::class, [
'required' => false,
'constraints' => new Range(['min' => 25, 'max' => 250]),
]);
$builder->add('breast_size', IntegerType::class, [
'required' => false,
'constraints' => new Range(['min' => 1, 'max' => 12]),
]);
if($this->features->has_breast_type()) {
$builder->add('breast_type', ChoiceType::class, [
'choices' => BreastTypes::getList(),
'choice_translation_domain' => 'breast_types',
]);
}
$builder->add('cloth_size', IntegerType::class, [
'required' => false,
'constraints' => new Range(['min' => 34, 'max' => 80]),
]);
$builder->add('shoes_size', IntegerType::class, [
'required' => false,
'constraints' => new Range(['min' => 33, 'max' => 48]),
]);
$builder->add('body_type', ChoiceType::class, [
'choices' => BodyTypes::getList(),
'choice_translation_domain' => 'body_types',
]);
$builder->add('hair_color', ChoiceType::class, [
'choices' => HairColors::getList(),
'choice_translation_domain' => 'hair_colors',
]);
$builder->add('private_haircut', ChoiceType::class, [
'choices' => PrivateHaircuts::getList(),
'choice_translation_domain' => 'private_haircuts',
]);
$builder->add('nationality', ChoiceType::class, [
'choices' => Nationalities::getList(),
'choice_translation_domain' => 'nationalities',
]);
if($this->features->extended_profile_form()) {
$builder->add('has_tattoo', CheckboxType::class, [
'required' => false,
]);
$builder->add('has_piercing', CheckboxType::class, [
'required' => false,
]);
}
$builder->setDataMapper($this);
}
/**
* @inheritDoc
*/
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => PersonParameters::class,
'empty_data' => null,
]);
}
/**
* @inheritDoc
*/
public function mapDataToForms($viewData, $forms)
{
if (null === $viewData) {
return null;
}
if (!$viewData instanceof PersonParameters) {
throw new Exception\UnexpectedTypeException($viewData, PersonParameters::class);
}
/** @var FormInterface[] $forms */
$forms = iterator_to_array($forms);
if($this->features->has_gigolo_and_trans()) {
$forms['gender']->setData($viewData->getGender());
}
$forms['age']->setData($viewData->getAge());
$forms['height']->setData($viewData->getHeight());
$forms['weight']->setData($viewData->getWeight());
$forms['breast_size']->setData($viewData->getBreastSize());
if($this->features->has_breast_type()) {
$forms['breast_type']->setData($viewData->getBreastType());
}
$forms['cloth_size']->setData($viewData->getClothSize());
$forms['shoes_size']->setData($viewData->getShoesSize());
$forms['body_type']->setData($viewData->getBodyType());
$forms['hair_color']->setData($viewData->getHairColor());
$forms['private_haircut']->setData($viewData->getPrivateHaircut());
$forms['nationality']->setData($viewData->getNationality());
if($this->features->extended_profile_form()) {
$forms['has_tattoo']->setData($viewData->hasTattoo());
$forms['has_piercing']->setData($viewData->hasPiercing());
}
}
/**
* @inheritDoc
*/
public function mapFormsToData($forms, &$viewData): void
{
/** @var FormInterface[] $forms */
$forms = iterator_to_array($forms);
$gender = $this->features->has_gigolo_and_trans() ? $forms['gender']->getData() : null;
$viewData = new PersonParameters(
$gender,
$forms['age']->getData(),
$forms['height']->getData(),
$forms['weight']->getData(),
$forms['breast_size']->getData(),
$this->features->has_breast_type() ? $forms['breast_type']->getData() : null,
$forms['cloth_size']->getData(),
$forms['shoes_size']->getData(),
$forms['body_type']->getData(),
$forms['hair_color']->getData(),
$forms['private_haircut']->getData(),
$forms['nationality']->getData(),
$this->features->extended_profile_form() ? $forms['has_tattoo']->getData() : null,
$this->features->extended_profile_form() ? $forms['has_piercing']->getData() : null
);
}
}