我在manyToMany
和Post
之间建立了Category
关联。我正在尝试提交帖子表单,以便从下拉列表<select>
创建包含所选类别的帖子。
表单使用以下方式呈现correclty:
<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>
问题:
当我点击提交按钮时,我有以下错误(我花了大约2天的时间试图弄明白):
属性&#34;类别&#34;在班上 &#34;铺\捆绑\ ManagementBundle \实体\后&#34;可以用。来定义 方法&#34; addCategory()&#34;,&#34; removeCategory()&#34;但新的价值必须是 \ Traversable的数组或实例, &#34;铺\捆绑\ ManagementBundle \实体\类别&#34;给出。
这是我的表单类型和实体(如果它们有用的话)。我提前感谢你宝贵的时间和平常的帮助。
实体发布:
<?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;
}
}
PostType
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';
}
}
答案 0 :(得分:1)
您的字段“类别”必须是实体的CollectionType,而不仅仅是实体。
在您的示例中,您尝试替换类别实体的集合$ categories。
阅读本文:CollectionType Field
但我认为存在一个误解:你试图给一个帖子提供多个类别? 你扭转了这件事吗?一个类别包含多个帖子?
http://symfony.com/doc/current/reference/forms/types/collection.html
答案 1 :(得分:1)
问题来自表单模板,因为我手动编码它忘记了双括号[]
。所以而不是:
<select id="shop_bundle_managementbundle_posttype_categories"
name="shop_bundle_managementbundle_posttype[categories]">
我应该一直在使用:
<select id="shop_bundle_managementbundle_posttype_categories"
name="shop_bundle_managementbundle_posttype[categories][]">
我希望其他人不会犯同样的错误。
由于