<?php
namespace App\Form\Type;
use App\Entity\ProvidedServiceCondition;
use App\Repository\ReadModel\ProvidedServiceOption;
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\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\Length;
class ProvidedServiceType extends AbstractType implements DataMapperInterface
{
/**
* @inheritDoc
*/
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('service', HiddenType::class);
$builder->add('enabled', CheckboxType::class, [
'required' => false,
'label' => false,
'attr' => [
'data-content' => 'service_enabled'
],
]);
$builder->add('condition', ChoiceType::class, [
//'required' => false,
'label' => false,
'multiple' => false,
'expanded' => true,
'choices' => ProvidedServiceCondition::toArray(),
'choice_translation_domain' => 'profile_service',
'attr' => [
'data-content' => 'service_condition'
],
]);
$builder->add('extra_charge', NumberType::class, [
'required' => false,
'label' => '+$',
'attr' => [
'data-content' => 'service_extra_charge'
],
'empty_data' => '',
]);
$builder->add('comment', TextareaType::class, [
'required' => false,
'label' => false,
'empty_data' => '',
'constraints' => [
new Length(['max' => 80, 'maxMessage' => 'Максимальная длина - 80 символов'])
],
'attr' => [
'data-content' => 'service_comment',
],
]);
$builder->setDataMapper($this);
}
/**
* @inheritDoc
*/
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => ProvidedServiceOption::class,
'empty_data' => null,
'allow_extra_fields' => true,
]);
}
/**
* @inheritDoc
*/
public function mapDataToForms($viewData, $forms): void
{
if (!$viewData) {
return;
}
if (!$viewData instanceof ProvidedServiceOption) {
throw new Exception\UnexpectedTypeException($viewData, ProvidedServiceOption::class);
}
/** @var FormInterface[] $forms */
$forms = \iterator_to_array($forms);
$forms['service']->setData($viewData->service);
$forms['enabled']->setData($viewData->enabled);
$forms['condition']->setData($viewData->condition ?? ProvidedServiceCondition::INCLUDED);
$forms['extra_charge']->setData($viewData->extraCharge);
$forms['comment']->setData($viewData->comment);
}
/**
* @inheritDoc
*/
public function mapFormsToData($forms, &$viewData): void
{
/** @var FormInterface[] $forms */
$forms = \iterator_to_array($forms);
if(null === $forms['service']->getData()) {
return;
}
$viewData = new ProvidedServiceOption(
$forms['service']->getData(),
$forms['enabled']->getData(),
$forms['condition']->getData(),
$forms['extra_charge']->getData(),
$forms['comment']->getData(),
);
}
}