1

各画像にキーワードをタグ付けできるようにする必要がある画像のギャラリーを作成しています。タグを処理するために、FPN/TagBundle ( https://github.com/FabienPennequin/FPNTagBundle ) を使用しています。

以下を使用して、すでにフォームを作成しました。

// UserAlbumImageType.php

...
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('description', null, array('label' => 'Description'))
        //TODO: add tags
        ->add('tags', null, array(
            'label' => 'Tags',
            'mapped' => false,
            'required' => false,
            'attr' => array(
                'class' => 'tags',
            ),
        ))
        ->add('licenseType', 'entity', array(
            'label' => 'License',
            'class' => 'VoxCoreBundle:LicenseType',
        ))
        ->add('privacyType', null, array('label' => 'Privacy'))
        ;
}$builder
                ->add('images', 'collection', array(
                    'type' => new UserAlbumImageType(),
                    'label' => false,
                ))
            ;
            break;
...

// UserAlbumType.php

...
$builder
    ->add('images', 'collection', array(
        'type' => new UserAlbumImageType(),
        'label' => false,
    ))
    ;
    break;
...

ご覧のとおり、tags プロパティはマップされていません。これは、タグをデータベースのフィールドに書き込むのではなく、中央のタグ テーブルに保持するためです。そして、そこに問題があります。

フォームが送信されると、コレクション内$em->persist($userAlbum)のオブジェクトへの変更を保持する呼び出しを行うだけです。UserAlbumImage今回はフォームから送信されたタグを取得し、タグマネージャーで設定したいと思います。これをどこで処理するかわかりません。Doctrine の postPersist リスナーでは? その場合でも、少なくとも一時的にタグをエンティティに保存してから解析する必要があります。より良い方法はありますか?

4

2 に答える 2

0

なぜあなたのコントローラーにいないのですか:

// ...
$tags = $form->getData()->getTags();
foreach($tags as $tag) {
    $em->persist($tag);
}
// ...

$em->flush();
于 2013-10-07T17:22:18.313 に答える
0

もし私があなただったら、(私がいつもやろうとしているように) リポジトリを追加した MVC パターンに従います。saveGalleryギャラリー エンティティのリポジトリにメソッドを実装します。これはコントローラーから呼び出されます(mansoluxが推奨するものと同様ですが、代わりにコントローラーにストア機能を持たせます(私に尋ねると悪い習慣です)、それに対してリポジトリメソッドを呼び出します)。このメソッドは、送信されたすべてのデータを受け取ります。最初に、タグ (ギャラリー、画像など) の前に保存する必要があるすべてのエンティティを保存します。その後、タグ リポジトリを取得します。

$repo = $this->em->getRepository("FPNTagBundle:TagEntityName");

あとは、このリポジトリを使用してタグを保存するだけです。使用しているタグ バンドルが実際に存在することを確認するためにいくつかのサニティ チェックを追加できますが、それはあなたが決めることです。

それが役に立てば幸い。

于 2013-10-10T12:04:42.510 に答える