lista - php object
Error: el nuevo valor debe ser una matriz o una instancia de / Traversable, clase Entidad dada (2)
Las "categorías" de su campo deben ser un tipo de colección de entidad y no solo una entidad.
En su ejemplo, intenta reemplazar $ categorías que es una colección por una entidad de Categoría.
Lea esto: CollectionType Field
Pero yo era de la opinión de que hay un malentendido: ¿intentas dar múltiples categorías a una sola publicación? ¿Has invertido la cosa? Una categoría contiene varias publicaciones?
http://symfony.com/doc/current/reference/forms/types/collection.html
Tengo una asociación manyToMany
entre Post
y Category
. Estoy intentando enviar el formulario de publicación para crear una publicación con la categoría seleccionada del menú desplegable <select>
.
El formulario está traduciendo la corrección usando:
<div id="form-categories-widget">
<select id="shop_bundle_managementbundle_posttype_categories"
name="shop_bundle_managementbundle_posttype[categories]">
{% for key,val in form.categories.vars.choices %}
<option value="{{ val.value }}" {{ form.categories.vars.value == '''' and key == 0 ? '' selected '' :(val.value == form.categories.vars.value ? '' selected '' : '''') }}
>
{{ val.data.getName | trans }}
</option>
{% endfor %}
</select>
</div>
El problema:
Cuando hago clic en el botón de enviar, tengo el siguiente error (por el que he pasado aproximadamente 2 días tratando de descubrirlo):
Las "categorías" de propiedades de la clase "Comprar / Paquete / ManagementBundle / Entity / Post" se pueden definir con los métodos "addCategory ()", "removeCategory ()" pero el nuevo valor debe ser una matriz o una instancia de / Traversable, "Tienda / Bundle / ManagementBundle / Entity / Category" dado.
Aquí están mi tipo de formulario y entidad (si alguna vez son útiles). Le agradezco de antemano por su invaluable tiempo y ayuda, como de costumbre.
Publicación de la entidad:
<?php
namespace Shop/Bundle/ManagementBundle/Entity;
class Post
{
.....
/**
* @var /Doctrine/Common/Collections/Collection
*/
private $categories;
/**
* Add category
*
* @param /Shop/Bundle/ManagementBundle/Entity/Category $category
*
* @return Post
*/
public function addCategory(/Shop/Bundle/ManagementBundle/Entity/Category $category)
{
$this->categories[$category->getName()] = $category;
$category->addPost($this);
return $this;
}
/**
* Remove category
*
* @param /Shop/Bundle/ManagementBundle/Entity/Category $category
*/
public function removeCategory(/Shop/Bundle/ManagementBundle/Entity/Category $category)
{
$this->categories->removeElement($category);
}
/**
* Get categories
*
* @return /Doctrine/Common/Collections/Collection
*/
public function getCategories()
{
return $this->categories;
}
}
Tipo de mensaje
class PostType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(''categories'', ''entity'', array(
''multiple'' => false, // Multiple selection allowed
''expanded'' => false, // Render as checkboxes
''class'' => ''ShopManagementBundle:Category'',
''property'' => ''name''
));
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
''data_class'' => ''Shop/Bundle/ManagementBundle/Entity/Post''
));
}
/**
* @return string
*/
public function getBlockPrefix()
{
return ''shop_bundle_managementbundle_posttype'';
}
}
El problema provenía de la plantilla de formulario porque lo codificaba manualmente, olvidando los corchetes dobles []
. Entonces, en lugar de:
<select id="shop_bundle_managementbundle_posttype_categories"
name="shop_bundle_managementbundle_posttype[categories]">
Debería haber estado usando:
<select id="shop_bundle_managementbundle_posttype_categories"
name="shop_bundle_managementbundle_posttype[categories][]">
Espero que otra persona no cometa el mismo error.
Gracias