2013-05-10 2 views
1

Я работаю с symfony2, и теперь я пытаюсь сохранить в сущности или непосредственно в базе данных теги, созданные на вкладке texarea плагина Jquery tag textext. Я не знаю, какой способ сохранить значения (отметили, что в будущем я хочу использовать функцию Filter with Suggestions плагина).Теги Textext Jquery plugin, хороший способ сохранить созданные теги с 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"]) в массив.

  • подтвердите.

  • отправить в базу данных.

Здесь выдержка из моего объекта сопоставления 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; 

В моей 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 вам нужно добавитьTransformer, который преобразует существующие теги в строку или взорвется текст в массив тегов. Тема слишком велика для меня, чтобы написать ее здесь, у вас действительно хорошая документация на сайте 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

Большое спасибо, кажется, умный, я попробую этот метод завтра и отвечу вам после. –

+0

Это похоже на работу! Я использую addViewTransformer() в функции buildForm моего типа tagformtype. Теперь вместо отправки моего объекта с помощью трансформатора в сеттер, я ищу для отправки через add (arraycollection), идею? –

+0

У вас должны быть getTagz() и setTagz() в вашей организации – Zeljko

Смежные вопросы