src/Form/Vs/VsType.php line 235

Open in your IDE?
  1. <?php
  2. namespace App\Form\Vs;
  3. use App\Entity\Vs\Vs;
  4. use App\Entity\Vs\VsAbo;
  5. use App\Entity\Vs\VsBeginnAuswahl;
  6. use App\Entity\Vs\VsRegion;
  7. use App\Entity\Vs\VsRubrik;
  8. use App\Entity\Vs\VsStatus;
  9. use App\Entity\Vs\VsTyp;
  10. use App\Model\Module;
  11. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  12. use Symfony\Component\Form\AbstractType;
  13. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  14. use Symfony\Component\Form\Extension\Core\Type\DateType;
  15. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  16. use Symfony\Component\Form\Extension\Core\Type\TextType;
  17. use Symfony\Component\Form\FormBuilderInterface;
  18. use Symfony\Component\Form\FormInterface;
  19. use Symfony\Component\HttpFoundation\RequestStack;
  20. use Symfony\Component\OptionsResolver\OptionsResolver;
  21. use Symfony\Component\Routing\RouterInterface;
  22. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  23. use Symfony\Component\Validator\Constraints\NotBlank;
  24. class VsType extends AbstractType
  25. {
  26. public function __construct(
  27. private readonly TokenStorageInterface $tokenStorage,
  28. private readonly RouterInterface $router,
  29. private readonly RequestStack $requestStack
  30. )
  31. {
  32. }
  33. #[\Override]
  34. public function buildForm(FormBuilderInterface $builder, array $options): void
  35. {
  36. $builder
  37. ->add('abo', EntityType::class, [
  38. 'placeholder' => '-- Angebot wählen --',
  39. 'class' => VsAbo::class,
  40. 'label' => 'Angebot',
  41. ])
  42. ->add('typ', EntityType::class, [
  43. 'placeholder' => '-- Typ wählen --',
  44. 'class' => VsTyp::class,
  45. 'help' => 'Einzelveranstaltung, Dauerveranstaltung, Veranstaltung ohne Fixdatum',
  46. ])
  47. ->add('rubrik', EntityType::class, [
  48. 'placeholder' => '-- Rubrik wählen --',
  49. 'class' => VsRubrik::class,
  50. ])
  51. ->add('titel', null, [
  52. 'label_attr' => ['class' => 'titel-label-fett'],
  53. 'attr' => [
  54. 'placeholder' => 'z.B. Gisler 1843 - Lottomatch',
  55. 'data-maxlength-standard' => 60,
  56. 'data-maxlength-premium' => 85,
  57. ],
  58. ])
  59. ->add('adresse', null, [
  60. 'required' => false,
  61. 'label' => 'Adresse der Veranstaltung',
  62. ])
  63. ->add('region', EntityType::class, [
  64. 'placeholder' => '',
  65. 'class' => VsRegion::class,
  66. 'label' => 'Ort',
  67. 'required' => false,
  68. ])
  69. ->add('startdatum', DateType::class, [
  70. 'widget' => 'single_text',
  71. 'format' => 'dd.MM.yyyy',
  72. 'attr' => ['placeholder' => 'TT.MM.JJJJ', 'class' => 'jqDateTimePickerDate'],
  73. 'html5' => false,
  74. 'label' => 'Datum',
  75. ])
  76. // ->add('enddatum', DateType::class, [
  77. // 'widget' => 'single_text',
  78. // 'required' => false,
  79. // 'format' => 'dd.MM.yyyy',
  80. // 'attr' => ['placeholder' => 'TT.MM.JJJJ', 'class' => 'jqDateTimePickerDate'],
  81. // 'html5' => false,
  82. // 'help' => '«Enddatum» ist bei «Dauerveranstaltung» und «Veranstaltung ohne Fixdatum» ein Pflichtfeld',
  83. // ])
  84. ->add('beschreibung', null, [
  85. 'attr' => [
  86. 'data-maxlength-standard' => 120,
  87. 'data-maxlength-premium' => 300,
  88. ],
  89. 'help' => '',
  90. ])
  91. // ->add('beginn_auswahl', EntityType::class, [
  92. // 'placeholder' => '(ohne)',
  93. // 'class' => VsBeginnAuswahl::class,
  94. // 'label' => 'Startzeitpunkt',
  95. // 'expanded' => true,
  96. // 'multiple' => false,
  97. // 'required' => false,
  98. // ])
  99. ->add('beginnzeit', null, [
  100. 'label' => 'Beginn',
  101. 'minutes' => range(0, 55, 5),
  102. 'placeholder' => ['hour' => '', 'minute' => ''],
  103. ])
  104. ->add('endzeit', null, [
  105. 'label' => 'Ende',
  106. 'minutes' => range(0, 55, 5),
  107. 'placeholder' => ['hour' => '', 'minute' => ''],
  108. ])
  109. ->add('url', null, [
  110. 'attr' => [
  111. 'placeholder' => 'z.B. www.gisler1843.ch (Link auf Hauptseite)',
  112. ],
  113. 'label' => 'Website',
  114. ])
  115. ->add('videolink', null, [
  116. 'label' => 'Video',
  117. 'attr' => [
  118. 'placeholder' => 'z.B. www.youtube.com/watch?v=ZtqOylLqyCU',
  119. ],
  120. 'help' => '',
  121. ])
  122. ->add('googlemaps', null, [
  123. 'label' => 'Google Maps',
  124. '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',
  125. ])
  126. ->add('ticketsbestellen', null, [
  127. 'attr' => ['placeholder' => 'z.B. www.ticketcorner.com/event/xyz'],
  128. 'label' => 'Tickets',
  129. ])
  130. ->add('kveranstalter', null, [
  131. 'label' => 'Firma / Verein',
  132. ])
  133. ->add('kvorname', null, [
  134. 'label' => 'Vorname',
  135. ])
  136. ->add('kname', null, [
  137. 'label' => 'Name',
  138. ])
  139. ->add('kstrasse', null, [
  140. 'label' => 'Strasse/Nr.',
  141. 'required' => true,
  142. ])
  143. ->add('kplz', null, [
  144. 'label' => 'PLZ',
  145. 'required' => true,
  146. ])
  147. ->add('kort', null, [
  148. 'label' => 'Ort',
  149. 'required' => true,
  150. ])
  151. ->add('ktel', null, [
  152. 'label' => 'Telefon',
  153. ])
  154. ->add('kemail', null, [
  155. 'label' => 'E-Mail-Adresse',])
  156. ->add('kkontaktieren', null, [
  157. 'label' => 'Bitte nehmen Sie mit mir Kontakt auf',
  158. ])
  159. ->add('kbemerkung', null, [
  160. 'label' => 'Bemerkung',
  161. ])
  162. ->add('export_uristier', null, [
  163. 'label' => 'Export Uristier',
  164. ])
  165. ->add('export_uw', null, [
  166. 'label' => 'Export UW',
  167. ])
  168. ->add('export_1_enddatum', DateType::class, [
  169. 'widget' => 'single_text',
  170. 'required' => false,
  171. 'label' => 'Print Export bis',
  172. 'format' => 'dd.MM.yyyy',
  173. 'attr' => ['placeholder' => 'TT.MM.JJJJ', 'class' => 'jqDateTimePickerDate'],
  174. 'html5' => false,
  175. 'help' => 'Nur bis zu diesem Datum für den Export in UW/Uristier berücksichtigen.',
  176. ])
  177. ->add('status', EntityType::class, [
  178. 'placeholder' => '-- Status wählen --',
  179. 'class' => VsStatus::class,
  180. 'help' => '',
  181. ])
  182. ->add('vsImageFilepath', HiddenType::class, ['label' => 'Bild', 'required' => false, 'mapped' => false, 'help' => 'Bildformat: B x H, idealerweise 1024 x 768 Pixel, mittlere Qualitätsstufe'])
  183. ->add('vsImageAlt', TextType::class, ['label' => 'Bild Alt', 'required' => false, 'mapped' => false, 'attr' => ['placeholder' => 'Bildbeschreibung (alt-Tag)']])
  184. ->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)']])
  185. ->add('uuid', HiddenType::class)
  186. ;
  187. // Datenschutz nur auf Frontend
  188. if($this->requestStack->getCurrentRequest()->attributes->get('_route') !== 'app.vs_new'){
  189. $builder
  190. ->add('datenschutz', CheckboxType::class, [
  191. 'mapped' => false,
  192. 'required' => true,
  193. 'label' => 'Ich habe die <a href="' . $this->router->generate('fe.page_datenschutz') . '" target="_blank">Datenschutzrichtlinien</a> gelesen und bin damit einverstanden.',
  194. 'label_html' => true,
  195. 'constraints' => [
  196. new NotBlank(),
  197. ],
  198. ]);
  199. }
  200. // Spez Bildupload Fields vorbelegen
  201. if ($vs = $options['data']) {
  202. /**
  203. * @var Vs $vs
  204. */
  205. $image = $vs->getVsImage();
  206. $builder->get('vsImageFilepath')->setData($image->getWebFilepath($options['webBasePath']));
  207. $builder->get('vsImageAlt')->setData($image->getAlt());
  208. $builder->get('vsImageCaption')->setData($image->getCaption());
  209. }
  210. // Ende
  211. }
  212. #[\Override]
  213. public function configureOptions(OptionsResolver $resolver): void
  214. {
  215. // Die Kundendaten müssen nicht zwingend validiert werden, wenn ein angemeldeter User Role "MODULE_VS" besitzt
  216. $validateKundenDaten = true;
  217. if (null !== $this->tokenStorage->getToken() && in_array(Module::MODULE_VS, $this->tokenStorage->getToken()->getRoleNames())) {
  218. $validateKundenDaten = false;
  219. }
  220. // Ende
  221. $resolver
  222. ->setDefaults(
  223. [
  224. 'webBasePath' => '',
  225. 'data_class' => Vs::class,
  226. 'attr' => ['novalidate' => 'novalidate'],
  227. 'validation_groups' => static function (FormInterface $form) use ($validateKundenDaten) {
  228. $validationGroups = ['Default']; // Alle VS Felder validieren welche nicht explizit eine Validation Group gesetzt haben
  229. // Kundendaten mit validieren
  230. if ($validateKundenDaten) {
  231. $validationGroups[] = 'kundendaten';
  232. }
  233. // Weitere Validierungsgruppen je nach gesetztem VS Typ
  234. /**
  235. * @var Vs $data
  236. */
  237. $data = $form->getData();
  238. if ($data->getTyp()) {
  239. if ($data->getTyp()->isDauerveranstaltung()) {
  240. $validationGroups[] = 'dauerveranstaltung';
  241. }
  242. if ($data->getTyp()->isOhneFixdatum()) {
  243. $validationGroups[] = 'ohnefixdatum';
  244. }
  245. }
  246. return $validationGroups;
  247. },
  248. ]
  249. )
  250. ->setRequired(['webBasePath'])
  251. ;
  252. }
  253. }