如何在cakephp中创建一个链选择表单

时间:2010-09-14 00:31:06

标签: cakephp selection chained

我的业务目录应用程序调用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'=&gt;'/ search_results')); ?&GT;                                输入( 'business_group_id',           数组('type'=&gt;'select',                'id'=&gt; 'businessGoup',               'empty'=&gt; ' - 选择业务组 - ',               'multiple'=&gt;真正,               'options'=&gt; $ this-&gt; requestAction('/ business_groups / getList'),               'label'=&gt; '商业集团'));          ?&GT;                           输入( 'business_type.id',           数组('type'=&gt;'select',               'id'=&gt; '业务类型',               'empty'=&gt; ' - 选择业务类型 - ',               'multiple'=&gt;真正,               'options'=&gt; '未选择',               'label'=&gt; '业务类型'));          ?&GT;                            输入( 'business_directories.id',           数组('type'=&gt;'select',               'id'=&gt; 'businessDirectoryCity',               'empty'=&gt; ' - 选择城市 - ',               'multiple'=&gt;真正,               'options'=&gt; “选项”,               'label'=&gt; '市'));         ?&GT;                   端( '搜索'); ?&GT;

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

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

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

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

对此非常感谢。

谢谢,保罗

1 个答案:

答案 0 :(得分:2)

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

每个动作都应如下所示。在这种情况下,业务类型

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

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

对于Business group,您需要直接显示所有值,因此不需要ajax。

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

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

即:

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