我尝试将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;
    }
}https://stackoverflow.com/questions/34087761
复制相似问题