0

状況は次のとおりです。

3 つのテーブル (1 対多) があります: Product、ProductLabel、LabelTag (ラベルは予約済みです ---)

ご想像のとおり、製品には多くのラベルを付けることができます。

これで、使用可能なラベルを表示するフォーム プロダクトができました。私の新しいアクションと作成アクションでは、選択したラベルを表示して保存することができました。データベースから編集アクションでラベルを表示し、選択したラベルを表示しようとすると、問題が発生します。

いくつかのコード:

エンティティ製品:

/**
 * @var Doctrine\Common\Collections\ArrayCollection $productLabels
 *
 * @ORM\OneToMany(targetEntity="Labeyrie\Bundle\MainsiteBundle\Entity\ProductLabel", mappedBy="product")
 */
protected $productLabels;

エンティティ ラベル タグ:

/**
 * @var Doctrine\Common\Collections\ArrayCollection $productLabels
 *
 * @ORM\OneToMany(targetEntity="Labeyrie\Bundle\MainsiteBundle\Entity\ProductLabel", mappedBy="labelTag")
 */
protected $productLabels;

エンティティの製品ラベル:

/**
 * @var Labeyrie\Bundle\MainsiteBundle\Entity\Product $product
 * 
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="Labeyrie\Bundle\MainsiteBundle\Entity\Product", inversedBy="productLabels")
 */
protected $product;

/**
 * @var Labeyrie\Bundle\MainsiteBundle\Entity\LabelTag $labelTag
 * 
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="Labeyrie\Bundle\MainsiteBundle\Entity\LabelTag", inversedBy="productLabels")
 */
protected $labelTag;

製品形態:

->add('productLabels', 'entity', array(
            'class' => 'LabeyrieMainsiteBundle:LabelTag',
            'property' => 'title',
            'multiple' => true,
            'expanded' => true,
        ))

作成アクションで保存する方法は次のとおりです。

if ($form->isValid()) {
        /* save product */
        $em->persist($product);
        $em->flush();

        /* save product labels */
        $labels = $product->getProductLabels();
        if (!empty($labels)) {
            foreach ($labels as $label) {
                $productLabel = new ProductLabel();
                $productLabel->setLabelTag($label);
                $productLabel->setProduct($product);

                $em->persist($productLabel);
            }
        }
        $em->flush();
    }

それで問題ありません。

問題は私の編集アクションにあります:

$entity = $em->getRepository('MyProjectBundle:Product')->find($id));   

    $form = $this->createForm(new ProductType(), $entity);

単にフォームをレンダリングすると、ラベルのみが表示され、どのラベルが選択されたかという情報は送信されず (私が管理する中央のテーブルにあるため)、表示されません。

1 対多のアーキテクチャを使用してこれを解決する必要があります。フォームの構成が間違っていませんか? 助けてください。:)

4

1 に答える 1

0

私はついに答えを見つけました:

単に次のことを行う必要があります。

    $collection = new ArrayCollection();
    $labels = $entity->getProductLabels();
    if (!empty($labels)) {
        foreach ($labels as $label) {
            $collection->add($label->getLabelTag());
        }
    }

    $form->get('productLabels')->setData($collection); 

個々のオブジェクト (LabelTag) を取得し、それを配列コレクションに入れ、コレクションをフォーム フィールドのデータに渡せば完了です。

フォームが表示され、選択したオプションが表示されます。

于 2013-04-04T11:32:24.460 に答える