1. Go to this page and download the library: Download symfonycasts/dynamic-forms library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
symfonycasts / dynamic-forms example snippets
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder = new DynamicFormBuilder($builder);
$builder->add('meal', ChoiceType::class, [
'choices' => [
'Breakfast' => 'breakfast',
'Lunch' => 'lunch',
'Dinner' => 'dinner',
],
]);
$builder->addDependent('mainFood', ['meal'], function(DependentField $field, string $meal) {
// dynamically add choices based on the meal!
$choices = ['...'];
$field->add(ChoiceType::class, [
'placeholder' => null === $meal ? 'Select a meal first' : sprintf('What is for %s?', $meal->getReadable()),
'choices' => $choices,
'disabled' => null === $meal,
]);
});
use Symfonycasts\DynamicForms\DynamicFormBuilder;
// ...
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder = new DynamicFormBuilder($builder);
// ...
}
// src/Form/FeedbackForm.php
// ...
use Symfonycasts\DynamicForms\DependentField;
use Symfonycasts\DynamicForms\DynamicFormBuilder;
class FeedbackForm extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder = new DynamicFormBuilder($builder);
$builder->add('rating', ChoiceType::class, [
'choices' => [
'Select a rating' => null,
'Great' => 5,
'Good' => 4,
'Okay' => 3,
'Bad' => 2,
'Terrible' => 1
],
]);
$builder->addDependent('badRatingNotes', 'rating', function(DependentField $field, ?int $rating) {
if (null === $rating || $rating >= 3) {
return; // field not needed
}
$field->add(TextareaType::class, [
'label' => 'What went wrong?',
'attr' => ['rows' => 3],
'help' => sprintf('Because you gave a %d rating, we\'d love to know what went wrong.', $rating),
]);
});
}
}
diff
// src/Form/FeedbackForm.php
// ...
class FeedbackForm extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder = new DynamicFormBuilder($builder);
$builder->add('rating', ChoiceType::class, [
'choices' => [
'Select a rating' => null,
'Great' => 5,
'Good' => 4,
'Okay' => 3,
'Bad' => 2,
'Terrible' => 1
],
+ // This will allow the form to auto-submit on value change
+ 'attr' => ['onchange' => 'this.form.requestSubmit()'],
]);
+ // This will allow to differenciate between a user submition and an auto-submit
+ $builder->add('submit', SubmitType::class, [
+ 'attr' => ['value' => 'submit'], // Needed for Turbo
+ ]);
$builder->addDependent('badRatingNotes', 'rating', function(DependentField $field, ?int $rating) {
if (null === $rating || $rating >= 3) {
return; // field not needed
}
$field->add(TextareaType::class, [
'label' => 'What went wrong?',
'attr' => ['rows' => 3],
'help' => sprintf('Because you gave a %d rating, we\'d love to know what went wrong.', $rating),
]);
});
}
}
diff
// src/Controller/FeedbackController.php
#[Route('/feedback', name: 'feedback')]
public function feedback(Request $request): Response
{
//...
- $feedbackForm = $this->createForm(FeedbackForm::class);
+ $feedbackForm = $this->createForm(FeedbackForm::class, options: [
+ // This is needed by Turbo Frame, it is not specific to Dependent Symfony Form Fields
+ 'action' => $this->generateUrl('feedback'),
+ ]);
$feedbackForm->handleRequest($request);
if ($feedbackForm->isSubmitted() && $feedbackForm->isValid()) {
+ /** @var SubmitButton $submitButton */
+ $submitButton = $feedbackForm->get('submit');
+ if (!$submitButton->isClicked()) {
+ return $this->render('feedback.html.twig', ['feedbackForm' => $feedbackForm]);
+ }
// Your code here
// ...
return $this->redirectToRoute('home');
}
return $this->render('feedback.html.twig', ['feedbackForm' => $feedbackForm]);
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.