实现多条件搜索的第一步是创建一个包含多个搜索条件的表单。PbootCMS的表单提交方式应为GET,以便参数能够体现在URL中,方便用户分享和搜索引擎收录。
<form action="{pboot:scaction}" method="get">
关键字:<input type="text" name="keyword" placeholder="请输入关键字">
分类:
<select name="category">
<option value="">全部</option>
<option value="新闻">新闻</option>
<option value="产品">产品</option>
<option value="活动">活动</option>
</select>
时间范围:
<input type="date" name="start_date"> 至 <input type="date" name="end_date">
作者:<input type="text" name="author" placeholder="请输入作者">
<button type="submit">搜索</button>
</form>
在这个示例中,我们创建了一个包含四个搜索条件的表单:关键字输入框、分类下拉选择、时间范围选择和作者输入框。表单的action属性使用{pboot:scaction}
标签,这是PbootCMS内置的搜索提交地址。
PbootCMS的后端已经内置了对多条件搜索参数的处理能力。当用户提交表单后,系统会自动解析URL中的参数并进行相应的数据库查询。
对于更复杂的搜索需求,可以通过以下参数进行控制:
scode=2,3
field='title|content|author'
order='date desc'
filter=title|ASP,PHP
搜索结果页面使用{pboot:search}
标签循环输出搜索结果,并配合丰富的可用标签展示各项内容信息:
{pboot:search num=12 order='date desc' scode='2,3' field='title|content'}
<div class="search-item">
<h3><a href="[search:link]">[search:title]</a></h3>
<p class="info">
分类:[search:sortname] |
作者:[search:author] |
日期:[search:date]
</p>
<p>[search:content lencn=100]...</p>
</div>
{/pboot:search}
在这个示例中,我们限制了显示12条结果,按发布日期降序排列,只搜索栏目2和3的内容,并且在标题和内容字段中匹配关键词。
PbootCMS允许为不同的搜索表单指定不同的结果页模板。通过在表单中添加searchtpl
隐藏字段,可以指定使用哪个模板文件显示搜索结果:
<input type="hidden" name="searchtpl" value="custom_search.html">
然后在template目录下创建对应的模板文件custom_search.html
,自定义搜索结果的展示样式和布局。
PbootCMS的搜索功能不仅限于系统默认的字段,还可以扩展到数据库中任何可用的字段。例如,如果需要按自定义字段"price"进行搜索,只需在表单中添加相应的输入元素:
价格范围:
<input type="number" name="price_min" placeholder="最低价">
<input type="number" name="price_max" placeholder="最高价">
然后在搜索结果模板中可以通过[search:ext_price]
访问这个自定义字段的值。
对于更复杂的搜索需求,可以结合PbootCMS的自定义模块功能进行二次开发。例如,创建一个产品搜索模块,包含价格区间、产品分类、品牌等多条件筛选。
开发步骤包括:
多条件搜索可能会对数据库造成较大压力,特别是当网站内容量很大时。以下是一些性能优化建议:
{pboot:cache}
标签缓存常用搜索条件的结果如果搜索结果显示"未搜索到任何数据",可以尝试以下解决方案:
scode=*
参数,表示搜索所有栏目内容当某些搜索条件不起作用时:
如果搜索结果排序不符合预期:
order='date desc,id desc'
以下是一个电商网站多条件搜索的完整实现示例:
<form action="{pboot:scaction}" method="get" class="product-search-form">
<input type="text" name="keyword" placeholder="搜索商品名称">
<select name="category">
<option value="">所有分类</option>
{pboot:sort parent=1}
<option value="[sort:name]">[sort:name]</option>
{/pboot:sort}
</select>
<select name="brand">
<option value="">所有品牌</option>
{pboot:list scode=10} <!-- 假设10是品牌分类 -->
<option value="[list:title]">[list:title]</option>
{/pboot:list}
</select>
<div class="price-range">
<input type="number" name="price_min" placeholder="最低价">
<span>-</span>
<input type="number" name="price_max" placeholder="最高价">
</div>
<input type="hidden" name="scode" value="5"> <!-- 商品栏目 -->
<input type="hidden" name="field" value="title|content|ext_brand|ext_price">
<input type="hidden" name="searchtpl" value="product_search.html">
<button type="submit">搜索商品</button>
</form>
{pboot:search num=12 order='date desc' fuzzy=1}
<div class="product-item">
<div class="product-image">
<a href="[search:link]"><img src="[search:ico]" alt="[search:title]"></a>
</div>
<div class="product-info">
<h3><a href="[search:link]">[search:title]</a></h3>
<p class="brand">品牌:[search:ext_brand]</p>
<p class="price">价格:¥[search:ext_price]</p>
<p class="description">[search:description lencn=60]...</p>
</div>
</div>
{/pboot:search}
<!-- 分页 -->
{pboot:if([page:count]>1)}
<div class="page">
{pboot:if([page:prev])}<a href="[page:prev]">上一页</a>{/pboot:if}
{pboot:if([page:next])}<a href="[page:next]">下一页</a>{/pboot:if}
</div>
{/pboot:if}
在/static/css/style.css
中添加样式规则,美化搜索表单和结果展示:
.product-search-form {
display: flex;
flex-wrap: wrap;
gap: 15px;
margin-bottom: 30px;
}
.product-search-form input,
.product-search-form select {
padding: 8px 12px;
border: 1px solid #ddd;
border-radius: 4px;
}
.product-search-form button {
background: #0066cc;
color: white;
border: none;
padding: 8px 20px;
border-radius: 4px;
cursor: pointer;
}
.product-item {
display: flex;
gap: 20px;
margin-bottom: 20px;
padding-bottom: 20px;
border-bottom: 1px solid #eee;
}
.product-image img {
width: 150px;
height: auto;
border-radius: 4px;
}
.page {
margin-top: 30px;
text-align: center;
}
.page a {
display: inline-block;
padding: 8px 16px;
margin: 0 5px;
background: #f5f5f5;
color: #333;
text-decoration: none;
border-radius: 4px;
}
.page a:hover {
background: #0066cc;
color: white;
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。