【问题标题】:Chain select with category and sub category in CodeIgniter在 CodeIgniter 中使用类别和子类别进行链式选择
【发布时间】:2011-02-21 23:04:52
【问题描述】:

如何在CI中创建一个下拉选择菜单,这样如果我选择一个类别,一个子类别就会出现在同一页面上而不用刷新浏览器?

【问题讨论】:

  • 当您说“子类别”时,您的意思是页面上的另一个选择?
  • 不只是子类别

标签: codeigniter


【解决方案1】:

我就是这样做的,(很容易做到)

  1. 下载jQuery,+jquery.chained.js
  2. 将 jQuery + jquery.chained.js 插入 CI 视图
  3. 创建用于从数据库生成选择的函数
  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

请注意,我正在使用自己的 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-&gt;category_chain() 并在视图中将有一个可用的变量$category_chain(只需像&lt;?=$category_chain?&gt; 一样回显它)

就是这样;)

【讨论】:

    【解决方案2】:

    您应该通过 AJAX 执行此操作并检索子类别。准备好子类别&lt;select&gt; 或下拉菜单。

    将 PHP 返回的值追加到下拉列表中。

    一些伪代码:

    $.each(data, function(key, value)
    {   
         $('#subcategories').
              append($("<option></option>").attr("value",key).text(value)); 
    });
    

    【讨论】:

      【解决方案3】:

      实际上这是我想要实现的代码,我希望在选择父项时出现子项。

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

      谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-10
        • 1970-01-01
        • 1970-01-01
        • 2018-11-22
        相关资源
        最近更新 更多