Reputation: 130
I would like to add an extra comment to my ChoiceType field in Symfony. So here is my method. It works but I am curious to know if there would be a better methodology.
In my controller, I have an array of comments and pass the array to my formType. Values of array can contain some HTML tags as well.
$comments[0] = 'Lorem ipsum dolor sit amet,consectetur adipiscing elit. Praesent nec pellentesque velit, ut porta erat. Etiam convallis rhoncus erat vitae sodales. Vivamus porta tellus erat, non congue urna blandit eget. Nam urna dolor, lacinia luctus ex sed, ornare luctus eros. Morbi varius est a nisi facilisis, bibendum dictum turpis maximus.';
$comments[1] = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent nec pellentesque velit, ut porta erat. Etiam convallis rhoncus erat vitae sodales. Vivamus porta tellus erat, non congue urna blandit eget. Nam urna dolor, lacinia luctus ex sed, ornare luctus eros. Morbi varius est a nisi facilisis, bibendum dictum turpis maximus.';
$comments[2] = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent nec pellentesque velit, ut porta erat. Etiam convallis rhoncus erat vitae sodales. Vivamus porta tellus erat, non congue urna blandit eget. Nam urna dolor, lacinia luctus ex sed, ornare luctus eros. Morbi varius est a nisi facilisis, bibendum dictum turpis maximus.';
$form = $this->createForm(UserSessionType::class, $userSession, ['choices' => $choices, 'comments' => $comments, 'amounts' => $amounts]);
And my formType Is the following. I catch the comments and put them in a data attribute
$this->comments = $options['comments'];
$builder
->add('funding', ChoiceType::class, [
'mapped' =>false,
'choices' => $this->choices,
'choice_attr' => function($choiceValue, $key, $index) {
return ['data-comment' => $this->comments[$index]];
},
'expanded' => true
])
Then with a js script, I get the content of data ttribute an displays it.
document.addEventListener("DOMContentLoaded", () => {
document.querySelectorAll('[data-comment]').forEach(function(field) {
var comment = field.getAttribute('data-comment');
var span = document.createElement('div');
span.classList.add("comment");
span.innerHTML = comment;
field.parentNode.appendChild(span);
});
});
Thanks for any insight.
Upvotes: 0
Views: 114
Reputation: 2679
Yes you can do it directly in the formType without javascript
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
->add('funding', ChoiceType::class, [
'choices' => [
'choice 1' => 'aa',
'choice 2' => 'bb',
'choice 3' => 'cc',
],
])
public function finishView(FormView $view, FormInterface $form, array $options): void
{
$comments[0] = 'Comment 1';
$comments[1] = 'comment 2';
$comments[2] = 'comment 3';
$choices = $view->children['funding']->vars['choices'];
foreach ($choices as $index => $choice){
$choice->label .= " ".$comments[$index];
}
}
The result :
Solution 2 based on post owner comment:
// formType
->add('funding', ChoiceType::class, [
'mapped' =>false,
'choices' => [
'choice 1' => 'aa',
'choice 2' => 'bb',
'choice 3' => 'cc',
'choice 4' => 'dd',
],
'expanded' => true
])
// in controller
$comments[0] = 'Lorem ipsum dolor sit amet,consectetur adipiscing elit. Praesent nec pellentesque velit, ut porta erat. Etiam convallis rhoncus erat vitae sodales. Vivamus porta tellus erat, non congue urna blandit eget. Nam urna dolor, lacinia luctus ex sed, ornare luctus eros. Morbi varius est a nisi facilisis, bibendum dictum turpis maximus.';
$comments[1] = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent nec pellentesque velit, ut porta erat. Etiam convallis rhoncus erat vitae sodales. Vivamus porta tellus erat, non congue urna blandit eget. Nam urna dolor, lacinia luctus ex sed, ornare luctus eros. Morbi varius est a nisi facilisis, bibendum dictum turpis maximus.';
$comments[2] = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent nec pellentesque velit, ut porta erat. Etiam convallis rhoncus erat vitae sodales. Vivamus porta tellus erat, non congue urna blandit eget. Nam urna dolor, lacinia luctus ex sed, ornare luctus eros. Morbi varius est a nisi facilisis, bibendum dictum turpis maximus.';
return $this->render('template_name.html.twig', [
'form' => $form->createView(),
'comments'=> $comments
]);
}
// twig
<div style="margin: 50px">
{{ form_label(form.funding) }}
{% for key, fundingItem in form.funding.children %}
<div style="padding: 12px">
{{ form_widget(fundingItem) }}
{{ form_label(fundingItem) }}
{% if key in comments|keys %}
<div style="padding: 5px">
{{ comments[key]|raw }}
</div>
{% endif %}
</div>
{% endfor %}
</div>
Upvotes: 1