1

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

我认为这种方法:

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

    tagz =$('input[name*="axxon_musicbundle_oeuvretype[tagz]"]').val(); 例如:=["test","test2","test3"];

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

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

  • 证实。

  • 发送到数据库。

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

/**
 * @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');
    }

非常感谢。

4

1 回答 1

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 中,您必须添加将现有标签转换为字符串或将文本分解为标签数组的转换器。这个话题太大了,我不能在这里写,你在 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) }}

酷,不是吗?:)

于 2013-05-10T18:27:32.950 回答