symfony2形成自定义字段

时间:2012-12-08 18:00:47

标签: forms symfony doctrine

所以,我有一个用于编辑博客文章的表格。

除此之外,我还需要能够修改文章标记。它们作为ArrayCollection存储在我的Blog实体中。 (ManyToMany级联:持久,删除)

现在,Simfony使用<select>标签处理这类数据,它可以很好地进行选择,但我希望能够删除和添加标签。

这也是可能的,并且在本食谱文章How to Embed a Collection of Forms

中得到了很好的解释

然而,本教程的结果仍然不是很优雅,我希望有类似于StackOverflow标签框的输入框。

由于许多已经在免费许可下完成的解决方案我决定只使用其中一个,例如jQuery Tags Input

基本上,我需要做的就是运行$('#tags_input_box')。tagsInput()并将其转换为类似SO的标签框。

现在,我正在寻找将一些自定义输入绑定到我的表单的最简单方法,并将其与其他“正版”字段一起提交回来,形状将被Symfony2理解

有人可以向我推荐一些文件,或者给我一些开始信息,我应该开始研究这个问题吗?

1 个答案:

答案 0 :(得分:0)

看起来插件以逗号分隔的字符串值发送它。

最简单的方法可能是简单地将其视为表单中的单个输入,然后在处理表单时将其拆分。

// Entity to hold it in string form.
namespace Some\Entity;

class TagStringEntity {
    protected $tagString;

    // getTagString and setTagString
}

// Custom form type.
// Use this AbstractType in your form.
namespace Some\Form;

Symfony\Component\Form\AbstractType;

class TagType extends AbstractType {
     public buildForm(FormBuilder $builder, array $options) {
         $builder->add('tagString'); // will default to text field.
     }
}

// In Controller
public function displayFormAction() {
    // Join the tags into a single string.
    $tagString = implode(',', $article->getTags()); // assuming it returns an array of strings.

    $tagStringType = new TagStringType();
    $tagStringType->setTagString($tagString);

    // build form, etc...
}

public function checkFormAction() {
    // ...
    if ($form->isValid()) {
        // Get the tag string, split it, and manually create your separated tag objects to store.
    }
}

使用该jQuery插件可能是最干净,最简单的方法。需要做一些工作,因为你将多个项目变成了许多项目,反之亦然,但也不是太糟糕。