标签Textext Jquery插件,用symfony 2保存创建的标签的好方法?

时间:2013-05-10 14:13:26

标签: symfony symfony-forms jquery-textext

我使用symfony2,现在我尝试保存在实体中或直接在数据库中保存在tag textext Jquery插件的texarea输入中创建的标签。 我不知道保持值的好方法(注意将来我想使用插件的过滤器和建议功能)。

我想这个方法:

  • 使用jquery选择器获取插件创建的隐藏输入中的输入值(在我的情况下:axxon_musicbundle_oeuvretype[tagz]),所以:

    tagz = $('输入[name * =" axxon_musicbundle_oeuvretype [tagz]"]')。val(); 例如:= ["测试"" TEST2"" TEST3"];

  • 通过AJAX向控制器发送值$('#form').submit(function() {

  • 控制器中的
  • 将值(例如:["test","test2","test3"])转换为数组。

  • 验证

  • 发送到数据库。

这是我想要保存值的oeuvre映射实体的摘录。

/**
 * @ORM\ManyToMany(targetEntity="tagz",cascade={"persist"})
 * @ORM\JoinTable(name="oeuvre_tagz",
 *     joinColumns={@ORM\JoinColumn(name="oeuvre_id", referencedColumnName="id",     nullable=false)},
 *     inverseJoinColumns={@ORM\JoinColumn(name="tagz_id", referencedColumnName="id", nullable=false)})
 **/
private $tagz;

在我的表格中:

public function buildForm(FormBuilderInterface $builder, array $options)
{

switch ($options['flowStep']) {
...
case 5:
        $builder->add('tagz', 'textarea', array(
            'mapped' => false,
            'required'=>false,
        ));
        break;

我的观点,我使用多步形式,craue bundle:

{% if flow.getCurrentStep() == 5 %}
    <script type="text/javascript">
        $().ready(function () {
            $('#axxon_musicbundle_oeuvretype_tagz').textext({ plugins: 'tags' });
            $('#form').submit(function() {
 $('form').get(0).setAttribute('action', '{{ path("axxon_music_ExtractFormTagz") }}');
                    var tagz = Array;
                        tagz =$('input[name*="axxon_musicbundle_oeuvretype[tagz]"]').val();
                            var actionController =$("#form").attr("action");
                            $.ajax({
                                type: 'POST',
                                data: {'tagz': tagz},
                                url: actionController,
                                success: function () {
                                    $('form').get(0).setAttribute('action', '{{ path("axxon_music_add_oeuvre") }}');

               ... is this a good choice to do like that ?

                        });
                    });
    </script>
    <fieldset>
        <legend>Etape {{ flow.getCurrentStep() }} / {{ flow.getMaxSteps() }}, Ajouter des mots clefs descriptifs
        </legend>
        <ul>
            <li>
                {{ form_row(form.tagz) }}
            </li>

        </ul>
        {% include 'CraueFormFlowBundle:FormFlow:buttons.html.twig' %}
    </fieldset>

{% endif %}

我想要接收数据的控制器:

    public function ExtractFormTagzAction(){


    if ($this->getRequest()->isXmlHttpRequest()) {

        $tagz = $this->getRequest()->request->get('tagz');
    }

非常感谢。

1 个答案:

答案 0 :(得分:1)

这是错误的方法,它可以更简单,更可重复使用。

在您的表单中,而不是

    $builder->add('tagz', 'textarea', array(
        'mapped' => false,
        'required'=>false,
    ));
你应该

    $builder->add('tagz', 'tag_text', .... ));

然后你需要构建新的表单类型,我们称之为TagTextType。它的父母将是“textarea”并命名为“tag_text”。 在表单模板中,您必须进行

{% block tag_text_widget %}....{% endblock %}

您将在其中放置所需的javascript。

现在有了棘手的部分:在TagTextType中,你必须添加将现有标签转换为字符串的addTransformer,或者将文本分解为标签数组。这个主题对我来说太大了,不能在这里写,你在Symfony网站上有很好的文档。

作为一个例子,检查我的小部件。我正在使用其他一些插件,但你会得到一个想法:

{% block jquerytexttags_widget %}

    {{ form_widget(form) }} 

    <script type="text/javascript">
        $("#{{ id }}").textntags( {
            triggers: {'@': { uniqueTags : false } } ,
            onDataRequest: function (mode, query, triggerChar, callback) {
                var data = {{ availableUsers|raw }} ;
                query = query.toLowerCase();
                var found = _.filter(data, function(item) { return item.name.toLowerCase().indexOf(query) > -1; });
                callback.call(this, found);
            }
        } );
    </script>
{% endblock %}

开始可能很棘手但是一旦你构建它,你就可以在任何你想要的地方使用它。想象一下大的嵌套表单,只用一行就可以正确呈现

{{ form_widget(form) }}
很酷,不是吗? :)