我尝试将Select2 jQuery插件与Symfony的表单组件和Doctrine结合使用来创建一个标记域,我可以在其中添加现有的标记并动态创建新的标记。
到目前一切尚好。我使用以下Select2初始化代码:
$('select.tags').select2({
tags: "true"
});所有现有的标签都会在每次请求时加载。应该在提交整个表单时创建/保持新的表单。(所以没有AJAX的魔力。)
我不知道现在在哪里可以实现这一点,这样就不会将现有的标记持久化到数据库中并添加到父实体中。
它必须发生在以下几点之间:
if ($form->isSubmitted()) {
}和
if ($form->isValid()) {
}在我的控制器里。但我无法想象做这件事的最好方法是什么(或者是否有)。
I read about form collection,但不知何故,这并不是我真正需要的。因为每个标记都有一个单独的input字段。但是我有一个动态添加了新选项的select字段。
发布于 2015-12-04 21:31:08
应在提交整个表单时创建/保留新的表单。
那么为什么你不想在这一行之后持久化它们:
if ($form->isValid()) {
}编辑
一旦我为标签创建了transformer。它将标签集合更改为逗号分隔的单个标签。在提交之后,转换器将文本转换回集合标记。
/**
* Class TagTransformer
* @package AppBundle\Form\Transformer
*
* @DI\Service("app.form.transformer.tag")
*/
class TagTransformer implements DataTransformerInterface{
/**
* @var EntityManager
*/
private $em;
/**
* @param EntityManager $em
* @DI\InjectParams(params={
* "em" = @DI\Inject("doctrine.orm.entity_manager")
* })
*/
public function __construct($em)
{
$this->em = $em;
}
/**
* @param ArrayCollection | Tag[] $value
* @return string
*/
public function transform($value)
{
if($value == null) $value = array();
$string = "";
foreach($value as $tag)
$string .= $tag->getName().",";
return $string;
}
/**
* @param string $value
* @return ArrayCollection
*/
public function reverseTransform($value)
{
$collection = new ArrayCollection();
if(strlen($value) == 0) return $collection;
$names = explode(",",$value);
foreach($names as $name){
$tag = $this->em->getRepository('AppBundle:Def\Tag')->findOneByName($name);
if(!$tag) $tag = new Tag();
$tag->setName($name);
$collection->add($tag);
}
return $collection;
}
}发布于 2015-12-04 21:38:46
一旦我做了同样的事情,我将逻辑从formbuilder中分离出来,现在我没有代码,但在伪代码中:
确保您选择的标签作为字符串写入到文本输入中,并带有分隔符。喜欢
<input name="tags" value="tag1|tag2|tag3|" ..>在控制器中检查表单是否已提交且有效
然后你就有了你的实体
$entity=$form->getData()和标签
$tags = explode("|",$request->get('tags'));然后遍历它们并将它们添加到您的实体中,如果标记还不存在,则创建它
foreach($tags as $tag){
$tag = $tagrepo->findOneByName($tag)
if(!$tag){
$newTag = new Tag();
$newTag->setName($tag);
$em->persist($newTag);
$entity->addTag($newTag);
}else{
$entity->addTag($tag);
}
$em->flush();
}https://stackoverflow.com/questions/34087761
复制相似问题