2012-05-23 1 views
3

Я работаю в Интернете в течение нескольких часов, но на удивление я не нашел темы по этому вопросу.Обновление Symfony 2.0 с помощью JS?

У меня есть следующие формы

class propertyType extends AbstractType 
{ 

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

     $builder 
      ->add('city') 
      ->add('district', 'entity', array('class'=>'FlatShanghaidefaultBundle:district', 
            'property'=>'name', 
            'query_builder' => function ($repository) { 
            $qb = $repository->createQueryBuilder('district'); 
            $qb->add('where', 'city = :city'); 
            $qb->setParameter('city', 1); 
            return $qb; 

    } 


    public function getName() 
    { 
     return 'property'; 
    } 
} 

Когда пользователь может выбрать город в форме, я хочу варианты района динамически обновляются и ограничиваются этим городом. С Ajax или JS? Какая была бы лучшая практика? Знаете ли вы учебник по этой теме? Если кто-то может поставить меня на правильные пути, это очень поможет.

Спасибо!

ответ

2

Строитель запросов не решит вашу проблему, вы можете удалить его полностью.

Этот запрос запускается, когда форма создается, как только вы ее используете в своем браузере, вам нужно использовать javascript для заполнения параметров.

У вас могут быть параметры, сохраненные в переменной javascript, или вытаскивать их с сервера по мере необходимости с помощью ajax (вам понадобится контроллер для обработки этих ajax-запросов).

Вы, вероятно, захотите использовать некоторые JQuery плагина для обработки логики каскадной между отборными элементами, есть пара доступна:

существует также по крайней мере, это Bundle Я знаю: https://github.com/genemu/GenemuFormBundle, который имеет типы полей ajax, доступные для нескольких плагинов jquery. Это может спасти вас, написав часть ajax для обработки данных, поскольку она встроена (вероятно, проще реализовать контроллер самостоятельно). Я не пробовал это, и я не знаю, имеет ли он каскадную поддержку.

+0

Hi JBM, Вы просто дали мне именно то, что мне нужно! Большое вам спасибо, мой день будет счастливее ;-) Поскольку я новичок в StackOverflow, я не могу отметить ваш ответ как полезный, извините. Жалость. Хорошего дня! – 123pierre

1

Jbm прав относительно строителя запросов. И его подход является совершенным.

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

Предполагая, что вы сохраняете страны, города и районы, как субъекты и имеете отношение между ними, вам даже не нужно, чтобы сохранить то, что город/была выбрана страна, потому что вы можете просто позвонить:

$district->getCity()->getCountry(); 

Я применил аналогичную вещь для выбора страны/города и свяжусь здесь с основными вовлеченными файлами.

Во-первых, создать пользовательский тип формы, чтобы инкапсулировать все формы вещей, она содержит скрытое поле для сохранения выбранного идентификатора и текстовое поле, чтобы служить в качестве входных данных для логической функции автозаполнения:

https://github.com/roomthirteen/Room13GeoBundle/blob/master/Form/LocationFieldType.php

Тогда тема тип формы:

https://github.com/roomthirteen/Room13GeoBundle/blob/master/Resources/views/Form/fields.html.twig

URL-адрес источника автозаполнения передается как атрибут данных, так что никаких JS не будет smutching HTML-код.

И последнее, но не в последнюю очередь, функции JS должны быть реализованы:

https://github.com/roomthirteen/Room13GeoBundle/blob/master/Resources/public/jquery.ui.location-autocomplete.js

Результат можно увидеть на изображении ниже, видно, что для ясности название страны будет отображаться в фигурных скобках позади название города:

autocomplete is loading

-

Я предпочитаю это так что использование каскада выбирает, потому что фактическое значение может быть выбрано за один шаг.

веселит autocomplete has loaded and city has to be selected

+0

тоже очень приятно. Благодаря!! Теперь мне нужно сделать закладку на эту страницу и реализовать все это. Спасибо, парни! – 123pierre

+0

Это тоже хорошо, если вы хотите разрешить новые значения (вам нужно настроить часть сервера, например DataTransformer). Единственная проблема, с которой я столкнулся, заключается в том, что большие наборы данных (я имел выбор из трех уровней) заставляют список быстро расти из-за комбинаторного взрыва и могут стать непригодными в некоторых ситуациях (также зависит от ваших предпочтений пользователей). – Jens

0

Я делаю это сам по форме. Я изменяю поле (продукт), и единицы измерения, которые могут быть измерены, обновляются. Я использую макрос с параметрами, чтобы легче его адаптировать.

Макрос:

{% macro javascript_filter_unit(event, selector) %} 
<script> 
    $(function(){ 
     $('#usersection') 
       .on('{{ event }}', '{{ selector }}', function(e){ 
        e.preventDefault(); 
        if (!$(this).val()) return; 
        $.ajax({ 
         $parent: $(this).closest('.child_collection'), 
         url: $(this).attr('data-url'), 
         type: "get", 
         dataType: "json", 
         data: {'id' : $(this).val(), 'repo': $(this).attr('data-repo'), parameter: $(this).attr('data-parameter')}, 
         success: function (result) { 
          if (result['success']) 
          { 
           var units = result['units']; 
           this.$parent.find('.unit').eq(0).html(units); 
          } 
         } 
        }); 
       }) 
    }); 

</script> 

{% endmacro %} 

Аякса возвращает массив: массив ('успех' => $ значение, 'единицы' => $ HTML). Вы используете код $ html и помещаете его вместо выбора, который хотите изменить. Конечно, код javascript для вызова ajax необходимо изменить, чтобы соответствовать вашим полям.

Вы вызываете макрокоманду, как вы обычно делаете:

{% import ':Model/Macros:_macros.html.twig' as macros %} 
{{ macros.javascript_filter_unit('change', '.unitTrigger') }} 

Так у меня есть два аргумента: событие, часто изменение отборных. и селектор, тот, чье изменение вызывает вызов ajax.

Я надеюсь, что это поможет.