DedeCMS 的移动端(手机站)搜索功能,其核心文件和逻辑与 PC 端有所不同,下面我将从文件位置、核心逻辑、自定义修改和常见问题四个方面为你进行详细说明。
核心文件位置
手机站的搜索功能主要涉及以下几个文件,它们通常位于你手机站的模板目录下,/templets/default/ 或你自定义的手机模板目录。
| 文件名 | 路径示例 | 功能说明 |
|---|---|---|
search.php |
/m/search.php |
手机搜索的入口文件,处理搜索请求、调用搜索逻辑,并最终加载搜索结果页模板。 |
search.htm |
/templets/default/search.htm |
手机搜索结果页的模板文件,用于展示搜索到的文章列表、分页等信息。 |
head.htm |
/templets/default/head.htm |
手机站的头部文件,通常包含搜索框的 HTML 代码。 |
footer.htm |
/templets/default/footer.htm |
手机站的底部文件。 |
注意:如果你的网站开启了“静态目录部署”,这些文件可能会被复制到 /m/ 目录下,请务必检查你实际访问的路径。
核心逻辑与流程
手机搜索的执行流程如下:
- 用户输入关键词:用户在手机站的搜索框(通常在
head.htm中)输入关键词,并点击“搜索”。 - 提交请求:表单数据(关键词
q)被提交到/m/search.php。 search.php处理:- 接收并过滤关键词
q。 - 调用 DedeCMS 内置的搜索函数
SearchByKey()。 SearchByKey()函数会根据关键词在数据库的dede_archives(文章表)、dede_arctype(栏目表) 等表中查询匹配的记录。- 将查询到的结果(文章ID、标题、发布时间等)存入一个数组中。
- 将结果数组传递给模板引擎。
- 接收并过滤关键词
- 加载模板:
search.php加载并解析search.htm模板文件。 - 展示结果:在
search.htm模板中,通过循环{dede:list}或{dedarclist}等标签,将 PHP 传递过来的搜索结果数据渲染成 HTML 页面,展示给用户。
如何自定义修改
1 修改搜索结果页模板 (search.htm)
这是最常见的自定义需求,你可以编辑 /templets/default/search.htm 文件来改变搜索结果的展示样式。
常用标签说明:
{dede:global name='keyword'/}: 显示用户当前搜索的关键词。{dede:global name='totalresult'/}: 显示搜索到的总结果数。{dede:list pagesize='10'}: 核心标签,用于循环输出搜索结果。pagesize='10': 设置每页显示的文章数量。- 在
{dede:list}和{/dede:list}之间,你可以使用以下子标签:[field:title/]: 文章标题。[field:arcurl/]: 文章链接。[field:pubdate function="MyDate('Y-m-d',@me)"/]: 文章发布日期,MyDate是日期格式化函数。[field:description function="cn_substr(@me, 200)"/]:cn_substr是截取字符串函数,这里截取200字符。[field:litpic/]: 文章缩略图。
search.htm 示例代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">搜索结果 - {dede:global name='keyword'/} - {dede:global name='cfg_webname'/}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- 引入手机端样式文件 -->
<link rel="stylesheet" href="{dede:global name='cfg_cmspath'/}/static/css/style.css">
</head>
<body>
<!-- 头部 -->
{dede:include filename="head.htm"/}
<div class="main">
<div class="search-result-box">
<h2>搜索 "<strong>{dede:global name='keyword'/}</strong>" 的结果</h2>
<p class="result-count">找到 <strong>{dede:global name='totalresult'/}</strong> 条相关结果</p>
<!-- 文章列表开始 -->
{dede:list pagesize='10'}
<div class="item">
<a href="[field:arcurl/]">
<h3>[field:title/]</h3>
<p class="desc">[field:description function="cn_substr(@me, 200)"/]...</p>
<div class="info">
<span class="date">[field:pubdate function="MyDate('Y-m-d',@me)"/]</span>
</div>
</a>
</div>
{/dede:list}
<!-- 文章列表结束 -->
<!-- 分页开始 -->
<div class="page">
{dede:pagelist listsize='5' listitem='info,index,end,pre,next,pageno'}
</div>
<!-- 分页结束 -->
{if $totalresult == 0}
<div class="no-result">
<p>抱歉,没有找到与 "<strong>{dede:global name='keyword'/}</strong>" 相关的内容。</p>
<p>建议您:</p>
<ul>
<li>检查输入的关键词是否正确</li>
<li>尝试使用更简洁的关键词</li>
<li>尝试使用同义词或相关词</li>
</ul>
</div>
{/if}
</div>
</div>
<!-- 底部 -->
{dede:include filename="footer.htm"/}
</body>
</html>
2 修改搜索入口 (head.htm)
通常在 head.htm 中会有一个搜索框,你需要确保它的 action 属性指向 /m/search.php。
head.htm 中的搜索框示例:
<div class="search-box">
<form action="/m/search.php" method="get">
<input type="text" name="q" placeholder="请输入关键词..." required>
<button type="submit">搜索</button>
</form>
</div>
3 修改搜索逻辑 (search.php)
如果你需要修改搜索的核心逻辑,比如改变搜索的字段、权重或者添加新的搜索条件,你需要编辑 /m/search.php。
search.php 关键代码解析:
<?php
require_once(dirname(__FILE__)."/../include/common.inc.php");
require_once(DEDEINC."/arc.search.class.php");
// 获取并过滤搜索关键词
$keyword = FilterSearch(stripslashes($q));
// 实例化搜索类
$search = new Search($keyword, 'default', 'title');
// 设置搜索参数(可选)
// $search->AddChannel(1); // 只在栏目ID为1的栏目中搜索
// $search->SetResultType('all'); // 搜索所有类型
// 执行搜索
$keywords = $search->GetKeyword();
$GettkCount = $search->GetCount();
$GettkList = $search->GetList();
// 赋值给模板
$pagelist = $search->GetPageList();
$dlist = $search->GetArcList();
// 加载模板
include(DEDETEMPLATE.'/default/search.htm');
?>
自定义修改示例:
假设你想让搜索同时搜索标题和文章内容,而不仅仅是标题。
- 打开
/m/search.php。 - 找到
new Search($keyword, 'default', 'title');这一行。 - 将第三个参数
'title'修改为'body',或者使用'all'来搜索所有可搜索的字段。
// 修改前(只搜索标题) // $search = new Search($keyword, 'default', 'title'); // 修改后(搜索标题和内容) $search = new Search($keyword, 'default', 'all');
常见问题与解决方案
问题1:手机站搜索结果为空,但 PC 站有结果。
原因分析:
- 模板文件问题:
/m/search.php或/templets/default/search.htm文件不存在或路径错误。 - 标签不匹配:
search.htm中使用了{dede:list},但搜索结果可能需要使用{dede:arclist},虽然{dede:list}在新版 DedeCMS 中通常也能工作,但兼容性可能有问题。 - 权限问题:服务器上
/m/search.php文件没有执行权限。
解决方案:
- 检查
/m/search.php文件是否存在,并确保有执行权限。 - 检查
search.htm是否在正确的模板目录下。 - 尝试将
search.htm中的{dede:list}替换为{dede:arclist}。<!-- 尝试使用 arclist --> {dede:arclist titlelen=40 row=10} <a href="[field:arcurl/]">[field:title/]</a> {/dede:arclist}
问题2:搜索结果样式错乱。
原因分析:
- CSS 样式文件未正确引入或样式冲突,手机站和 PC 站的 CSS 是分开的。
解决方案:
- 检查
search.htm的<head>部分,是否正确引入了手机专用的 CSS 文件。 - 使用浏览器开发者工具(F12)的“设备模拟”模式,检查搜索结果页的 HTML 结构和对应的 CSS 样式,定位问题样式并修改。
问题3:搜索分页不工作。
原因分析:
search.php中没有正确调用分页函数。search.htm中分页标签{dede:pagelist}写法有误。
解决方案:
- 确保
search.php中有$pagelist = $search->GetPageList();这行代码。 - 确保
search.htm中有{dede:pagelist listsize='5' listitem='info,index,end,pre,next,pageno'}这样的标签,并且没有被注释掉。
DedeCMS 手机搜索页的定制,核心在于掌握三个文件的作用:
search.php(逻辑控制):处理请求,调用搜索类,准备数据。search.htm(模板展示):负责将数据以 HTML 的形式展示给用户。head.htm(入口):提供用户输入关键词的表单。
通过修改这三个文件,你可以完全控制手机搜索的样式和行为,遇到问题时,优先检查文件路径、权限和标签的正确性。
