2012-05-23 112 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调用。

我希望有帮助。