Skip to content

Instantly share code, notes, and snippets.

@ducho
Created November 5, 2022 12:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ducho/57b3065b6f7f62cdf0ecd8063bd1ac16 to your computer and use it in GitHub Desktop.
Save ducho/57b3065b6f7f62cdf0ecd8063bd1ac16 to your computer and use it in GitHub Desktop.
<?php
namespace App\Form;
use App\Entity\Domain;
use App\Entity\EmailVirtual;
use App\Entity\EmailVirtualDestination;
use App\Repository\EmailVirtualRepository;
use App\Service\CurrentDomainService;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Event\PreSubmitEvent;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\Callback;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
/**
* @package App\Form
*/
class EmailVirtualType extends AbstractType
{
/**
* @var EmailVirtualRepository
*/
private $emailVirtualRepository;
/**
* @var CurrentDomainService
*/
private $currentDomainService;
public function __construct(EmailVirtualRepository $emailVirtualRepository, CurrentDomainService $currentDomainService)
{
$this->emailVirtualRepository = $emailVirtualRepository;
$this->currentDomainService = $currentDomainService;
}
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$emailVirtual = $options['data'];
/** @var Domain $domain */
$domain = $this->currentDomainService->getCurrentDomain();
$builder
->add('email', TextType::class, [
'label' => 'email.forward.form.email',
'constraints' => [
new NotBlank(),
new Callback(array($this, 'validateEmail')),
],
])
->add(
'destinations',
ChoiceType::class,
[
'label' => 'email.forward.form.destination',
'choices' => $this->getChoices($emailVirtual),
'mapped' => false,
'data' => $this->getData($emailVirtual),
'multiple' => true,
'required' => true,
'constraints' => [
new NotBlank(),
],
]
)
;
$builder->addEventListener(
FormEvents::PRE_SUBMIT,
function (PreSubmitEvent $event) {
/** @var EmailVirtual $emailVirtual */
$emailVirtual = $event->getForm()->getData();
$emailVirtual->getDestinations()->clear();
foreach ($event->getData()['destinations'] as $destinationEmail) {
$newDestination = (new EmailVirtualDestination())->setEmail($destinationEmail)->setParent($emailVirtual);
$emailVirtual->getDestinations()->add($newDestination);
}
}
);
$builder->get('destinations')->resetViewTransformers();
}
public function validateEmail($value, ExecutionContextInterface $context)
{
/** @var Domain $domain */
$domain = $this->currentDomainService->getCurrentDomain();
$email = $value . '@' . $domain->getDomain();
$result = true;
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$result = false;
$message = 'Neplatná emailová adresa.';
} else {
/** @var EmailVirtual $data */
$data = $this->emailVirtualRepository->findOneBy(['email' => $email, 'basket' => 0, 'autoreply' => 0]);
if ($data) {
$result = false;
$message = 'Takáto počiatočná adresa pre presmerovanie už existuje.';
}
}
if (!$result) {
$context->buildViolation($message)
->atPath('email')
->addViolation();
}
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => 'App\Entity\EmailVirtual',
]);
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'app_email_virtual';
}
private function getChoices(EmailVirtual $emailVirtual)
{
$choices = [];
/** @var EmailVirtualDestination $destination */
foreach ($emailVirtual->getDestinations() as $destination) {
$choices[$destination->getEmail()] = $destination->getEmail();
}
return $choices;
}
private function getData(EmailVirtual $emailVirtual)
{
$choices = [];
/** @var EmailVirtualDestination $destination */
foreach ($emailVirtual->getDestinations() as $destination) {
$choices[] = $destination->getEmail();
}
return $choices;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment