2012-05-23 323 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插件來處理選擇元素之間的級聯邏輯,有可供一對夫婦:

還有至少這個捆綁我知道:https://github.com/genemu/GenemuFormBundle,它有幾個jQuery插件可用的ajax字段類型。這可以節省您編寫ajax部分來處理數據,因爲它內置了(無論如何,實現控制器可能更容易)。我還沒有試過這個,我不知道它是否有層疊支持。

+0

嗨JBM, 你剛給我,我需要的!非常感謝你,我的一天會更快樂;-) 因爲我是新的StackOverflow我不能標記你的答案是有用的,對不起。可憐。 祝您有美好的一天! – 123pierre

1

Jbm對於查詢構建器是正確的。他的方法完全有效。

另一種選擇可以是分配級聯選擇以支持自動填充字段。

假設您保存國家,市,區爲單位,讓他們之間的關係,你甚至都不需要保存哪些城市/國家已經選擇了,因爲你可以撥打:

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

我已經爲國家/城市選擇實施了類似的事情,並將鏈接到主要涉及的文件。

首先,創建自定義表單類型封裝所有形式的東西,它包含一個隱藏字段來存儲所選擇的ID和一個文本字段作爲自動完成邏輯輸入:

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

然後主題的形式類型:作爲數據屬性所以沒有JS將smutching的HTML代碼

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

自動完成源的URL被傳遞。

最後但並非最不重要的,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 %} 

AJAX的返回一個數組:陣列( '成功'=> $值, '單元'=> $ HTML)。您使用$ html代碼並將其替換爲您想要更改的選擇。 當然,ajax調用的JavaScript代碼需要進行修改以匹配您的字段。

您調用宏就像你通常會做:

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

所以,我有兩個參數:事件,往往是一個選擇的變化。和一個選擇器,它的變化觸發ajax調用。

我希望有幫助。