Поля коллекции форм 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);
}
Если у кого-то есть предложение, было бы здорово