【问题标题】:how to create a chain select form in cakephp如何在 cakephp 中创建链选择表单
【发布时间】:2010-09-14 00:31:06
【问题描述】:

我的业务目录应用程序需要 3 个链接的选择框,我正在使用 cakephp 来构建这个应用程序。

各部分的层次结构和选择顺序如下:

1 - 业务组

2 - 业务类型

3 - 城市(包括在表客户中)

关系是:

  • 客户 HABTM 业务类型

  • 业务组有多种业务类型

  • 业务类型有一个业务组,HABTM 客户

我已经搜索了有助于解决此问题的 jquery 插件,并找到了一个由 Remy Sharp 提供的插件,但它没有我所拥有的更复杂的关系。 http://remysharp.com/2007/09/18/auto-populate-multiple-select-boxes/

我想发生的是第一个选择框(业务组)是预先填充的,一旦做出选择,事件侦听器就会发送一条消息来过滤第二个选择框,第三个选择框也是如此。

我不知道的是如何根据事件监听器来构造搜索动作。

有什么建议还是我离谱?

和往常一样,我来井旁寻求帮助。

非常感谢。 保罗


非常感谢尼克,我已经阅读了您的许多帖子,非常感谢您的回复。

我已按照您的指示进行操作,但遇到了问题。我已经尽力解决它们,但还没有弄清楚。

这是我到目前为止所做的:

1) 在 business_type 和 business_directory 中创建“链式”操作(将客户重命名为业务目录,这样更合适。)

业务类型链式操作:

function chained($business_group_id) {
    $business_types = $this->BusinessType->find('list', array(
        'conditions' => array( 'BusinessType.business_group_id' => $business_group_id)
        ));

         $this->set('business_types', $business_types);
     }

企业目录链接操作:

function chained($business_type_id) {
    $business_directories = $this->BusinessDirectory->bindModel(array( 'hasOne' => array('business_directories_business_types' )));         
    $business_directories = $this->BusinessDirectory->find('all', array(
        'fields' => array( ' BusinessDirectory.city'),
        'conditions' => array( 'business_directories_business_types.business_type_id' => $business_type_id)
        ));
            $this->set('business_directories', $business_directories);
     }

我确实发现在 HABTM 关系中,使用 find 'list' 并没有创建连接查询,而 find 'all' 则可以。

2) 然后我在业务目录和相应视图中创建了一个搜索操作。

对于业务组,我创建了一个 getList 操作来填充搜索表单中的选项列表:

function getList() {
     return $this->BusinessGroup->find('list');
}

在搜索视图中,我为链选择添加了 javascript:

<script type="text/javascript">
<!--
$(function () {
    var group = $('#businessGoup');
    var type = $('#businessType');
    var city = $('#businessDirectoryCity');

    type.selectChain({
        target: city,
        url:  '../business_directories/chained/'+$(this).val(),
  data: { ajax: true, anotherval: "anotherAction" }
    });

    group.selectChain({
        target: type,
        url: '../business_types/chained/'+$(this).val()   
    }).trigger('change');

});
//-->
</script>

还有形式:

create('business_directories', array('action'=>'/search_results')); ?> 输入('business_group_id', 数组(“类型”=>“选择”, 'id' => 'businessGoup', 'empty' => '-- 选择业务组 --', '多个' => 真, 'options' => $this->requestAction('/business_groups/getList' ), '标签' => '业务组')); ?> 输入('business_type.id', 数组(“类型”=>“选择”, 'id' => 'businessType', 'empty' => '-- 选择业务类型--', '多个' => 真, '选项' => '未选择', '标签' => '业务类型')); ?> 输入('business_directories.id', 数组(“类型”=>“选择”, 'id' => 'businessDirectoryCity', 'empty' => '-- 选择城市--', '多个' => 真, '选项' => '选项', '标签' => '城市')); ?> end('搜索'); ?>

当我测试业务类型链函数 /business_types/chained/1 时,一切正常。

但是当我测试搜索视图时,我收到一个 javascript 警报错误。然后当我检查firebug时,我得到以下两个错误:

警告 (2):缺少 BusinessTypesController::chained() 的参数 1 [APP\controllers\business_types_controller.php,第 71 行]

注意(8):未定义变量:business_group_id [APP\controllers\business_types_controller.php, line 73]

非常感谢任何额外的帮助。

谢谢,保罗

【问题讨论】:

  • 看起来您没有在操作中传递变量。即 function chained($business_group_id) 没有参数 $business_group_id 并且第二个错误是后续的。使用 firebug 检查选择元素后触发的 url 是什么。我相信它会类似于:/business_directories/chained/undefined。您的代码中有非常糟糕的做法,但我不会讨论它们。但请务必尝试用控制器中的常规变量替换 requestAction。毕竟这是一个清单。我希望您将响应转换为格式正确的字符串,如演示所示。

标签: cakephp selection chained


【解决方案1】:

您需要在控制器中有 2 个操作(business_type 和 customer)。

每个动作都应该是这样的。在这种情况下,对于业务类型

function chained($parent_id){
    $business_types = $this->BusinessType->find('list', array('conditions'=>'BusinessType.business_group_id'=>$parent_id));
    $this->set('business_types', $business_types);
}

当然,您还需要查看该操作,该操作会将值格式化为链式选择的正确格式。

对于业务组,您需要直接显示所有值,因此不需要 ajax。

Customer 控制器的操作类似,但您需要选择所有相关客户的城市。

然后使用链式选择,您需要设置正确的元素并设置需要调用的正确操作。

即:

$('#id-of-the-business-group').selectChain({
    target: $('#id-of-the-business-type-field'),
    url: '/business_types/chained/'+$(this).val()
});

【讨论】:

  • 谢谢尼克。我对我的问题添加了一些编辑来解释我遇到的问题。非常感谢任何帮助。
猜你喜欢
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 2012-05-09
  • 1970-01-01
相关资源
最近更新 更多