2017-02-07 6 views
-1

Я использую tetranz/select2entity-bundle для impliment ВЫБ.2 с Symfony2Как отправить OnKeyUp вход в контроллер симфони

Так моя форма стала так:

$builder->add('nom', Select2EntityType::class, [ 

     'remote_route' => 'find_tags', 
     'class' => 'Emploi\AppBundle\Entity\Tags', 
     'primary_key' => 'id', 
     'text_property' => 'name', 
     'minimum_input_length' => 2, 
     'page_limit' => 10, 
     'allow_clear' => true, 
     'delay' => 250, 
     'language' => 'fr', 
     'placeholder' => 'Select a tag', 

    ]) 

Мой маршрут:

find_tags: 
    path:  /find_tags 
    defaults: { _controller: EmploiAppBundle:Tags:findTags } 

Так теперь мне нужно искать теги onkeyup, которые я использовал в ветка:

{{ form_start(form) }} 
{{ form_widget(form.nom, {'attr': {'id': 'tagsID'}}) }} 
{{ form_widget(form.score) }} 
<input type="submit" value="Create"/> 
{{ form_end(form) }} 

Моя функция в TagsController потому select2entity-расслоением нужен ответ JSON с двумя атрибутами Ид "и«текст»:

public function findTagsAction(Request $request) 
{ 
    $data = $request->get('input'); 
    $em = $this->getDoctrine()->getManager(); 
    $query = $em->createQuery('' 
     . 'SELECT c.id, c.name ' 
     . 'FROM EmploiAppBundle:Tags c ' 
     . 'WHERE c.name LIKE :data ' 
     . 'ORDER BY c.name ASC' 
    ) 
     ->setParameter('data', '%' . $data . '%'); 
    $tags = $query->getResult(); 

    $arrayCollection = array(); 

    foreach($tags as $item) { 
     $arrayCollection[] = array(
      'id' => $item['id'], 
      'text' => $item['name'] 
     ); 
    } 
    return new JsonResponse($arrayCollection); 
} 

И послать значение ввода Я использовал этот АЯКС код:

$(document).ready(function(){ 
    $("#tagsID").on('keyup', function() { 
     var input = $(this).val(); 
     if (input.length >= 2) { 

     var data = {input: input}; 

     $.ajax({ 
      type: "POST", 
      url: "{{ path('find_tags') }}", 
      data: data, 
      dataType: 'json', 
      timeout: 3000, 
      success: function(response){ 
      }, 

     }); 
    } 
}); 
}); 

Проблема теперь, когда findTagsAction() всегда возвращает все теги и не обнаруживает входное значение.

+1

Каково значение $ data = $ request-> get ('input'); ? – pbenard

+0

Я думаю, что это null, потому что всегда findTagsAction() возвращает весь результат –

ответ

0

Решение было очень простым, select2entity-расслоением присвоить идентификатор автоматически в form_widget именно поэтому JavaScript не может найти идентификатор = «tagsID», поэтому мы должны удалить этот

{'attr': {'id': 'tagsID'}} 

от этой линии:

{{ form_widget(form.nom, {'attr': {'id': 'tagsID'}}) }} 

но правильный способ добавить CSS идентификатор к form_widget на веточке является:

{{ form_widget(form.nom, { 'id' : 'tagsID' }) }} 

, где когда-либо, когда я смотрел на запросы AJAX, посланных при вводе в текстовые поля я нашел этот метод GET:

http://127.0.0.1:8000/find_tags?page_limit=10&q=xxx

Так что теперь нам нужно изменить в нашем контроллере это:

$data = $request->get('input'); 

К этому:

$data = $request->get('q'); 

PS: Удалить все написанное ранее JavaScript

0
function goToUrl(id_to_send) { 
     var path="{{ path('players_team', { 'id':"PLACEHOLDER" }) }}"; 
     var url = path.replace("PLACEHOLDER", id_to_send); 
    $.ajax({url: url, success: function(result){ 
    $("#players").replaceWith(result); 
}}); 

} 

вам просто нужно вызвать этот mehode в методе OnKeyUp, в моем случае я получить результат и я заменил его с $ («# игроков»).