首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用select2和symfony/原理的标签

使用select2和symfony/原理的标签
EN

Stack Overflow用户
提问于 2015-12-04 19:50:59
回答 2查看 1.6K关注 0票数 1

我尝试将Select2 jQuery插件与Symfony的表单组件和Doctrine结合使用来创建一个标记域,我可以在其中添加现有的标记并动态创建新的标记。

到目前一切尚好。我使用以下Select2初始化代码:

代码语言:javascript
运行
复制
$('select.tags').select2({
    tags: "true"
});

所有现有的标签都会在每次请求时加载。应该在提交整个表单时创建/保持新的表单。(所以没有AJAX的魔力。)

我不知道现在在哪里可以实现这一点,这样就不会将现有的标记持久化到数据库中并添加到父实体中。

它必须发生在以下几点之间:

代码语言:javascript
运行
复制
if ($form->isSubmitted()) {
}

代码语言:javascript
运行
复制
if ($form->isValid()) {
}

在我的控制器里。但我无法想象做这件事的最好方法是什么(或者是否有)。

I read about form collection,但不知何故,这并不是我真正需要的。因为每个标记都有一个单独的input字段。但是我有一个动态添加了新选项的select字段。

EN

Stack Overflow用户

发布于 2015-12-04 21:31:08

应在提交整个表单时创建/保留新的表单。

那么为什么你不想在这一行之后持久化它们:

代码语言:javascript
运行
复制
if ($form->isValid()) {
}

编辑

一旦我为标签创建了transformer。它将标签集合更改为逗号分隔的单个标签。在提交之后,转换器将文本转换回集合标记。

代码语言:javascript
运行
复制
/**
 * 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;
    }
}
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34087761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档