3

我已经在谷歌上搜索了几个小时,但令人惊讶的是,我没有找到关于该主题的任何主题。

我有以下表格

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?最佳做法是什么?您知道有关该主题的教程吗?如果有人能让我走上正确的轨道,那将有很大帮助..

谢谢!

4

3 回答 3

2

查询生成器不会解决您的问题,您可以将其完全删除。

该查询在表单构建时运行,一旦您在浏览器上使用它,您需要使用 javascript 来填充选项。

您可以将选项存储在 javascript 变量中,或者根据需要使用 ajax 从服务器中提取它们(您将需要一个控制器来处理这些 ajax 请求)。

您可能想要使用一些 jquery 插件来处理选择元素之间的级联逻辑,有几个可用的:

至少还有一个我知道的 Bundle:https ://github.com/genemu/GenemuFormBundle ,它具有可用于多个 jquery 插件的 ajax 字段类型。这可以节省您编写 ajax 部分来处理数据,因为它是内置的(无论如何,您自己实现控制器可能更容易)。这个我没试过,不知道有没有级联支持。

于 2012-05-23T20:19:05.413 回答
1

Jbm 关于查询生成器是正确的。他的方法是完全有效的。

另一种选择可能是分配级联选择以支持自动完成字段。

假设您将国家、城市和地区保存为实体并在它们之间建立关系,您甚至不需要保存选择的城市/国家,因为您可以调用:

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

我已经为国家/城市选择实施了类似的事情,并将在此处链接到主要涉及的文件。

首先,创建一个自定义表单类型来封装所有表单内容,它包含一个隐藏字段来存储选定的 id 和一个文本字段作为自动完成逻辑的输入:

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

然后主题表单类型:

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

自动完成源的 url 作为 data 属性传递,因此没有 JS 会篡改 html 代码。

最后但并非最不重要的一点是,必须实现 JS 函数:

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

结果如下图所示,为了清楚起见,国家名称将显示在城市名称后面的大括号中:

自动完成正在加载

--

与使用级联选择相比,我更喜欢这种解决方案,因为可以一步选择实际值。

干杯 自动完成已加载,必须选择城市

于 2012-05-24T09:12:24.443 回答
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 返回一个数组:array('success' => $value, 'units' => $html)。您使用 $html 代码并将其放在您要更改的选择位置。当然,需要修改 ajax 调用的 javascript 代码以匹配您的字段。

您可以像通常那样调用宏:

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

所以我有两个论点:事件,往往是一个选择的变化。和一个选择器,它的变化会触发 ajax 调用。

我希望这会有所帮助。

于 2015-01-16T21:20:46.023 回答