- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在使用 tagsinput 的表单上使用标签:
此插件以单个文本字段结束,其中包含以逗号分隔的标签(例如:tag1,tag2,...)
这些标签目前在非映射表单字段上进行管理:
$builder
// ...
->add('tags', 'text', array(
'mapped' => false,
'required' => false,
))
;
最后,它们存储在 ArrayCollection 中,如 this is a bad practice to store multiple values in a database field :
/**
* @var ArrayCollection[FiddleTag]
*
* @ORM\OneToMany(targetEntity="FiddleTag", mappedBy="fiddle", cascade={"all"}, orphanRemoval=true)
*/
protected $tags;
为了将我的表单映射到我的实体,我可以在我的 Controller 中编写一些代码,如下所示:
$data->clearTags();
foreach (explode(',', $form->get('tags')->getData()) as $tag)
{
$fiddleTag = new FiddleTag();
$fiddleTag->setTag($tag);
$data->addTag($fiddleTag);
}
但乍一看这是错误的方式。
我想知道将我的实体映射到我的表单,以及将我的表单映射到我的实体的最佳做法是什么。
最佳答案
这很棘手,因为您不只是嵌入一组标签表单,也就是说,所有单独的文本字段。我想你可以通过一些技巧来做到这一点,但是使用数据转换器呢?您可以将逗号分隔的标签列表转换为 ArrayCollection 并将其传回表单,另一方面,获取集合并将标签作为逗号分隔的字符串返回。
FiddleTagsTransformer.php
<?php
namespace Fuz\AppBundle\Transformer;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Form\DataTransformerInterface;
use Fuz\AppBundle\Entity\FiddleTag;
class FiddleTagTransformer implements DataTransformerInterface
{
public function transform($tagCollection)
{
$tags = array();
foreach ($tagCollection as $fiddleTag)
{
$tags[] = $fiddleTag->getTag();
}
return implode(',', $tags);
}
public function reverseTransform($tags)
{
$tagCollection = new ArrayCollection();
foreach (explode(',', $tags) as $tag)
{
$fiddleTag = new FiddleTag();
$fiddleTag->setTag($tag);
$tagCollection->add($fiddleTag);
}
return $tagCollection;
}
}
注意:您不能将 ArrayCollection 类型指定给 public function transform($tagCollection)
,因为您的实现应该与接口(interface)匹配。
第二步是替换你的表单字段声明,这样它就可以透明地使用数据转换器,你甚至不需要在你的 Controller 中做任何事情:
FiddleType.php
$builder
// ...
->add(
$builder
->create('tags', 'text', array(
'required' => false,
))
->addModelTransformer(new FiddleTagTransformer())
)
;
您可以使用 @Assert\Count限制允许的标签数量,@Assert\Valid如果您的 FiddleTag 实体本身有一些验证约束。
Fiddle.php
/**
* @var ArrayCollection[FiddleTag]
*
* @ORM\OneToMany(targetEntity="FiddleTag", mappedBy="fiddle", cascade={"all"}, orphanRemoval=true)
* @Assert\Count(max = 5, maxMessage = "You can't set more than 5 tags.")
* @Assert\Valid()
*/
protected $tags;
请参阅有关数据转换器的 Symfony2 文档:http://symfony.com/doc/current/cookbook/form/data_transformers.html
查看这些帖子以获得其他一些想法:
Parsing comma separated string into multiple database entries (eg. Tags)
关于php - 将表单的文本字段映射到实体的 ArrayCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27681395/
我扩展了 ArrayCollection 类以添加推送方法 package com.cargo.collections { import mx.collections.ArrayCollect
我使用 Symfony2 制作了一个 Web 应用程序,其中用户与实体 Mission 具有数组关联 ManytoMany。用户可以通过表单上传实体$product,表单传递的数据之一是与用户关联的任
我用 Symfony2 制作了一个 Web 应用程序,其中一个 User 有一个数组关联 ManytoMany 与实体 Mission。用户可以通过表单上传实体 $product,表单传递的数据之一是
我在使用 tagsinput 的表单上使用标签: 此插件以单个文本字段结束,其中包含以逗号分隔的标签(例如:tag1,tag2,...) 这些标签目前在非映射表单字段上进行管理: $build
我正在寻找一种为 ODM ArrayCollection 关联数组键的方法。 实体具有以下映射: /** * $fields * * The entities fields * * @ODM
我正试图在我的包中实现一些可重用的翻译。这些是我的代码的相关部分: TranslatorKeys.php: ... /** * @var \ArrayCollection * * @ORM\On
好的,我有一个 User 实体如下 urls = new \Doctrine\Common\Collections\ArrayCollection(); } public functi
我想在 Flex 中迭代 ArrayCollection,同时可以添加和删除项目。 因为我没有找到一种方法来使用像 Java 中那样的“经典”迭代器来完成这项工作。我试过游标。但它并没有真正按照我想要
如果我有一个 ArrayCollection 类型的变量,如何检查集合中是否存在特定名称的键(包括嵌套)。如果确实如此,我如何获取和更改该值? 最佳答案 我猜你正在谈论 Doctrines Array
如果我有一个 ArrayCollection 类型的变量,如何检查集合中是否存在特定名称的键(包括嵌套)。如果确实如此,我如何获取和更改该值? 最佳答案 我猜你正在谈论 Doctrines Array
在对我的数据提供者(数组集合)应用数字排序后,我无法通过 tilelist 重新排序项目。我需要从 arrayCollection 中删除排序吗?如果是这样,是否只是设置 collection.sor
我想创建一个表单来编辑我的用户。与 ManyToMany 关联的用户和角色。在 UserUsers 实体中,我有一个 $roles 变量,它是 ArrayCollection: public func
通常您可以使用以下方法检查变量是否是类的实例: $foo instanceof bar 但是对于 ArrayObjects(属于 Symfony 2),这似乎不起作用 get_class($foo)
即使对象被正确更新,数据似乎也没有持久化,我不明白为什么。 这是我的实体: Article.php /** * @var AttributeInArticle * * @ORM\OneToMan
public function getInvoiceItemsByType($type) { return $this->invoiceItems->filter(function ($inv
考虑以下问题: 我在 Article 和 Author 之间有一个多对一 关联。 class Author{ /** * ... *@var ArrayCollection_of_Ar
我正在尝试按特定字段对 ArrayCollection 进行排序。 ArrayCollection 是一个类(class)数组。在 Course 实体中有一个名为 isLive 的方法,它返回一个 b
我有一些这样的 XML 结构: var struct:XML = ; 我知道我可以通过“id”访问子节点,方式如下: var stuff:Object = struct.(hasO
我正在使用 JMS 序列化程序。当 JsonSerializer 与 Doctrine ArrayCollection 类型一起工作时,它给了我不正确的数组格式。指定的结果应遵循格式 [ {}, {}
在设置了 filterFunction 的 ArrayCollection 上调用 getItemIndex 时遇到了一些问题。 我做了类似 myAC.removeItemAt(myAC.getIte
我是一名优秀的程序员,十分优秀!