<?php
declare(strict_types=1);
namespace App\Form;
use Pimcore\Model\DataObject;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints as Assert;
class QuizRegisterationFormType extends AbstractType
{
private function getBodyTypes()
{
$listing = new DataObject\BodyTypeMap\Listing();
$listing->setOrder('DESC');
$listing->setOrderKey('o_id');
return $listing->load();
}
/**
* @inheritDoc
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$class = DataObject\ClassDefinition::getByName('User');
$bodyTypes = $this->getBodyTypes();
$builder
->setMethod('POST')
->add('planCategoryId', HiddenType::class)
->add('sourceDocumentId', HiddenType::class)
->add('firstname', TextType::class, [
'label' => 'First Name',
'required' => true,
'trim' => true,
'attr' => ['placeholder' => 'First Name']
])
->add('lastname', TextType::class, [
'label' => 'Last Name',
'required' => false,
'trim' => true,
'attr' => ['placeholder' => 'Last Name']
])
->add('password', RepeatedType::class, [
'type' => PasswordType::class,
'invalid_message' => 'The password fields must match.',
'options' => ['attr' => ['class' => 'password-field', 'placeholder' => 'Password']],
'required' => true,
'first_options' => ['label' => 'Password'],
'second_options' => ['label' => 'Repeat Password'],
'constraints' => new Assert\Length(['min' => '8', 'minMessage' => 'Password length is too small. It should be atleast {{ limit }} characters long.'])
])
->add('email', EmailType::class, [
'constraints' => [new Assert\Email(['message' => 'Please enter a valid email address'])],
'label' => 'Email',
'trim' => true,
'attr' => ['placeholder' => 'E-Mail Address']
])
->add('gender', ChoiceType::class, [
'label' => 'Gender', 'expanded' => true, 'required' => true, 'choices' => $this->getGenderList()
])
->add('ageRange', ChoiceType::class, [
'label' => 'Age', 'expanded' => true, 'required' => true, 'choices' => self::getOptionList('ageRange', $class)
])
->add('height', ChoiceType::class, [
'label' => 'Height', 'expanded' => true, 'required' => true, 'choices' => self::getOptionList('height', $class)
])
->add('bodyweight', ChoiceType::class, [
'label' => 'Age', 'expanded' => true, 'required' => true, 'choices' => self::getOptionList('weight', $class)
])
->add('experience', ChoiceType::class, [
'label' => 'Experience', 'required' => true, 'expanded' => true, 'choices' => self::getOptionList('experience', $class)
])
->add('bmi', ChoiceType::class, [
'label' => 'BMI', 'required' => true, 'expanded' => true, 'choices' => self::getOptionList('bmi', $class)
])
->add('frequency', ChoiceType::class, [
'label' => 'Frequency', 'required' => true, 'expanded' => true, 'choices' => self::getOptionList('frequency', $class)
])
->add('bodyTypeMale', ChoiceType::class, [
'label' => 'Male Body Type',
'required' => true,
'expanded' => true,
'choices' => $this->getBodyTypesList($bodyTypes, 'male'),
'attr' => ['bodyTypeData' => $this->getBodyTypesData($bodyTypes, 'male')]
])
->add('bodyTypeFemale', ChoiceType::class, [
'label' => 'Female Body Type',
'required' => true,
'expanded' => true,
'choices' => $this->getBodyTypesList($bodyTypes, 'female'),
'attr' => ['bodyTypeData' => $this->getBodyTypesData($bodyTypes, 'female')]
])
->add('timezone', ChoiceType::class, [
'required' => true,
'choices' => self::getOptionList('timezone', $class),
])
->add('submit', SubmitType::class, [
'label' => 'Save & Signup'
]);
}
private function getBodyTypesData($bodyTypes, $genderName)
{
$items = [];
//numbers are used in css class to render background images on quiz popups
$numbers = [
'male' => [
'ectomorph-male' => '5',
'ecto-mesomorph-male' => '4',
'mesomorph-male' => '3',
'endomorph-male' => '2',
'endo-mesomorph-male' => '1',
],
'female' => [
'mesomorph-female' => '1',
'endomorph-female' => '2',
'endo-mesomorph-female' => '3',
'ectomorph-female' => '4',
'ecto-mesomorph-female' => '5',
]
];
foreach ($bodyTypes as $bodyType) {
if (strtolower($bodyType->getGender()->getName()) == $genderName) {
$items[$bodyType->getId()] = [
'id' => $bodyType->getId(),
'name' => $bodyType->getName(),
'description' => $bodyType->getDescription(),
'number' => $numbers[strtolower($genderName)][strtolower($bodyType->getOfficialName())],
];
}
}
return $items;
}
private function getBodyTypesList($bodyTypes, $genderName)
{
$items = [];
foreach ($bodyTypes as $bodyType) {
if (strtolower($bodyType->getGender()->getName()) == $genderName) {
$items[$bodyType->getName()] = $bodyType->getId();
}
}
return $items;
}
private function getGenderList()
{
$listing = new DataObject\Gender\Listing();
$listing->setOrder('ASC');
$listing->setOrderKey('o_id');
$items = [];
foreach ($listing as $gender) {
$items[$gender->getName()] = $gender->getId();
}
return $items;
}
private static function getOptionList($key, DataObject\ClassDefinition $class)
{
$options = $class->getFieldDefinition($key)->getOptions();
$items = [];
foreach ($options as $option) {
$items[$option['key']] = $option['value'];
}
return $items;
}
/**
* @inheritDoc
*/
public function getBlockPrefix()
{
return '';
}
/**
* @inheritDoc
*/
public function configureOptions(OptionsResolver $resolver)
{
}
}