我正在建立一个图片库,必须允许用关键字标记每个图像。为了处理标签,我正在使用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听众?如果是这样,我仍然需要至少暂时将标签保存到实体,然后解析它们。还有更好的方法吗?
答案 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");
现在,唯一要做的就是使用此存储库存储标记。您可以添加一些健全性检查以确保您使用的标记包实际存在,但这是您需要决定的。
希望它有所帮助。