<?php
namespace DcSiteBundle\Form;
use DcSiteBundle\Model\Form\ServiceForm;
use DateTime;
use Exception;
use CoreBundle\Form\CoreFormsType;
use DcSiteBundle\Form\Transformer\ServiceDataFormTransformer;
use Symfony\Component\Form\CallbackTransformer;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Contracts\Translation\TranslatorInterface;
class ServiceType extends CoreFormsType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
* @return int|void
* @throws Exception
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
/** @var TranslatorInterface $Translator */
$Translator = $options['translator'];
$defaultType = $options['defaultType'];
parent::buildForm($builder, $options);
$fullForm = $options['fullForm'];
$communicationType = $options['communication'];
$builder
->add('dealer', HiddenType::class)
->add('date_visit', TextType::class, [
'label' => false,
'mapped' => false,
'attr' => [
'placeholder' => $Translator->trans('form.visit_time', [],'dc_base'),
'autocomplete' => "off",
'class' => 'js-datepicker',
],
])
->add('mileage', IntegerType::class, [
'label' => false,
'mapped' => false,
'required' => false,
'attr' => [
'placeholder' => $Translator->trans('form.mileage', [], 'dc_base'),
'class' => 'mileage'
]
])
->add('reason', TextareaType::class, [
'label' => false,
'mapped' => false,
'required' => false,
'attr' => [
'placeholder' => $Translator->trans('form.reason', [], 'dc_base')
]
])
->add('service_type', ChoiceType::class, [
'label' => false,
'required' => false,
'mapped' => false,
'data' => $defaultType,
'placeholder' => $Translator->trans('form.service_type', [], 'dc_base'),
'choices' => array_flip(ServiceForm::getTypeName($Translator->getLocale())),
])
->add('issue_year', DateType::class, [
'required' => false,
'mapped' => false,
'placeholder' => $Translator->trans('form.issue_year', [], 'dc_base'),
'widget' => 'single_text',
'format' => 'yyyy',
'label' => false,
'html5' => false,
'attr' => [
'class' => 'js-datepicker-year',
],
])
;
if($communicationType) {
$builder
->add('communication', ChoiceType::class, [
'label' => $Translator->trans('form.communication',[],'dc_base'),
'required' => true,
'mapped' => false,
'data' => 'phone',
'choices' => array_flip(['phone' => 'Телефон', 'email' => 'E-mail']),
'expanded' => true,
'multiple' => false,
'attr' => [
'class' => 'js-td-communication'
],
]
);
}
if ($fullForm) {
$builder
->add('model', TextType::class, [
'required' => false,
'mapped' => false,
'label' => false,
'attr' => [
'placeholder' => $Translator->trans('form.model_choose', [], 'dc_base'),
],
])
->add('commentary', TextareaType::class, [
'required' => false,
'mapped' => false,
'label' => false,
'attr' => [
'placeholder' => $Translator->trans('form.comment', [], 'dc_base'),
'rows' => 10
],
])
->add('vin_gos_nomer', TextType::class, [
'required' => false,
'mapped' => false,
'label' => false,
'attr' => [
'placeholder' => $Translator->trans('form.vin_gos_nomer', [], 'dc_base'),
],
])
;
}
$builder->get('date_visit')->addModelTransformer(new CallbackTransformer(
fn($dateAsObject) => (new DateTime($dateAsObject))->format('d.m.Y'),
function ($dateAsSting) {
/** @var DateTime $dateAsObject */
$dateAsSting = str_replace('.', '-', $dateAsSting);
return new DateTime($dateAsSting);
}
));
$builder->addEventListener(FormEvents::SUBMIT, function ($event): void {
(new ServiceDataFormTransformer($event))->transform();
});
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
parent::configureOptions($resolver);
$resolver->setDefault('captcha_type','service_form');
$resolver->setDefault('communication',false);
$resolver->setDefault('defaultType',false);
$resolver->setDefault('fullForm', false);
}
}