Nina
Nina

Reputation: 130

Adding a comment to choiceType in a symfony form

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

Answers (1)

hous
hous

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 :

enter image description here

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>

The result: enter image description here

Upvotes: 1

Related Questions