Is it possible to create and render and array of forms I know about collections but they don't really fit in my idea?
What I want is something like this
Controller
$data=$em->findAll();
$Forms=$this->createForm(new SomeType,$data);
return $this->render(someView,array("Forms"=>$Forms->createView()));
Twig
{% for Form in Forms %}
{{ form(Form)}}
{% endfor %}
Just create your forms in array:
$data = $em->findAll();
for ($i = 0; $i < $n; $i++) {
$forms[] = $this->container
->get('form.factory')
->createNamedBuilder('form_'.$i, new SomeType, $data)
->getForm()
->createView();
}
return $this->render(someView, array("forms" => $forms));
UPDATED
As mentioned by edlouth you can create each form named separately. I updated my code.
Create the forms in an array, but give each one a unique name.
I've changed it to formbuilder which might not be ideal for you but hopefully something similar will work. I'm also not certain about putting in new SomeType
rather than 'form', see http://api.symfony.com/2.4/Symfony/Component/Form/FormFactory.html#method_createNamedBuilder.
$data = $em->findAll();
for ($i = 0; $i < $n; $i++) {
$forms[] = $this->container
->get('form.factory')
->createNamedBuilder('form_'.$i, new SomeType, $data)
->getForm()
->createView();
}
return $this->render(someView, array("forms" => $forms));
Symfony3:
$datas = $em->findAll();
foreach ($datas as $key=>$data)
{
$form_name = "form_".$key;
$form = $this->get('form.factory')->createNamed(
$form_name,
SomeType::class,
$data
);
$views[] = $form->createView();
}
return $this->render(someView, ["forms" => $views]);
The action :
$forms = [];
foreach ($articles as $article) {
$forms[$article->getId()] = $this->get('form.factory')->createNamed(
'article_'.$article->getId(), // unique form name
ArticleType::class,
$article
);
$forms[$article->getId()]->handleRequest($request);
if ($forms[$article->getId()]->isValid()) {
// do what you want with $forms[$article->getId()]->getData()
// ...
}
}
And a better way to render :
return $this->render('some_view.html.twig', [
'forms' => array_map(function ($form) {
return $form->createView();
}, $forms),
]);