我的业务目录应用程序调用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行]
对此非常感谢。
谢谢,保罗
答案 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()
});