Проверка формы (Sym2) - недопустимый номер параметра: количество связанных переменных не соответствует количеству токенов - PullRequest
1 голос
/ 02 апреля 2012

Я использую 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]: недопустимый номер параметра: количество связанных переменных не соответствует количеству токенов

Полагаю, эта ошибка заключается в отправке дополнительных тегов, из которых было

как я могу предотвратить эту ошибку? Спасибо

...