2017-07-28 61 views
2


我需要一些指导。我正在使用Codeigniter 3. 由于它是带段路由的MVC fw,我想知道如何创建自定义路由,它将显示只有name的记录(可以是类别,产品,帖子等)。从数据库而不是id/name当我需要id segment来标识哪个数据库记录我需要返回或通过id预览。如何覆盖Codeigniter 3路由,以显示名称而不是id和名称

我会发布一些代码示例:

控制器

class Categories extends CI_Controller 
{ 
    function __construct() 
    { 
     parent::__construct(); 
     $this->load->model('CategoryM'); 
    } 

    public function index(){ 
     $data = array(
      'category_list' => $this->CategoryM->listAll() 
      ); 

     $this->load->view('test/category_list', $data); 
    } 

    public function preview() 
    { 
     $categoryId = $this->uri->segment(2); 

     $data = array (
      'previewByCategory' => $this->CategoryM->previewByCategory($categoryId) 
      ); 

     $this->load->view('public/preview_by_category', $data); 
    } 

型号

<?php 

    class CategoryM extends CI_Model { 

     public function listAll() { 

      $query = $this->db 
      ->select('*') 
      ->from('categories') 
      ->where('parentid', NULL, TRUE) 
      ->order_by('name', 'asc') 
      ->get(); 

      if($query->num_rows() > 0) { 
       return $query->result(); 
      }else{ 
       return false; 
      } 

      public function previewByCategory($categoryId=''){ 

       $query = $this->db 
       ->select(/* posts and categories data */) 
       ->from('categories') 
       ->join('posts', 'posts.categoryID = categories.id', 'left') 
       ->where('categories.id', $categoryId) 
       ->get(); 
       if($query->num_rows() > 0){ 
        return $query->result(); 
       }else{ 
        return false; 
       } 
      } 

     } 

查看

<?php if($category_list):?> 
    <?php foreach($category_list as $category):?> 
     <h3> 
      <a href="<?php echo base_url() . strtolower(url_title($category->name) . '/' . $category->id);?>"> 
       <?php echo $category->name;?> 
      </a> 
     </h3> 
    <?php endforeach;?> 
<?php endif;?> 

我的路线

// Category routes 
$route['categories'] = 'categories/index'; 
$route['(:any)/(:num)'] = 'categories/preview/$1'; 

我要的是不是路线

www.mywebsite/categoryname/categoryid/ 

只显示

www.mywebsite/categoryname 

这将列出所有产品从类别组。但如何做到这一点没有在URL中的ID。如果我的问题太宽泛,我很抱歉。提前致谢。

+0

如果那些只是 –

+0

独特如何你的意思是你可以做到这一点'categoryname'?要根据类别名称的值获取数据而不使用ID? – Goran

回答

2

Codeigniter不允许您在路由中获取数据库访问权限。
但您可以手动创建数据库实例。

routes.php文件

$slug= ($this->uri->segment(1)) ? $this->uri->segment(1) : false; 
if($slug){ 
    //include your database 
    require_once(BASEPATH."/database/DB.php"); 
    $db=& DB(); 
    $category = $this->db 
       ->select('name') 
       ->from('categories') 
       ->where('parentid', NULL, TRUE) 
       ->where('name',$slug) 
       ->get()->row(); 
    if($category){ 
    //$category->name must be unique in database 
    $route[$category->name] = 'categories/index'; 
    } 

} 

在分类控制器

class Categories extends CI_Controller 
{ 
    function __construct() 
    { 
     parent::__construct(); 
     $this->load->model('CategoryM'); 
    } 

    public function index(){ 
     echo $category_name=$this->uri->segment(1); 
    } 
} 

URL

WWW。mywebsite /类别名称

//if categoryname exist in category 

输出:

类别名称

+0

我也是关于使用混合ID和名称值自定义slu but,但从来没有尝试加载数据库的路线,我会试试这种方式。谢谢 – Goran

2

首先,您必须将列添加到您的类别表中,例如url_title,该列是唯一的且验证为URI。然后,你必须修改route.php

// Category routes 
$route['categories'] = 'categories/index'; 
$route['(:any)'] = 'categories/$1'; // $1 pass the utl_title value to Categories/preview($url_title) 

和控制器

public function preview($url_title=null) { 
    $categoryId = $this->uri->segment(2); 

    $data = array (
     'previewByCategory' => $this->CategoryM->previewByCategory($url_title) 
     ); 

    $this->load->view('public/preview_by_category', $data); 
} 

和模型

public function previewByCategory($url_title=''){ 
    $query = $this->db 
    ->select(/* posts and categories data */) 
    ->from('categories') 
    ->join('posts', 'posts.categoryID = categories.id', 'left') 
    ->where('categories.url_title', $url_title) 
    ->get(); 
    if($query->num_rows() > 0){ 
     return $query->result(); 
    }else{ 
     return false; 
    } 
} 

我希望这会为你工作。请小心我发布的代码会有语法错误,因为我没有测试过它。