ECCUBE4 Symfony EntityTypeフォームで多対多 Many To Many メモ
個人的なメモです
EntityType の多対多 ManyToMany のとき(汗
select、radio、check、 listに対応するChoiceTypeフォームがありますが
ChoiceTypeフォームを外部テーブル参照したものがEntitytypeです
設定が特にいやらしいです
※ここでは、多対多の主をデッキテーブル、従をデッキタグテーブルとします
<div>
<div>
<label>デッキタグ</label> //ラベル(任意)
</div>
//エンティティループ表示=デッキタグテーブルに存在するレコード(タグ名)を表示
<div>
{% for deckTag in form.deckTags %} //変数deckTagsはRepositoryでManyToMany定義
<div>
{{ form_widget(deckTag) }} //変数deckTagsから取り出したdecktagを表示
</div>
{% endfor %}
{{ form_errors(form.deckTags) }}
</div>
</div>
<?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, [ //多対多 主デッキEntityクラスの変数deckTags参照
'class' => DeckTag::class, //多対多 従デッキタグEntityクラス参照
'choice_label' => 'name', //nameカラムの値を表示
'expanded' => true, //下の表を参照
'multiple' => true, //ラジオボタン
])
;
}
こんな感じになります。
タグを複数選択してPOSTしたり、複数選択のAND検索ができますね。
<div>
<label>デッキタグ</label>
{{ form_widget(form.deckTags) }}
{{ form_errors(form.deckTags) }}
</div>
こうなりました 横並びしたいのに、いうこときいてくれません(汗
公式:ChoiceType のオプション解説
https://symfony.com/doc/current/reference/forms/types/choice.html
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」のエンティティを管理する必要があります。 エンティティマネージャでそれを永続化するのを忘れているかもしれませんか?
はい、お手上げです
'expanded' => false,
'multiple' => false
または
'expanded' => false,
'multiple' => true
Twigを...
<div>
<label>デッキタグ</label>
<span>{{ 'admin.common.required'|trans }}</span>
{{ form_widget(form.deckTags) }}
{{ form_errors(form.deckTags) }}
</div>
()
フォームオプションを...
'expanded' => false,
'multiple' => false
Twigを...
<div>
<label>デッキタグ</label>
<span>{{ 'admin.common.required'|trans }}</span>
{{ form_widget(form.deckTags) }}
{{ form_errors(form.deckTags) }}
</div>
フォームオプションを...
'expanded' => false,
'multiple' => ture
以下はエンティティファイルです
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="Customize\Entity\DeckTag", mappedBy="decks")
*/
private $deckTags; ※この変数をtwigで使う
/**
* @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公式ドキュのが情報網羅性がう~~んな感じ。
現在ネットに公表されている情報が貴重でとても参考になっております。
公表してくださっている先輩エンジニアの方々にお礼申し上げます。
Author And Source
この問題について(ECCUBE4 Symfony EntityTypeフォームで多対多 Many To Many メモ), 我々は、より多くの情報をここで見つけました https://qiita.com/SakagamiKeisuke/items/7c29f5b318e0471dbccf著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .