Symfony2表单集 -

时间:2013-10-07 17:08:58

标签: forms symfony doctrine

我正在建立一个图片库,必须允许用关键字标记每个图像。为了处理标签,我正在使用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听众?如果是这样,我仍然需要至少暂时将标签保存到实体,然后解析它们。还有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

为什么不在你的控制器中:

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

$em->flush();

答案 1 :(得分:0)

如果我是你,我会跟随(因为我一直在尝试)添加存储库的MVC模式。我在库实体的存储库中实现了一个saveGallery方法。这将从控制器调用(类似于推荐的mansolux,但是在控制器中具有存储功能(如果你问我,那么不好的做法),为它调用存储库方法)。该方法将接收所有提交的数据。它首先会存储需要在标记之前存储的所有实体(图库,图像,诸如此类)。之后我会得到标签存储库:

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

现在,唯一要做的就是使用此存储库存储标记。您可以添加一些健全性检查以确保您使用的标记包实际存在,但这是您需要决定的。

希望它有所帮助。