官方得搜索模型好像只能对一个模型进行搜索,如果不指定modelid要进行全站搜索得话,可以采用下列得代码进行替换官方得搜索控制器。
官方搜索控制器:application\cms\controller\下搜索 function search(),把整个函数更换为如下:
// 搜索
public function search()
{
$seo = seo('', '搜索结果');
$allData = []; // 存放所有模型的所有搜索结果(不分页)
$count = 0;
// 分页配置
$page = $this->request->param('page/d', 1);
$pageSize = 10; // 每页3条,你可以随便改
// 接收参数
$modelid = $this->request->param('modelid/d', 0);
$keyword = $this->request->param('keyword/s', '', 'trim,safe_replace,strip_tags,htmlspecialchars');
$keyword = str_replace('%', '', $keyword);
$time = $this->request->param('time/s', '');
// 验证
$result = $this->validate([
'keyword' => $keyword,
], [
'keyword|标题关键词' => 'chsDash|max:25',
]);
if (true !== $result) {
$this->error($result);
}
debug('begin');
// 模型列表
$modellist = cache('Model');
if (!$modellist) {
return $this->error('没有可搜索模型~');
}
// ===================== 【第一步:查询所有模型的全部数据,不分页】 =====================
foreach ($modellist as $key => $vo) {
$searchField = Db::name('model_field')
->where('modelid', $key)
->where('ifsystem', 1)
->where('ifsearch', 1)
->column('name');
if (empty($searchField)) continue;
// 拼接搜索条件
$where = [];
foreach ($searchField as $v) {
$where[] = [$v, 'like', "%{$keyword}%"];
}
// 查询当前模型 所有 符合条件的数据(不分页)
$list = Db::name($vo['tablename'])
->whereOr($where)
->where('status', 1)
->field('title,id,catid,url')
->order('listorder DESC,id DESC')
->select();
// 合并到总数据
foreach ($list as $item) {
$item['url'] = '/shows/'.$item['catid'].'/'.$item['id'].'.html';
$allData[] = $item;
}
}
// 总条数
$count = count($allData);
// ===================== 【第二步:对全部数据进行人工分页】 =====================
$allData = array_values($allData);
$offset = ($page - 1) * $pageSize;
$currentPageItems = array_slice($allData, $offset, $pageSize);
// ===================== 【第三步:生成分页HTML】 =====================
$paginator = new \think\paginator\driver\Bootstrap(
$currentPageItems,
$pageSize,
$page,
$count,
false,
[
'path' => url('/search'),
'query' => request()->param(),
]
);
$pages = $paginator->render();
debug('end');
// 赋值模板
$this->assign([
'time' => $time,
'modelid' => $modelid,
'keyword' => $keyword,
'SEO' => $seo,
'list' => $currentPageItems, // 当前页数据
'count' => $count,
'result' => $count,
'modellist' => $modellist,
'pages' => $pages,
]);
return $this->fetch('/search_result');
}