Поля коллекции форм Symony2 не добавляются в данные публикации

У меня странная проблема с коллекцией форм в symfony2.

Я сделал коллекцию форм, чтобы добавить награды человеку. Если я пытаюсь добавить вознаграждение человеку в контроллере, он добавляется в форму без проблем, и если я отправляю форму, она сохраняется в базе данных.

Проблема в том, когда я добавляю награду в форме через доктрину. Он отображается в форме без проблем, но никогда не попадает в submitController. Если я дам полный набор данных POST, "первая" награда есть, но добавленной награды нигде нет.

Имена полей формы кажутся правильными: designer_form[awards][0][year] для существующего поля designer_form[awards][1][year] для добавленного поля

Форма награды выглядит как

class DesignerAwardForm extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('year','textarea');


}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Common\UserBundle\Entity\DesignerAwards',
    ));
}

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

и форма конструктора:

namespace Common\UserBundle\Form;


use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Common\UserBundle\Form\DesignerAwardForm;

use Common\MediaBundle\Form\MediaForm;


class DesignerDataForm extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $toolbar = array(
    'toolbar' => array(

        array(
            'name'  => 'basicstyles',
            'items' => array('Bold', 'Italic', 'Underline', 'Strike', 'Subscript', 'Superscript', '-', 'RemoveFormat'),
        )));

    $builder
        ->add('description','ckeditor', array('config' => $toolbar, ))
        ->add('titles','ckeditor', array('config' => $toolbar, ))
        ->add('expertise','ckeditor', array('config' => $toolbar, ))
        ->add('education','ckeditor', array('config' => $toolbar, ))
        ->add('work_experience','ckeditor', array('config' => $toolbar, ))
        ->add('publications','ckeditor', array('config' => $toolbar, ))
        //->add('address', new \Common\ContactDataBundle\Form\AddressForm())
        ->add('awards', 'collection', array(
            'type' => new DesignerAwardForm(),
            'allow_add'    => true,
            'prototype' => true,
            'by_reference' => false,))
    ;

}

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

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Common\UserBundle\Entity\Designer',
    ));
}
}

вызов в шаблоне:

<ul class="awards"  data-prototype="{{ form_widget(edit_form.awards.vars.prototype)|e     }}">

                {% for award in edit_form.awards %}
                    <li>{{ form_row(award.year) }}</li>

                {% endfor %}
            </ul>

контроллер:

$oDesignerForm = $this->em->getRepository('CommonUserBundle:Designer')->find($id);



    $oForm = $this->createForm(new \Common\UserBundle\Form\DesignerDataForm(), $oDesignerForm);

отправить часть:

$oDesigner = $this->em->getRepository('CommonUserBundle:User')->find($id);

    $this->checkAccessRights($oDesigner, "EDIT");

    $oForm = $this->createForm(new \Common\UserBundle\Form\DesignerDataForm(), $oDesigner);

    $request = $this->getRequest();

    $oForm->bind($request);

    if ($oForm->isValid()) {

Прототип Javascript:

var collectionHolder = $('ul.awards');

// setup an "add a tag" link
var $addTagLink = $('<a href="#" class="add_tag_link">Add an award</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);

// count the current form inputs we have (e.g. 2), use that as the new
// index when inserting a new item (e.g. 2)
collectionHolder.data('index', collectionHolder.find(':input').length);

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

function addTagForm(collectionHolder, $newLinkLi) {
// Get the data-prototype explained earlier
var prototype = collectionHolder.data('prototype');

// get the new index
var index = collectionHolder.data('index');

// Replace '__name__' in the prototype's HTML to
// instead be a number based on how many items we have
var newForm = prototype.replace(/__name__/g, index);

// increase the index with one for the next item
collectionHolder.data('index', index + 1);

// Display the form in the page in an li, before the "Add a tag" link li
var $newFormLi = $('<li></li>').append(newForm);
$newLinkLi.before($newFormLi);
}

Если у кого-то есть предложение, было бы здорово

0 ответов

Другие вопросы по тегам