<?php
declare(strict_types=1);
namespace App\Form\Type\UserAlertStock;
use App\Entity\UserAlertStock\AvailabilityNotifier;
use Karser\Recaptcha3Bundle\Form\Recaptcha3Type;
use Karser\Recaptcha3Bundle\Validator\Constraints\Recaptcha3;
use Sylius\Bundle\ResourceBundle\Form\Type\AbstractResourceType;
use Sylius\Component\Channel\Context\ChannelContextInterface;
use Sylius\Component\Core\Model\ProductVariantInterface;
use Sylius\Component\Locale\Context\LocaleContextInterface;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\NotBlank;
final class AvailabilityNotifierType extends AbstractResourceType
{
private LocaleContextInterface $localeContext;
private ChannelContextInterface $channelContext;
public function __construct(
string $dataClass,
array $validationGroups,
LocaleContextInterface $localeContext,
ChannelContextInterface $channelContext,
) {
parent::__construct($dataClass, $validationGroups);
$this->localeContext = $localeContext;
$this->channelContext = $channelContext;
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('emailCustomer', EmailType::class, [
'label' => 'app.ui.email_address',
'constraints' => [
new NotBlank([
'message' => 'app.customer_email.not_blank',
'groups' => 'sylius',
]),
],
])
->add('firstName', TextType::class, [
'label' => 'app.ui.first_name',
'constraints' => [
new NotBlank([
'message' => 'sylius.address.first_name.not_blank',
'groups' => 'sylius',
]),
],
])
->add('lastName', TextType::class, [
'label' => 'app.ui.first_name',
'constraints' => [
new NotBlank([
'message' => 'sylius.address.last_name.not_blank',
'groups' => 'sylius',
]),
],
])
;
if ($_ENV['APP_ENV'] != 'dev') {
$builder->add('captcha', Recaptcha3Type::class, [
'constraints' => new Recaptcha3([
'message' => 'karser_recaptcha3.message',
'messageMissingValue' => 'karser_recaptcha3.message_missing_value',
'groups' => ['sylius'],
]),
'action_name' => 'availability_notifier',
]);
}
$builder->addEventListener(FormEvents::POST_SUBMIT, [$this, 'onPostSubmit'])
;
}
public function onPostSubmit(FormEvent $event): void
{
$form = $event->getForm();
$productVariant = $form->getConfig()->getOption('productVariant');
/** @var AvailabilityNotifier $data */
$data = $event->getData();
$data->setStatus(false);
$data->setLocaleCode($this->localeContext->getLocaleCode());
$data->setChannel($this->channelContext->getChannel());
if ($productVariant === null) {
return;
}
$data->setProductVariant($productVariant);
}
public function configureOptions(OptionsResolver $resolver): void
{
parent::configureOptions($resolver);
$resolver
->setDefined([
'productVariant',
])
->setAllowedTypes('productVariant', ProductVariantInterface::class)
;
}
public function getBlockPrefix(): string
{
return 'app_availability_notifier';
}
}