1. SakagamiKeisuke

    Posted

    SakagamiKeisuke
Changes in title
+ECCUBE4 Symfony EntityTypeフォームで多対多 Many To Many メモ
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,172 @@
+
+##EntityType の多対多 ManyToMany のとき(汗
+select、radio、listに対応したChoiceTypeフォームがありますが
+ChoiceTypeフォームを外部テーブルを参照したものがEntitytypeです
+設定が特にいやらしいです
+
+```言語:多対多の従テーブルをチェックボックスで表示した例
+※ここでは、多対多の主をデッキテーブル、従をデッキタグテーブルとします
+
+ <div>
+ <div>
+ <label>デッキタグ</label> //ラベル(任意)
+ </div>
+
+ //エンティティループ表示=デッキタグテーブルに存在するレコード(タグ名)を表示
+ <div>
+ {% for deckTag in form.deckTags %} //deckTagsはRepositoryでManyToMany定義
+ <div>
+ {{ form_widget(deckTag) }} //deckTagから取り出したdecktagを表示
+ </div>
+ {% endfor %}
+ {{ form_errors(form.deckTags) }}
+ </div>
+ </div>
+```
+
+
+```言語:フォームタイプの記述 Customize/Form/Type/Admin/FormType.php
+<?php
+
+namespace Customize\Form\Type\Admin;
+
+//useは割愛
+
+class FormType extends AbstractType
+{
+ public function __construct()
+ {
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function buildForm(FormBuilderInterface $builder, array $options)
+ {
+ $builder
+ ->add('deckTags', EntityType::class, [
+ 'class' => DeckTag::class, //多対多 従デッキタグEntityクラス参照
+ 'choice_label' => 'name', //nameカラムの値を表示
+ 'expanded' => true, //下の表を参照
+ 'multiple' => true, //ラジオボタン
+ ])
+ ;
+ }
+
+```
+
+こんな感じになります。
+タグを複数選択してPOSTしたり、複数選択のAND検索ができますね。
+![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/318f9c79-0a3a-bc41-263d-d79fd75e01ee.png)
+
+
+```言語:for文を使わないパターン
+ <div>
+ <label>デッキタグ</label>
+ {{ form_widget(form.deckTags) }}
+ {{ form_errors(form.deckTags) }}
+ </div>
+```
+こうなりました 横並びしたいのに、いうこときいてくれません(汗
+![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/b79d3800-ffa1-8086-6bf5-7d515d4a31c1.png)
+
+
+
+
+公式:ChoiceType のオプション解説
+https://symfony.com/doc/current/reference/forms/types/choice.html
+![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/673c99ef-ea92-c198-6ed0-b10d563542e6.png)
+
+
+##EntityTypeの各オプションを試してみた
+```言語:EntityTypeのラジオボタン
+'expanded' => true,
+'multiple' => false
+とすると
+
+Entity of type "Doctrine\Common\Collections\ArrayCollection" passed to the choice field must be managed. Maybe you forget to persist it in the entity manager?
+HTTP500内部サーバーエラー
+選択フィールドに渡されるタイプ「Doctrine \ Common \ Collections \ ArrayCollection」のエンティティを管理する必要があります。 エンティティマネージャでそれを永続化するのを忘れているかもしれませんか?
+
+はい、お手上げです
+```
+
+
+```言語:EntityTypeのセレクトボックス
+'expanded' => false,
+'multiple' => false
+または
+'expanded' => false,
+'multiple' => true
+```
+はい、何もでません
+![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/60671ab4-06d0-db70-299f-90cae0c6e35a.png)
+
+
+```言語:EntityTypeのセレクトボックス/ループ呼び出しをしないやり方
+Twigを...
+ <div>
+ <label>デッキタグ</label>
+ <span>{{ 'admin.common.required'|trans }}</span>
+ {{ form_widget(form.deckTags) }}
+ {{ form_errors(form.deckTags) }}
+ </div>
+()
+
+フォームオプションを...
+'expanded' => false,
+'multiple' => false
+```
+セレクトボックスがでてくれます
+![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/d004fbd0-474a-fe44-bb27-f633256fd7a4.png)
+
+```言語:セレクトボックスマルチはできるのか
+Twigを...
+ <div>
+ <label>デッキタグ</label>
+ <span>{{ 'admin.common.required'|trans }}</span>
+ {{ form_widget(form.deckTags) }}
+ {{ form_errors(form.deckTags) }}
+ </div>
+
+フォームオプションを...
+'expanded' => false,
+'multiple' => ture
+```
+リストボックスがでました、複数選択はできません(残念
+![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/ceddec1a-9c9e-4d68-1d19-8cb8568cf6e6.png)
+
+
+以下はエンティティファイルです
+
+```言語:主側 Customize/Entity/Deck.php
+ /**
+ * @var \Doctrine\Common\Collections\Collection
+ *
+ * @ORM\ManyToMany(targetEntity="Customize\Entity\DeckTag", mappedBy="decks")
+ */
+ private $deckTags; ※この変数をtwigで使う
+```
+
+```言語:従側 Customize/Entity/DeckTag.php
+ /**
+ * @var \Doctrine\Common\Collections\Collection
+ *
+ * @ORM\ManyToMany(targetEntity="Deck", inversedBy="deckTags")
+ * @ORM\JoinTable(
+ * name="dtb_deck_deck_tag",
+ * joinColumns={
+ * @ORM\JoinColumn(name="deck_tag_id", referencedColumnName="id")
+ * },
+ * inverseJoinColumns={
+ * @ORM\JoinColumn(name="deck_id", referencedColumnName="id")
+ * }
+ * )
+ */
+ private $decks;
+```
+
+
+#おわりに
+ECCUBE4、SymfonyフレームワークについてはRubyOnRailsと違い本当に参考書や日本語ソースや新しい情報が少ないですし、Symfony公式ドキュのが情報網羅性がとても残念な感じ。
+現在ネットに公表されている情報が貴重でとても参考になっております。公表してくださっている先輩エンジニアの方々にお礼申し上げます。