Коллекция форм symfony2 Эта форма не должна содержать лишних полей error

У меня есть форма Symfony, которую я использую либо для создания новых сущностей, либо для параметризации существующих. Параметрирование работает отлично.
При создании новых объектов я использую прослушиватель событий presetdata, чтобы не отображать поля, поэтому отображается только прототип.

В этом случае addind новая строка прекрасно работает, только если в моей базе данных нет сущностей. если уже есть один ряд, он бросает

Эта форма не должна содержать дополнительных полей

ошибка. Я установил true для allow_add и allow_delete. Любая идея о том, что проблема?

Мой контроллер:

/**
* @Route("/create", name="worker_create")
* @Method({"POST","GET"})
* @Template(":FoodAnalytics/Worker:create_worker.html.twig")
* @param Request $request
* @return array|\Symfony\Component\HttpFoundation\RedirectResponse
*/
public function createWorkerAction(Request $request)
{
$formManager = $this->get('form_manager');
$createWorkerForm = $formManager->createForm(new UserUserWorkersType(false, '_create'), $this->getUser(), 'POST' , 'worker_create',null,'Enregistrer');
if ($request->getMethod() == 'POST')
{
if ($formManager->handleRequestAndFlush($createWorkerForm, $this->getUser()))
{
$formManager->addSuccess('Les associés ont été rajoutés.');

return $this->redirect($this->generateUrl('my_teams'));
}

return $this->render(
':FoodAnalytics/Team:my_teams.html.twig',
array(
'create_worker_form' => $createWorkerForm->createView(),
'tab' => 'create_worker'
));
}

return array(
'create_worker_form' => $createWorkerForm->createView()
);

}

Моя первая форма:

<?php
//src/AppBundle/Form/User/UserUserWorkersType.php
namespace AppBundle\Form\User\UserCollections;

use AppBundle\Form\FoodAnalytics\WorkerType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class UserUserWorkersType extends AbstractType
{
private $displayExisting;
private $suffix;

public function __construct($displayExisting = true, $suffix)
{
$this->displayExisting = $displayExisting;
$this->suffix = $suffix;
}

/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('workers', 'collection', array(
'type' => new WorkerType($this->displayExisting),
'by_reference' => false,
'allow_add' => true,
'allow_delete' => true,
'label' => 'Associés',
))
;
}

/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(
array(
'data_class' => 'AppBundle\Entity\User\User',
)
);
}

/**
* @return string
*/
public function getName()
{
return 'appbundle_user_user_workers'.$this->suffix;
}
}

Форма моей коллекции:

<?php

namespace AppBundle\Form\FoodAnalytics;

use AppBundle\Entity\FoodAnalytics\Worker;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class WorkerType extends AbstractType
{
private $displayExisting;

public function __construct($displayExisting = true)
{
$this->displayExisting = $displayExisting;
}

/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event)
{
/** @var $worker Worker */
$worker = $event->getData();
$form = $event->getForm();

if (!$worker || ($worker && $this->displayExisting))
{
$form
->add('title','choice',array(
'choices' => ['M.' => 'M.', 'Mme' => 'Mme'],
'label' => 'Titre',
))
->add('firstName','text',array(
'label' => 'Prénom',
))
->add('lastName','text',array(
'label' => 'Nom',
))
->add('position','text',array(
'label' => 'Poste occupé',
))
->add('totalCost','number',array(
'label' => 'Coût total mensuel (€)',
'required' => false,
'attr' => array(
'data-toggle' => "tooltip",
'data-placement' => "top",
'title' => "Indiquez ici le coût total que représente le salarié par mois (salaires brut, primes, taxes, coûts cachés, etc). Cette donnée est totalement confidentielle.",
)))
->add('weeklyHours','number',array(
'label' => "Durée de travail par semaine (h)",
'required' => false,
'attr' => array(
'data-toggle' => "tooltip",
'data-placement' => "top",
'title' => "Indiquez ici la durée de travail hebdomadaire de votre associé. Cette donnée est totalement confidentielle.",
)));
}
});
}

/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\FoodAnalytics\Worker'
));
}

/**
* @return string
*/
public function getName()
{
return 'appbundle_foodanalytics_worker';
}
}

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector