Выбор цепи с категорией и подкатегорией в CodeIgniter - PullRequest
1 голос
/ 22 февраля 2011

Как создать раскрывающееся меню выбора в CI, чтобы при выборе категории подкатегория появлялась на той же странице без обновления браузера?

Ответы [ 3 ]

2 голосов
/ 02 августа 2013

Вот как я это сделал (очень легко сделать)

  1. загрузить jQuery, + jquery.chained.js
  2. вставить jQuery+ jquery.chained.js к представлениям CI
  3. create функция для генерации выборок из базы данных
  4. , вызывающая функцию

, насколько моя структура таблицвыглядит следующим образом (я знаю, что это легко сделать в одной таблице)

категория

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?>)

Вот так;)

1 голос
/ 22 февраля 2011

Вы должны сделать это через AJAX и получить подкатегории. Есть готовые подкатегории <select> или выпадающий список.

Добавить значения, возвращаемые PHP, в выпадающий список.

Какой-то псевдокод:

$.each(data, function(key, value)
{   
     $('#subcategories').
          append($("<option></option>").attr("value",key).text(value)); 
});
0 голосов
/ 23 февраля 2011

На самом деле это код, для которого я хочу, чтобы это происходило, я хочу, чтобы дети появлялись при выборе родителя.

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>";
}

?>

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...