以下代码只针对 V6.0 以上版本
需求调研
近日收到求助需要优化文章模块的url地址
优化前:/index/information/17.html
优化后:/17.html
需求分析
1、/index是应用的名称,我们可以通过域名绑定应用的方式来隐藏
2、系统的每个模块是独立的表,如文章模块和产品模块的id可能存在重复所以这里需要做取舍
思路
通过需求分析我们能明确,如果想得到/17.html
这种url
我们只能给一个模块来做优化,如果多个模块的话需要加以区分比如叫做news_17.html
,product_17.html
等。
我们需要通过url确定是哪个表的数据,这样我们就能反推出当前的模型和表名称,剩下的自然就好处理了。
路由部分修改
1、只给其中一个模块做优化,其他的放弃(以下代码基于此)
// 这里我们匹配所有数字到Article控制器的infoArticle方法Route::any('<id>$', 'Article/infoArticle')->pattern(['id' => '\d+']);
2、多个模块做优化
Route::any('news_<id>$', 'Article/infoArticle')->pattern(['id' => '\d+']);Route::any('product_<id>$', 'Article/infoArticle')->pattern(['id' => '\d+']);
控制器部分的修改
1、由于我们并没有Article
控制器,所以会调用默认的Error
空控制器,我们在该控制器中添加新的方法(基本等同于复制一份info
方法)
public function infoArticle(string $id){ // 获取栏目ID $catId = getCateId(); // 当前模型ID $this->moduleId = Cate::where('id', '=', $catId)->value('module_id'); // 当前表名称 $this->tableName = Module::where('id', '=', $this->moduleId)->value('table_name'); // 当前模型字段列表 $this->fields = Field::getFieldList($this->moduleId); if (empty($catId)) { $this->error('未找到对应栏目'); } // 获取栏目信息 $cate = Cms::getCateInfo($catId); // 更新点击数 Cms::addHits($id, $this->tableName); // 查找内容详情 $info = Cms::getInfo($id, $this->tableName); // 跳转 if (isset($info['url']) && !empty($info['url'])) { return redirect($info['url']); } // 当前地址 $info['url'] = getShowUrl($info); // tdk $tdk = Cms::getInfoTdk($info, $cate, $this->system); // 模板 $template = Cms::getInfoView($info, $cate, $this->tableName); $view = [ 'cate' => $cate, // 栏目信息 'fields' => $this->fields, // 字段列表 'info' => $info, // 详情信息 'system' => $this->system, // 系统信息 'public' => $this->public, // 公共目录 'title' => $tdk['title'], 'keywords' => $tdk['keywords'], 'description' => $tdk['description'], ]; View::assign($view); return View::fetch($template);}
公共方法的修改
common.php 中修改以下两个方法
/*** * 获取当前栏目ID * @return mixed */function getCateId(){ if (\think\facade\Request::has('cate')) { $result = (int)\think\facade\Request::param('cate'); } else { $result = \app\common\model\Cate::where('cate_folder', '=', \think\facade\Request::controller()) ->value('id'); if (!$result) { $article = \app\common\model\Article::find(request()['id']); if ($article) { $result = $article->cate_id; } } } return $result;}getShowUrl 需要根据具体情况做调整,具体做法就是根据模块id做处理
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。