Массив форм Symfony2?

Можно ли создавать и отображать массив форм, которые я знаю о коллекциях, но они не соответствуют моей идее?

Я хочу что-то вроде этого

Контроллер

$data=$em->findAll();
$Forms=$this->createForm(new SomeType,$data);

return $this->render(someView,array("Forms"=>$Forms->createView()));

Веточка

  {% for Form in Forms %}
  {{ form(Form)}}
  {% endfor %}

person harisk92    schedule 15.07.2014    source источник


Ответы (4)


Просто создайте свои формы в массиве:

$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));

ОБНОВЛЕНО

Как упоминалось edlouth, вы можете создавать каждую форму с именем отдельно. Я обновил свой код.

person Michael Sivolobov    schedule 15.07.2014
comment
Спасибо, братан, но у меня теперь другая проблема, когда я отправляю одну форму, она отправляет массив форм, причина, вероятно, в том, что все кнопки отправки имеют одинаковое значение. Как я могу это решить? - person harisk92; 15.07.2014
comment
Вам нужно генерировать различные формы. Чего вы хотите достичь? - person Michael Sivolobov; 15.07.2014
comment
Я хочу создать список форм удаления для каждой сущности, поэтому, когда я нажимаю кнопку удаления, я хочу вызвать какое-то действие, передать мою форму, получить из нее данные и удалить их с помощью диспетчера сущностей доктрины. - person harisk92; 15.07.2014

Создавайте формы в виде массива, но дайте каждой уникальное имя. Я изменил его на formbuilder, который может быть не идеальным для вас, но, надеюсь, что-то подобное сработает. Я также не уверен, стоит ли вводить new SomeType вместо 'form', см. 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));
person edlouth    schedule 15.07.2014
comment
Вы можете просто отредактировать мой ответ. Он имеет небольшие модификации от моего. - person Michael Sivolobov; 15.07.2014
comment
Я согласен, что мог бы сделать. Я не знал, что могу редактировать, учитывая мою репутацию, поскольку я пытался прокомментировать, но мне не разрешили, поэтому предположил, что должен дать отдельный ответ. - person edlouth; 15.07.2014

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]);
person Stan Fad    schedule 15.06.2017

Действие :

$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()
        // ...
    }
}

И лучший способ рендеринга:

return $this->render('some_view.html.twig', [
    'forms' => array_map(function ($form) {
        return $form->createView();
    }, $forms),
]);
person Sybio    schedule 05.11.2018