<?php
namespace App\Form\Type;
use App\Entity\ApartmentsPricing;
use App\Entity\ExpressPricing;
use App\Entity\Messengers;
use App\Validator\Constraints\TelegramUsernameNotValid;
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\NumberType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\GreaterThan;
use Symfony\Component\Form\Extension\Core\Type\TextType;
class MessengersType extends AbstractType implements DataMapperInterface
{
/**
* @inheritDoc
*/
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('telegram', CheckboxType::class, [
'required' => false,
]);
$builder->add('telegram_username', TextType::class, [
'required' => false,
'mapped' => false,
'constraints' => [
new TelegramUsernameNotValid()
]
]);
$builder->add('whatsapp', CheckboxType::class, [
'required' => false,
]);
$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
$data = $event->getData();
if (isset($data['telegram_username']) && is_string($data['telegram_username'])) {
$username = trim($data['telegram_username']);
$username = ltrim($username, '@');
$username = mb_strtolower($username);
$username = mb_substr($username, 0, 32);
$data['telegram_username'] = $username;
$event->setData($data);
}
});
$builder->setDataMapper($this);
}
/**
* @inheritDoc
*/
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Messengers::class,
'empty_data' => null,
]);
}
/**
* @inheritDoc
*/
public function mapDataToForms($viewData, $forms)
{
if (null === $viewData) {
return null;
}
if (!$viewData instanceof Messengers) {
throw new Exception\UnexpectedTypeException($viewData, Messengers::class);
}
/** @var FormInterface[] $forms */
$forms = iterator_to_array($forms);
$forms['telegram']->setData($viewData->hasTelegram());
$forms['whatsapp']->setData($viewData->hasWhatsApp());
$forms['telegram_username']->setData($viewData->getTelegramUsername());
}
/**
* @inheritDoc
*/
public function mapFormsToData($forms, &$viewData): void
{
/** @var FormInterface[] $forms */
$forms = iterator_to_array($forms);
$telegram_username = $forms['telegram_username']->getData();
$telegram_username = is_string($telegram_username) ? mb_strtolower($telegram_username) ?: null : null;
$viewData = new Messengers(
$forms['telegram']->getData(),
$forms['whatsapp']->getData(),
$telegram_username
);
}
}