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 回答