У меня есть manyToMany
ассоциация между Post
и Category
. Я пытаюсь отправить форму Post, чтобы создать сообщение с выбранной категорией из раскрывающегося списка <select>
.
Форма выполняет корреляцию, используя:
<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 дней, пытаясь выяснить):
Свойство «категории» в классе «Магазин \ Bundle \ ManagementBundle \ Entity \ Post» может быть определено с помощью методов «addCategory ()», «removeCategory ()», но новое значение должно быть массивом или экземпляром \ Traversable, «Магазин \ Bundle \ ManagementBundle \ Entity \ Category".
Вот мой тип формы и сущность (если они когда-либо полезны). Я заранее благодарю вас за ваше неоценимое время и помощь, как обычно.
Entity Post:
<?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; } }
-<?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'; } }
Ваши категории полей должны быть CollectionType объекта, а не просто сущностью.
В вашем примере вы пытаетесь заменить $ categories, который является коллекцией объекта Category.
Прочтите это: Поле CollectionType
Но я считал, что есть недоразумение: вы пытаетесь дать несколько категорий одному сообщению? Вы изменили ситуацию? Одна категория содержит несколько сообщений?
http://symfony.com/doc/current/reference/forms/types/collection.html
Проблема исходила из шаблона формы, потому что я вручную закодировал его, забыв двойные скобки []
. Поэтому вместо:
<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][]">
Я надеюсь, что другой человек не совершит ту же ошибку.
благодаря