2013-05-10 79 views
1

我与symfony2一起工作,现在我尝试保存在实体中或直接在数据库中,创建在tag textext Jquery插件的texarea输入中创建的标签。 我不知道持久化值的好方法(注意,将来我想使用插件的Filter with Suggestions功能)。标签Textext jquery插件,一种保存symfony 2创建标签的好方法?

我觉得这个方法:

  • 参加由插件创建的隐藏输入的输入值(在我的情况:axxon_musicbundle_oeuvretype[tagz]),与jQuery选择,所以:

    tagz = $('input [name * =“axxon_musicbundle_oeuvretype [tagz]”]')。val(); ex:= [“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; 

以我formtype:

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

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

我的观点,我使用的是多级形式,craue束:

{% 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

这是错误的做法,它可以更简单,非常可重用。

在您的形式,而不是

$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) }} 

很酷,不是吗? :)

+0

非常感谢你,这似乎是聪明的,我会明天尝试这种方法,然后回复你。 – 2013-05-10 22:24:05

+0

这似乎工作!我使用addViewTransformer()到我的tagformtype的buildForm函数中。现在,而不是通过变压器发送我的结果对象到一个setter,我搜索发送通过添加(arraycollection),一个想法? – 2013-05-13 17:45:37

+0

你必须在你的实体中有getTagz()和setTagz() – Zeljko 2013-05-13 22:34:48