如何覆盖Codeigniter 3路由以显示名称而不是ID和名称

时间:2017-07-28 09:37:54

标签: php codeigniter url-rewriting routing


我需要一点指导。我正在使用Codeigniter 3。 由于它是具有段路由的MVC fw,我想知道如何创建自定义路由,它将仅显示从数据库返回的name记录(可以是类别,产品,帖子等..)而不是id/name当我需要id segment来识别我需要从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的情况下执行此操作。如果我的问题太宽泛,我很抱歉。提前谢谢。

2 个答案:

答案 0 :(得分: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;
    }
}

我希望这对你有用。请注意我发布的代码会出现语法错误,因为我没有对其进行测试。

答案 1 :(得分: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);
    }
}

<强>网址

  

www.mywebsite /类别名称

//if categoryname exist in category

输出

类别名称