【问题标题】:How to overwrite Codeigniter 3 route to show just name instead id and name如何覆盖 Codeigniter 3 路由以仅显示名称而不是 id 和名称
【发布时间】:2018-01-04 07:34:35
【问题描述】:


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

【问题讨论】:

  • 你可以这样做categoryname如果这些只是唯一的
  • 你是什么意思?要根据没有 id 的类别名称的值获取数据?

标签: php codeigniter url-rewriting routing


【解决方案1】:

首先,您必须将列添加到您的类别表中,例如 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;
    }
}

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

【讨论】:

    【解决方案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/categoryname

    //if categoryname exist in category
    

    输出:

    类别名称

    【讨论】:

    • 我也打算使用混合 id 和 name 值制作自定义 slug,但从未尝试在路由中加载 db,我会尝试这种方式。谢谢
    猜你喜欢
    • 2018-06-11
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2015-03-06
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多