2016-01-27 123 views
2

我是symfony2的新手,我正在用它創建我的第一家網上商店。我有產品,我想添加產品尺寸,一種產品可以有多種尺寸,一種尺寸可以有多種產品。例如:兩個產品貓都有'M'尺寸。產品和尺寸symfony2原則示例

class Product { 
    ... 
    /** 
    * @ORM\ManyToMany(targetEntity="Size", inversedBy="products", cascade={"persist", "merge"}) 
    * @ORM\JoinTable(name="sizes") 
    */ 
    private $sizes; 
} 

//in another file 
class Size { 
    /** 
    * @ORM\ManyToMany(targetEntity="Product", mappedBy="sizes") 
    */ 

    protected $products; 
} 

ProductController.php

... 
      ->add('sizes', CollectionType::class, [ 
       'entry_type' => SizeType::class, 
       'label' => 'Sizes', 
       'allow_add' => true, 
      ]) 
... 

SizeType.php

public function buildForm(FormBuilderInterface $builder, array $options) { 
    $repo = $this->em->getRepository('AppBundle:Size'); 

    $q = $repo->createQueryBuilder('c') 
      ->getQuery(); 

    $sizes = $q->getResult(); 

    $builder->add('name', EntityType::class, array(
     'class' => 'AppBundle:Size', 
     'choice_label' => 'name', 
    )); 
} 

現在我越來越 Catchable Fatal Error: Object of class AppBundle\Entity\Size could not be converted to string我可以解決,如果我實現__toString()但我不知道這是否是正確的做法,如果我這樣做,在編輯產品時,下拉列表不會選擇正確的大小。

我的問題是,這是正確的方式來實現產品尺寸功能的網上商店?

回答

0

嘗試使用此代碼:

$builder->add('name', EntityType::class, array(
    'class' => 'AppBundle:Size', 
    'choice_label' => 'name', 
    'property' => 'needed_property_name' //just write the needed property name there 
)); 
+0

'choice_label選項是在Symfony 2.7中引入的。在Symfony 2.7之前,它被稱爲屬性(它具有相同的功能)。http://symfony.com/doc/current/reference/forms/types/entity.html#choice-label – nacholibre

+0

哦,我明白了,這就是我的錯 - 忘了這件事。 –

+0

關於在編輯時選擇錯誤的尺寸:如果您在字段選項中未提供「choice_value」,可能會出現問題。來自doc:「default爲null,如果使用null,則使用遞增整數作爲名稱。」請參閱:https://github.com/symfony/symfony/pull/14825 –

-2

產品的註釋看起來是錯誤的。該JoinTable是一個查找表許多一對多的關係:

Lookup table

的慣例是將它命名鏈接後表:products_sizes你的情況:

class Product { 
    ... 
    /** 
    * @ORM\ManyToMany(targetEntity="Size", inversedBy="products", cascade={"persist", "merge"}) 
    * @ORM\JoinTable(name="products_sizes") 
    */ 
    private $sizes; 
} 
0

所以我想通更好的方法來做到這一點,'實體'類型與多個=> true

 ->add('sizes', 'entity', [ 
      'class' => Size::class, 
      'label' => 'Размери', 
      'choice_label' => 'name', 
      'multiple' => true, 
      'expanded' => false, 
      //'allow_add' => true, 
     ]) 

這種方式可以選擇多種尺寸,bootstrap-multiselect我已經做得很好看,現在完全適合我。

我很想聽聽有沒有更好的方法。