【发布时间】:2018-09-04 08:05:32
【问题描述】:
我有一些控制器:帖子、页面、作者。在每个控制器上,我想从数据库中设置单独的 URL。数据库页面的结构:数据库中会有上千条记录。
这如何实现,还要表明每个 URL 都将基于 slug 从数据库中加载。我从前两天就卡在这个了
当前的 Url 结构是 -
我想要这样的网址
【问题讨论】:
标签: php codeigniter codeigniter-2
我有一些控制器:帖子、页面、作者。在每个控制器上,我想从数据库中设置单独的 URL。数据库页面的结构:数据库中会有上千条记录。
这如何实现,还要表明每个 URL 都将基于 slug 从数据库中加载。我从前两天就卡在这个了
当前的 Url 结构是 -
我想要这样的网址
【问题讨论】:
标签: php codeigniter codeigniter-2
由于您的数据库中已经有 slug,我假设您已经完成了该表的 CRUD,并且您只想与它进行交互。
首先你的控制器和方法:
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Post extends CI_Controller {
public function post_details($slug)
{
$this->load->model('article_model', 'article');
$this->data['article'] = $this->article->get_by_slug($slug);
}
}
/* End of file post.php */
/* Location: ./application/controllers/post.php */
那么你的模型:
<?php
defined('BASEPATH') or exit('No direct script access allowed');
class Article_model extends CI_Model
{
public function get_by_slug($slug = null)
{
if (is_null($slug)) {
return array();
}
return $this->db->where('slug', $slug)
->get('posts')
->row();
}
}
/* End of file article_model.php */
/* Location: ./application/models/article_model.php */
最后你的路线应该是这样的:
$route['default_controller'] = 'dashboard';
$route['404_override'] = '';
$route['translate_uri_dashes'] = false;
$route['(:any)'] = 'post/post_details/$1';
【讨论】:
请检查以下代码,将其放在 config/routes.php 文件的底部。
它的作用是检查 'blog-post-' 是否存在于 uri(不在查询字符串中)部分。如果存在,则将其分解并检查第二部分是否为有效的正整数。如果是,则为 uri 设置“post/post_details/{NUMBER}”的路由规则。
它不会通过尝试将其点击重定向到“发布”控制器来破坏其他控制器(页面、作者)的路由规则。
$uri = $_SERVER['REQUEST_URI'];
$check_part = 'blog-post-';
if (strpos($uri, $check_part) !== FALSE) {
$uri_parts = explode('blog-post-', $uri);
if (count($uri_parts) == 2) {
$id = intval($uri_parts[1]);
if ($id > 0) $route[ltrim($uri, '/')] = 'post/post_details/'.$id;
}
}
【讨论】: