<?php
namespace App\Form\Vs;
use App\Entity\Vs\Vs;
use App\Entity\Vs\VsAbo;
use App\Entity\Vs\VsBeginnAuswahl;
use App\Entity\Vs\VsRegion;
use App\Entity\Vs\VsRubrik;
use App\Entity\Vs\VsStatus;
use App\Entity\Vs\VsTyp;
use App\Model\Module;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Validator\Constraints\NotBlank;
class VsType extends AbstractType
{
public function __construct(
private readonly TokenStorageInterface $tokenStorage,
private readonly RouterInterface $router,
private readonly RequestStack $requestStack
)
{
}
#[\Override]
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('abo', EntityType::class, [
'placeholder' => '-- Angebot wählen --',
'class' => VsAbo::class,
'label' => 'Angebot',
])
->add('typ', EntityType::class, [
'placeholder' => '-- Typ wählen --',
'class' => VsTyp::class,
'help' => 'Einzelveranstaltung, Dauerveranstaltung, Veranstaltung ohne Fixdatum',
])
->add('rubrik', EntityType::class, [
'placeholder' => '-- Rubrik wählen --',
'class' => VsRubrik::class,
])
->add('titel', null, [
'label_attr' => ['class' => 'titel-label-fett'],
'attr' => [
'placeholder' => 'z.B. Gisler 1843 - Lottomatch',
'data-maxlength-standard' => 60,
'data-maxlength-premium' => 85,
],
])
->add('adresse', null, [
'required' => false,
'label' => 'Adresse der Veranstaltung',
])
->add('region', EntityType::class, [
'placeholder' => '',
'class' => VsRegion::class,
'label' => 'Ort',
'required' => false,
])
->add('startdatum', DateType::class, [
'widget' => 'single_text',
'format' => 'dd.MM.yyyy',
'attr' => ['placeholder' => 'TT.MM.JJJJ', 'class' => 'jqDateTimePickerDate'],
'html5' => false,
'label' => 'Datum',
])
// ->add('enddatum', DateType::class, [
// 'widget' => 'single_text',
// 'required' => false,
// 'format' => 'dd.MM.yyyy',
// 'attr' => ['placeholder' => 'TT.MM.JJJJ', 'class' => 'jqDateTimePickerDate'],
// 'html5' => false,
// 'help' => '«Enddatum» ist bei «Dauerveranstaltung» und «Veranstaltung ohne Fixdatum» ein Pflichtfeld',
// ])
->add('beschreibung', null, [
'attr' => [
'data-maxlength-standard' => 120,
'data-maxlength-premium' => 300,
],
'help' => '',
])
// ->add('beginn_auswahl', EntityType::class, [
// 'placeholder' => '(ohne)',
// 'class' => VsBeginnAuswahl::class,
// 'label' => 'Startzeitpunkt',
// 'expanded' => true,
// 'multiple' => false,
// 'required' => false,
// ])
->add('beginnzeit', null, [
'label' => 'Beginn',
'minutes' => range(0, 55, 5),
'placeholder' => ['hour' => '', 'minute' => ''],
])
->add('endzeit', null, [
'label' => 'Ende',
'minutes' => range(0, 55, 5),
'placeholder' => ['hour' => '', 'minute' => ''],
])
->add('url', null, [
'attr' => [
'placeholder' => 'z.B. www.gisler1843.ch (Link auf Hauptseite)',
],
'label' => 'Website',
])
->add('videolink', null, [
'label' => 'Video',
'attr' => [
'placeholder' => 'z.B. www.youtube.com/watch?v=ZtqOylLqyCU',
],
'help' => '',
])
->add('googlemaps', null, [
'label' => 'Google Maps',
'helpNoEscape' => 'Auf <a href="https://www.google.com/maps" target="_blank" rel="noopener">www.google.com/maps</a> Adresse suchen - Teilen-Icon - Karten-einbetten - Klein - HTML kopieren - Link in obiges Feld kopieren',
])
->add('ticketsbestellen', null, [
'attr' => ['placeholder' => 'z.B. www.ticketcorner.com/event/xyz'],
'label' => 'Tickets',
])
->add('kveranstalter', null, [
'label' => 'Firma / Verein',
])
->add('kvorname', null, [
'label' => 'Vorname',
])
->add('kname', null, [
'label' => 'Name',
])
->add('kstrasse', null, [
'label' => 'Strasse/Nr.',
'required' => true,
])
->add('kplz', null, [
'label' => 'PLZ',
'required' => true,
])
->add('kort', null, [
'label' => 'Ort',
'required' => true,
])
->add('ktel', null, [
'label' => 'Telefon',
])
->add('kemail', null, [
'label' => 'E-Mail-Adresse',])
->add('kkontaktieren', null, [
'label' => 'Bitte nehmen Sie mit mir Kontakt auf',
])
->add('kbemerkung', null, [
'label' => 'Bemerkung',
])
->add('export_uristier', null, [
'label' => 'Export Uristier',
])
->add('export_uw', null, [
'label' => 'Export UW',
])
->add('export_1_enddatum', DateType::class, [
'widget' => 'single_text',
'required' => false,
'label' => 'Print Export bis',
'format' => 'dd.MM.yyyy',
'attr' => ['placeholder' => 'TT.MM.JJJJ', 'class' => 'jqDateTimePickerDate'],
'html5' => false,
'help' => 'Nur bis zu diesem Datum für den Export in UW/Uristier berücksichtigen.',
])
->add('status', EntityType::class, [
'placeholder' => '-- Status wählen --',
'class' => VsStatus::class,
'help' => '',
])
->add('vsImageFilepath', HiddenType::class, ['label' => 'Bild', 'required' => false, 'mapped' => false, 'help' => 'Bildformat: B x H, idealerweise 1024 x 768 Pixel, mittlere Qualitätsstufe'])
->add('vsImageAlt', TextType::class, ['label' => 'Bild Alt', 'required' => false, 'mapped' => false, 'attr' => ['placeholder' => 'Bildbeschreibung (alt-Tag)']])
->add('vsImageCaption', TextType::class, ['label' => 'Bild Caption', 'mapped' => false, 'help' => 'Bild wird automatisch auf '.Vs::MAX_WIDTH_VSIMAGE.'px Breite runtergerechnet falls grösser.', 'required' => false, 'attr' => ['placeholder' => 'Bildlegende (figcaption-Tag)']])
->add('uuid', HiddenType::class)
;
// Datenschutz nur auf Frontend
if($this->requestStack->getCurrentRequest()->attributes->get('_route') !== 'app.vs_new'){
$builder
->add('datenschutz', CheckboxType::class, [
'mapped' => false,
'required' => true,
'label' => 'Ich habe die <a href="' . $this->router->generate('fe.page_datenschutz') . '" target="_blank">Datenschutzrichtlinien</a> gelesen und bin damit einverstanden.',
'label_html' => true,
'constraints' => [
new NotBlank(),
],
]);
}
// Spez Bildupload Fields vorbelegen
if ($vs = $options['data']) {
/**
* @var Vs $vs
*/
$image = $vs->getVsImage();
$builder->get('vsImageFilepath')->setData($image->getWebFilepath($options['webBasePath']));
$builder->get('vsImageAlt')->setData($image->getAlt());
$builder->get('vsImageCaption')->setData($image->getCaption());
}
// Ende
}
#[\Override]
public function configureOptions(OptionsResolver $resolver): void
{
// Die Kundendaten müssen nicht zwingend validiert werden, wenn ein angemeldeter User Role "MODULE_VS" besitzt
$validateKundenDaten = true;
if (null !== $this->tokenStorage->getToken() && in_array(Module::MODULE_VS, $this->tokenStorage->getToken()->getRoleNames())) {
$validateKundenDaten = false;
}
// Ende
$resolver
->setDefaults(
[
'webBasePath' => '',
'data_class' => Vs::class,
'attr' => ['novalidate' => 'novalidate'],
'validation_groups' => static function (FormInterface $form) use ($validateKundenDaten) {
$validationGroups = ['Default']; // Alle VS Felder validieren welche nicht explizit eine Validation Group gesetzt haben
// Kundendaten mit validieren
if ($validateKundenDaten) {
$validationGroups[] = 'kundendaten';
}
// Weitere Validierungsgruppen je nach gesetztem VS Typ
/**
* @var Vs $data
*/
$data = $form->getData();
if ($data->getTyp()) {
if ($data->getTyp()->isDauerveranstaltung()) {
$validationGroups[] = 'dauerveranstaltung';
}
if ($data->getTyp()->isOhneFixdatum()) {
$validationGroups[] = 'ohnefixdatum';
}
}
return $validationGroups;
},
]
)
->setRequired(['webBasePath'])
;
}
}