<?php declare(strict_types=1);
namespace App\StartPlatz\Bundle\EventBundle\Form;
use App\StartPlatz\Bundle\StartupBundle\Entity\Application;
use App\StartPlatz\Bundle\StartupBundle\Entity\Batch;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\UrlType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
/**
* Lightweight form for event registration.
* Replaces the event-template cases in ApplicationType which pulled in
* Accelerator/RP fields (industry, teamSize, mvpStatus, etc.) unnecessarily.
*/
class EventApplicationType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
/** @var Batch $batch */
$batch = $options['batch'];
$settings = $options['settings'];
// Core fields — every event registration needs these
$builder
->add('firstName', TextType::class, ['required' => true, 'attr' => ['placeholder' => 'first name']])
->add('lastName', TextType::class, ['required' => true, 'attr' => ['placeholder' => 'last name']])
->add('email', EmailType::class, ['required' => true, 'attr' => ['placeholder' => 'email']]);
// Optional: applicant types (e.g. speed-networking)
if (isset($settings['applicantTypes']) && $settings['applicantTypes']) {
$applicantTypes = $settings['applicantTypes'];
$builder->add('applicantType', TextType::class, [
'required' => true,
'attr' => ['placeholder' => implode(' or ', $applicantTypes)],
]);
}
// Optional: extra fields from batch JSON settings
if (isset($settings['extraFields'])) {
foreach ($settings['extraFields'] as $extraField) {
$required = ($extraField['required'] ?? '') === 'true' ? ' *' : '';
$fieldType = match ($extraField['type'] ?? 'text') {
'choice' => ChoiceType::class,
'checkbox' => CheckboxType::class,
'textarea' => TextareaType::class,
default => TextType::class,
};
$fieldOptions = ['required' => false, 'mapped' => false];
if ($fieldType === ChoiceType::class) {
$fieldOptions['choices'] = array_flip($extraField['choices'] ?? []);
$fieldOptions['placeholder'] = $extraField['label'] . $required;
} else {
$fieldOptions['attr'] = ['placeholder' => $extraField['label'] . $required];
}
$builder->add($extraField['field'], $fieldType, $fieldOptions);
}
}
// Conditional batch-driven fields
if ($batch->getAskForTeam()) {
$builder->add('startupName', TextType::class, [
'required' => false,
'attr' => ['placeholder' => 'startupName'],
]);
}
if ($batch->getHasIncludePhone()) {
$builder->add('phone', TextType::class, [
'required' => false,
'attr' => ['placeholder' => 'Phone Number'],
]);
}
if ($batch->getHasIncludeLinkedIn()) {
$builder->add('linkedin', UrlType::class, [
'required' => false,
'default_protocol' => 'https',
'attr' => ['placeholder' => 'LinkedIn Url'],
]);
}
if ($batch->getHasIncludeNewsletterPermission()) {
$builder->add('hasNewsletterPermissionGiven', CheckboxType::class, ['required' => false]);
}
if (isset($settings['hasIncludeVolunteerConsent']) && $settings['hasIncludeVolunteerConsent']) {
$builder->add('hasVolunteerAgreed', CheckboxType::class, ['required' => false]);
}
$builder->add('finish', SubmitType::class, ['label' => 'Apply now']);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Application::class,
'settings' => [],
'program' => null,
'batch' => null,
]);
}
}