Как визуализировать коллекции форм

У меня проблема с рендерингом форм в Twig. Я пытаюсь встроить коллекцию форм. Когда я визуализирую коллекцию, она не отображается, а отображается имя формы. Цель состояла в том, чтобы сделать формы с кнопкой добавления, чтобы добавлять во время выполнения форму для каждого элемента коллекции. Я просматриваю документацию Symfony и думаю, что следовал ей шаг за шагом.

Это мой контроллер:

function new_resultAction($id)
{
    $em = $this->getDoctrine()->getEntityManager();

    $test = $em->getRepository('LadelaOdeskTesterBundle:Test')->find($id);
    $categories =  
      $em->getRepository('LadelaOdeskTesterBundle:Category')->findByTest($test);
    if (!$test) {
        throw $this->createNotFoundException('Unable to find Test entity.');
    } 

    $resultCategory = new Category();


    $form = $this->createForm(new CategoryType() , $resultCategory);

    $request = $this->getRequest();

    if ('POST' === $request->getMethod()) {

        $form->bindRequest($request);

        if ($form->isValid()) {

            $em->persist($resultCategory);                
            $em->flush();

            $this->get('session')->setFlash('success', 'New result Categories were 
          saved!');
            return $this->redirect($this->generateUrl('questions', array(
                'id' => $resultCategory->getId(),
            )));
        }
    }                 
  return array(
        'test' => $test,
        'categories' =>$categories,

        'form' => $form->createView(), 


      );

}

Мои формы:

 class ResultCategoryType extends AbstractType
    {
  public function buildForm(FormBuilderInterface $builder, array $options)
   {
    $builder->add('value', 'integer');
    $builder->add('category', 'entity', array(
            'class'         => 'Ladela\OdeskTesterBundle\Entity\Category',
            'query_builder' => function ($repository) { return 
     $repository->createQueryBuilder('p')->orderBy('p.name', 'ASC'); },
             'property' => 'name' ,
               'expanded' => false ,
               'multiple' => false , ));


 }

  public function setDefaultOptions(OptionsResolverInterface $resolver)
  {
    $resolver->setDefaults(array(
        'data_class' => 'Ladela\OdeskTesterBundle\Entity\ResultCategory'
    ));
  }

  public function getName()
{
    return 'ResultCategory';
}
 }

 class CategoryType extends AbstractType
 {
  public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name')
        ->add('resultCategories','collection', array(
            'type' => new ResultCategoryType(),
            'allow_add' => true,
            'by_reference' => false,
            'prototype' => true,

        ))
    ;
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Ladela\OdeskTesterBundle\Entity\Category'
    ));
}

public function getName()
{
    return 'category';
}

}

И мой файл ветки:

<form method="post" action="{{ path('questions',{'id': test.id })  }}" {{   
  form_enctype(form) }} >    

  <ul class="tags" data-prototype="{{ 
  form_widget(form.resultCategories.vars.prototype)|e 
   }}">
    {# iterate over each existing tag and render its only field: name #}
    {% for ResultCategory in form.resultCategories %}
        <li>{{ form_row(ResultCategory.category) }}</li>
    {% endfor %}
<a href="#" class="add_tag_link">Add a tag</a>

</ul>        
{{ form_rest(form) }}{# form.items's prototype is rendered twice #}
{{ form_errors(form) }}
<input type="submit" value ="add" />
</form> 

 {% block javascripts %}


<script type="text/javascript">
// Get the div that holds the collection of tags
var collectionHolder = $('ul.tags');

 // setup an "add a tag" link
   var $addTagLink = $('<a href="#" class="add_tag_link">Add a tag</a>');
  var $newLinkLi = $('<li></li>').append($addTagLink);

jQuery(document).ready(function() {
// add the "add a tag" anchor and li to the tags ul
collectionHolder.append($newLinkLi);

$addTagLink.on('click', function(e) {
    // prevent the link from creating a "#" on the URL
    e.preventDefault();

    // add a new tag form (see next code block)
    addTagForm(collectionHolder, $newLinkLi);
   });
 });
  // Get the div that holds the collection of tags
 var collectionHolder = $('ul.tags');

  // setup an "add a tag" link
 var $addTagLink = $('<a href="#" class="add_tag_link">Add a tag</a>');
 var $newLinkLi = $('<li></li>').append($addTagLink);

  jQuery(document).ready(function() {
 // add the "add a tag" anchor and li to the tags ul
  collectionHolder.append($newLinkLi);

 $addTagLink.on('click', function(e) {
    // prevent the link from creating a "#" on the URL
    e.preventDefault();

    // add a new tag form (see next code block)
    addTagForm(collectionHolder, $newLinkLi);
   });
  });

  {% endblock %}

person Sergios.Soft    schedule 14.11.2012    source источник


Ответы (1)


Коллекция форм не отображается, так как вы не инициируете ее! см. официальную документацию. Существуют «фиктивные» объекты тегов, используемые для создания форм тегов.

person JeanValjean    schedule 14.11.2012
comment
Цель состоит в том, чтобы показать форму TagType для каждого тега, который вы хотите добавить! Если вы не передаете объект тега при создании формы, форма не отображается! Вы можете использовать кнопку добавления, чтобы создать новую форму тега во время выполнения, используя прототип - person JeanValjean; 14.11.2012
comment
Попробуйте создать объект Tag и добавить его в объект Category перед передачей объекта Category в FormBuilder. - person JeanValjean; 14.11.2012
comment
Неустранимая ошибка: не удается получить доступ к частной собственности Ladela\OdeskTesterBundle\Entity\ResultCategory::$category - person Sergios.Soft; 14.11.2012
comment
Это происходит при отправке формы или при ее создании? - person JeanValjean; 14.11.2012
comment
Ну нет... не делай этого! Вы меняете вопрос! - person JeanValjean; 14.11.2012
comment
Ну, вы не можете вызывать $tag-›category! Почему вы не используете сеттерные функции? Например. $tag-›setCategory($category); Более того, я не понимаю, почему вы разработали такие теги, как категория должна быть установлена! Вы должны пометить категорию, а не наоборот. Я ожидаю что-то вроде $category-›addTag($tag). - person JeanValjean; 14.11.2012
comment
@ Sergios.Soft Если у вас есть другой вопрос, задайте его. Эта ветка комментариев становится довольно длинной. - person Tim Post♦; 14.11.2012
comment
я должен пометить категорию результата из категории :), потому что в категории я дал коллекцию :), это мой логический путь - person Sergios.Soft; 14.11.2012
comment
посмотри на мои формы, у меня не получается :( не понимаю - person Sergios.Soft; 14.11.2012