php - 如何覆盖 Codeigniter 3 路由以仅显示名称而不是 id 和名称

标签 php codeigniter url-rewriting routes


我在这里需要一点指导。我正在使用 Codeigniter 3。 由于它是具有分段路由的 MVC fw,我想知道如何创建仅显示 name 的自定义路由从数据库返回的记录(可以是类别、产品、帖子等)而不是 id/name当我需要id segment时以确定我需要返回或预览数据库中的哪条记录 id .

我将发布一些代码示例:

Controller

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 如何做到这一点呢?如果我的问题太广泛,我很抱歉。提前致谢。

最佳答案

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

}

在类别 Controller 中

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/categoryname

//if categoryname exist in category

输出:

类别名称

关于php - 如何覆盖 Codeigniter 3 路由以仅显示名称而不是 id 和名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45369974/

相关文章:

php - Virtuemart 2 pdf 生成

php - 我应该如何组织基于框架的项目的源代码控制?

php - 将 PHP 编译为静态二进制文件

php - 在 codeigniter 中计算结果

asp.net - IIS 8 上的 Blazor WebAssembly - 0x8007000d

PHP:从套接字或 STDIN 读取

php - 最安全的 PHP 'access denied' 方法

php - 代码点火器3.0.1 : Getting values from select and input

wordpress - 在 WordPress 页面 URL 中添加动态前缀

javascript - 使用 jQuery 在单击时更改当前 URL