Я использую Symfony2 + Doctrine 2
При проверке динамической формы выдает мне эту ошибку и не понимаю, почему. Ошибка появляется только тогда, когда я добавляю один или несколько conocimiento (тегов) в класс 'Recurso'
Я представляю здесь соответствующие классы
class Recurso
{
...
/**
* @var TheWire\PersonaBundle\Entity\Rec_Conocimiento $conocimiento
*,
* @ORM\OneToMany(targetEntity="TheWire\PersonaBundle\Entity\Rec_Conocimiento", mappedBy="recurso", cascade={"all"}, orphanRemoval="true")
*/
private $conocimiento;
...
public function __construct() {
$this->conocimiento = new \Doctrine\Common\Collections\ArrayCollection();
}
....
/**
* Set conocimiento
*
* @param \TheWire\PersonaBundle\Entity\Rec_Conocimiento $conocimiento
*/
public function setConocimiento($conocimiento)
{
$this->conocimiento = $conocimiento;
foreach ($conocimiento as $con){
$con->setRecurso($this);
}
}
/**
* Get conocimiento
*
* @return \Doctrine\Common\Collections\ArrayCollection
*/
public function getConocimiento()
{
return $this->conocimiento;
}
.....
И
class Rec_Conocimiento
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
*
* @ORM\id
* @ORM\ManyToOne(targetEntity="TheWire\PersonaBundle\Entity\Recurso", inversedBy="conocimiento")
* @ORM\JoinColumn(name="recurso_id", referencedColumnName="id")
*/
private $recurso;
/**
* @var string $conocimiento
* @ORM\Id
* @ORM\ManyToOne(targetEntity="TheWire\PersonaBundle\Entity\Conocimiento")
*/
private $conocimiento;
/**
* @var smallint $nivel
*
* @ORM\Column(name="nivel", type="smallint")
*/
private $nivel;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set recurso
*
* @param \TheWire\PersonaBundle\Entity\Recurso $recurso
*/
public function setRecurso(\TheWire\PersonaBundle\Entity\Recurso $recurso)
{
$this->recurso = $recurso;
}
/**
* Get recurso
*
* @return \TheWire\PersonaBundle\Entity\Recurso
*/
public function getRecurso()
{
return $this->recurso;
}
/**
* Set conocimiento
*
* @param string $conocimiento
*/
public function setConocimiento(\TheWire\PersonaBundle\Entity\Conocimiento $conocimiento)
{
$this->conocimiento = $conocimiento;
}
/**
* Get conocimiento
*
* @return string
*/
public function getConocimiento()
{
return $this->conocimiento;
}
/**
* Set nivel
*
* @param smallint $nivel
*/
public function setNivel($nivel)
{
$this->nivel = $nivel;
}
/**
* Get nivel
*
* @return smallint
*/
public function getNivel()
{
return $this->nivel;
}
...
И класс TheWire \ PersonaBundle \ Entity \ Conocimiento имеет только $ id и $ name (Tags)
Я создал форму:
class RecursoAddType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('conocimiento', 'collection', array(
'required' => false,
'type' => new ConocimientoAddType(),
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
// Post update
'by_reference' => false,
))
;
}
и
class ConocimientoAddType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('conocimiento', 'entity', array(
'required' => false,
'class' => 'TheWire\\PersonaBundle\\Entity\\Conocimiento',
'empty_value' => 'Selecciona un conocimiento',
'multiple' => false,
'query_builder' => function(EntityRepository $repositorio) {
return $repositorio->createQueryBuilder('con')->leftjoin('con.bloque', 'bloque')
->orderBy('bloque.descripcion, con.descripcion');
},
))
->add('nivel', null,array('required' => false, 'label' => 'Nivel: '))
;
}
Я создал в контроллере нормально, с сущностью в БД и перешел к Twig
$recurso = $em->getRepository('PersonaBundle:Recurso')->findOneBy(array('id' => $id));
$formularioEditarRecurso = $this->createForm(new RecursoAddType(), $recurso);
Я показываю форму и использую jquery для динамического добавления дополнительных полей
<script type="text/javascript">
$(document).ready(function()
{
function add()
{
var collectionHolder = $('#thewire_personabundle_recursoaddtype_conocimiento');
var prototype = collectionHolder.attr('data-prototype');
form = prototype.replace(/\$\$name\$\$/g, collectionHolder.children().length);
collectionHolder.append(form);
}
$(".record_actions").delegate("a.jslink", "click", function(event){
event.preventDefault();
add();
});
});
</script>
При действительной форме:
if ($request->getMethod() == 'POST') {
$formularioEditarRecurso->bindRequest($request);
if ($formularioEditarRecurso->isValid()) {
$em->persist($recurso);
$em->flush();
return $this->redirect($this->generateUrl('AdminPeticionVer', array('id' => $recurso->getPeticion()->getId())));
}
}
Получите ошибку:
SQLSTATE [HY093]: недопустимый номер параметра: количество связанных переменных
не соответствует количеству токенов
Полагаю, эта ошибка заключается в отправке дополнительных тегов, из которых было
как я могу предотвратить эту ошибку?
Спасибо