【发布时间】:2011-02-21 23:04:52
【问题描述】:
如何在CI中创建一个下拉选择菜单,这样如果我选择一个类别,一个子类别就会出现在同一页面上而不用刷新浏览器?
【问题讨论】:
-
当您说“子类别”时,您的意思是页面上的另一个选择?
-
不只是子类别
标签: codeigniter
如何在CI中创建一个下拉选择菜单,这样如果我选择一个类别,一个子类别就会出现在同一页面上而不用刷新浏览器?
【问题讨论】:
标签: codeigniter
我就是这样做的,(很容易做到)
我的表格结构如下(我知道可以在一张表格中轻松完成)
类别
CREATE TABLE IF NOT EXISTS `category` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(64) NOT NULL,
`active` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;
INSERT INTO `category` (`id`, `name`, `active`) VALUES
(3, 'Science', 1),
(4, 'History', 1);
子类别
CREATE TABLE IF NOT EXISTS `subcategory` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`category_id` int(11) NOT NULL,
`name` varchar(64) NOT NULL,
`active` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `category_id` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ;
INSERT INTO `subcategory` (`id`, `category_id`, `name`, `active`) VALUES
(2, 3, 'Mathematics', 1),
(3, 3, 'Physics', 1),
(4, 3, 'Medicine', 1),
(5, 4, '21st Century', 1),
(6, 4, '18-20th Century', 1),
(7, 4, '15-17th Century', 1),
(8, 4, 'Before 15th Century', 1);
ALTER TABLE `subcategory`
ADD CONSTRAINT `subcategory_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `category` (`id`);
现在我只需加载所有活动 类别/子类别并为它们创建<select>s。
请注意,我使用的是 twitter-bootstrap 2,所以还有一些额外的 HTML。
请注意,我正在使用自己的 MY_Controller 文件扩展 CI_Controller,因此我可以设置“全局”$data[](传递给 view >) 通过对扩展 CI_Controller 执行$this->data['key'] 遵循此tutorial。
请注意,它内置了“重新填充功能”,因此无论何时传递(有效或无效)category_id && || $subcategory_id,它都会在数据库中查找参数是否正确,并且如果存在类别/子类别,它会重新填充自身。
public function category_chain($category_id = FALSE, $subcategory_id = FALSE) {
$this->load->model('general_model');
$repopulate['category'] = '';
$repopulate['subcategory'] = '';
if (($category_id !== FALSE && $subcategory_id !== FALSE) || ($category_id !== "FALSE" && $subcategory_id !== "FALSE")) {
if ($this->general_model->_isInDBWhere('subcategory', array('id' => $subcategory_id, 'category_id' => $category_id))) {
$repopulate['category'] = $category_id;
$repopulate['subcategory'] = $subcategory_id;
}
}
if (($category_id !== FALSE && $subcategory_id === FALSE) || ($category_id !== "FALSE" && $subcategory_id === "FALSE")) {
if ($this->general_model->_isInDB('category', 'id', $category_id)) {
$repopulate['category'] = $category_id;
$repopulate['subcategory'] = '';
}
}
$categories = $this->general_model->_getAllWhere('category', 'active', '1');
$subcategories = $this->general_model->_getAllWhere('subcategory', 'active', '1');
$return = "<div class=\"control-group\">
<label class=\"control-label\">.category </label>
<div class=\"controls\">
<div class=\"input-prepend\">
<span class=\"add-on\"><i class=\"icon-th-large\"></i></span>";
$return .= "<select name=\"category_id\" id=\"category\">";
$return .= "<option value=\"\">--</option>";
foreach ($categories as $category) {
$return .= "<option value=\"".$category->id."\"".(($repopulate['category'] == $category->id) ? " selected": "").">".$category->name."</option>";
}
$return .= "</select>";
$return .= "</div></div></div>";
$return .= "<div class=\"control-group\">
<label class=\"control-label\">.subcategory </label>
<div class=\"controls\">
<div class=\"input-prepend\">
<span class=\"add-on\"><i class=\"icon-th\"></i></span>";
$return .= "<select name=\"subcategory_id\" id=\"subcategory\">";
$return .= "<option value=\"\">--</option>";
foreach ($subcategories as $subcategory) {
$return .= "<option value=\"".$subcategory->id."\" class=\"".$subcategory->category_id."\"".(($repopulate['subcategory'] == $subcategory->id) ? " selected": "").">".$subcategory->name."</option>";
}
$return .= "</select>";
$return .= "</div></div></div>";
$this->data['category_chain'] = $return;
}
最后创建application/models/general_model.php并创建这个函数
function _getAllWhere($table, $where, $value) {
$q = $this->db->get_where($table, array($where => $value));
return ($q->num_rows() > 0) ? $q->result() : FALSE;
}
最后一步是在需要时调用函数。
在所需的控制器中,只需调用$this->category_chain() 并在视图中将有一个可用的变量$category_chain(只需像<?=$category_chain?> 一样回显它)
就是这样;)
【讨论】:
您应该通过 AJAX 执行此操作并检索子类别。准备好子类别<select> 或下拉菜单。
将 PHP 返回的值追加到下拉列表中。
一些伪代码:
$.each(data, function(key, value)
{
$('#subcategories').
append($("<option></option>").attr("value",key).text(value));
});
【讨论】:
实际上这是我想要实现的代码,我希望在选择父项时出现子项。
if(count($navlist)){
foreach($navlist as $key => $list){
echo "<select>";
foreach($list as $topkey => $toplist){
echo '<option value="'. $topkey .'">'. $toplist["name"]. '</option>';
if(count($toplist['children'])){
/*foreach($toplist['children'] as $subkey => $subname){
echo "\n<li class='subcat'>";
echo anchor("welcome/cat/$subkey", $subname);
echo "</li>";
} */
}
}
}
echo "</select>";
}
?>
谢谢
【讨论】: