Вот как я это сделал (очень легко сделать)
- загрузить jQuery, + jquery.chained.js
- вставить jQuery+ jquery.chained.js к представлениям CI
- create функция для генерации выборок из базы данных
- , вызывающая функцию
, насколько моя структура таблицвыглядит следующим образом (я знаю, что это легко сделать в одной таблице)
категория
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
.
Обратите внимание, что я расширяю CI_Controller своим собственным MY_Controller файл, поэтому я могу установить «глобальный» $data[]
(который передается в view ), выполнив $this->data['key']
для внешнего CI_Controller, следуя этому учебнику .
Обратите внимание, что он имеет встроенную «функцию повторного заполнения», поэтому всякий раз, когда вы передаете (действительный или недействительный) 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()
, и в поле зрения появится переменная avalible $category_chain
(просто выведите его как <?=$category_chain?>
)
Вот так;)