我想为Blog Post创建一个Symfony 2表单。我想知道如何实现的其中一个字段是tags字段。 Post
与Tag
有多对多的关系。我希望我的表单有一个文本框,用户可以在其中输入以逗号分隔的标记列表。然后将其转换为多个Tag
。
我该如何实施?我:
tagsInput
字段(与Entity
的{{1}}应该是$tags
的{{1}}的名称不同)ArrayCollection
上,我拆分标签并创建/获取多个标签。然后验证标签(例如,MaxLength为32)答案 0 :(得分:1)
我认为你已经采用了正确的方式,因为我看到了关于表单类型的其他question。我会以你的选择安慰你。
表单类型可能是最好的方法。使用表单类型,您将能够在表单中显示单个文本字段。您还可以将数据转换为字符串以显示给用户,并将ArrayCollection
转换为模型中的数据。为此,您可以像在其他问题中一样使用DataTransformer
。
使用此技术,您的模型中不需要额外的字段tagsInput
,您只能拥有一个名为tags
的字段ArrayCollection
。有一个字段是可能的,因为您的表单类型会将该数据从字符串转换为ArrayCollection
。
对于验证,我认为您可以使用Choice
验证器。这个验证器指令似乎能够验证一个数组没有少于一个项目而不是多于另一个数字。您可以查看它的文档here。你可以这样使用它:
// src/Acme/BlogBundle/Entity/Author.php
use Symfony\Component\Validator\Constraints as Assert;
class Post
{
/**
* @Assert\Choice(min = 1, max = 32)
*/
protected $tags;
}
如果它不起作用或不按预期工作,您可以做的是创建自定义验证器。然后,此验证程序将放入tags
字段的模型中。此验证器将验证数组的最大元素数不大于固定数(在您的情况下为32)。
希望这有帮助。
的问候,
马特