前端页面构建搜索表单
在 EyouCms 中,首先需要在模板文件(通常是.html文件)中构建搜索表单。可以使用 HTML 的<form>标签来实现。
示例代码如下:
html
复制
<form action="{eyou:arcurl function='list'}" method="get">
<input type="text" name="keywords" placeholder="关键词搜索">
<select name="category_id">
<option value="">所有分类</option>
{eyou:channel type='son' addfields='litpic' row='10'}
<option value="{eyou:$field.id}">{eyou:$field.typename}</option>
{/eyou:channel}
</select>
<input type="submit" value="搜索">
</form>
在这个表单中,action属性指向了 EyouCms 的列表页生成函数list。method="get"表示使用 GET 方法提交表单。表单中有一个文本输入框用于输入关键词(keywords),一个下拉菜单用于选择分类(category_id),最后是一个提交按钮。通过{eyou:channel}标签来动态生成分类选项,type='son'表示获取子分类,addfields='litpic'可以添加额外的字段(这里是缩略图字段),row='10'表示获取 10 个分类。
后端处理多条件搜索逻辑(在控制器或模型中)
在 EyouCms 的控制器或者模型文件中,需要处理前端提交的搜索条件。
对于关键词搜索和分类搜索,在list方法(假设是在文章列表控制器中)中可以这样处理:
php
复制
public function list()
{
$keywords = input('keywords');
$category_id = input('category_id');
$where = [];
if ($keywords) {
$where['a.title'] = ['like', '%'.$keywords.'%'];
}
if ($category_id) {
$where['a.category_id'] = $category_id;
}
$articleList = Db::name('archives')->alias('a')->where($where)->select();
$this->assign('articleList', $articleList);
return $this->fetch();
}
在上述代码中,首先通过input函数获取前端提交的keywords(关键词)和category_id(分类 ID)。然后构建一个$where数组来存储查询条件。如果keywords不为空,就添加一个标题模糊查询的条件到$where数组中。如果category_id不为空,就添加一个分类 ID 匹配的条件。最后,使用Db::name('archives')->alias('a')->where($where)->select()来根据条件查询文章列表,并将结果赋值给模板变量articleList,最后返回模板渲染结果。
优化搜索体验(如添加更多筛选条件、分页等)
添加更多筛选条件
除了关键词和分类,还可以添加其他筛选条件,比如时间范围、文章标签等。】
例如,添加一个时间范围筛选:
html
复制
<form action="{eyou:arcurl function='list'}" method="get">
<input type="text" name="keywords" placeholder="关键词搜索">
<select name="category_id">
<option value="">所有分类</option>
{eyou:channel type='son' addfields='litpic' row='10'}
<option value="{eyou:$field.id}">{eyou:$field.typename}</option>
{/eyou:channel}
</select>
<label for="start_date">开始日期:</label>
<input type="date" name="start_date">
<label for="end_date">结束日期:</label>
<input type="date" name="end_date">
<input type="submit" value="搜索">
</form>
在后端的list方法中更新条件处理部分:
php
复制
public function list()
{
$keywords = input('keywords');
$category_id = input('category_id');
$start_date = input('start_date');
$end_date = input('end_date');
$where = [];
if ($keywords) {
$where['a.title'] = ['like', '%'.$keywords.'%'];
}
if ($category_id) {
$where['a.category_id'] = $category_id;
}
if ($start_date && $end_date) {
$where['a.pubdate'] = ['between', [$start_date, $end_date]];
} elseif ($start_date) {
$where['a.pubdate'] = ['>=', $start_date];
} elseif ($end_date) {
$where['a.pubdate'] = ['<=', $end_date];
}
$articleList = Db::name('archives')->alias('a')->where($where)->select();
$this->assign('articleList', $articleList);
return $this->fetch();
}
添加分页功能
在 EyouCms 中,可以使用内置的分页类来实现分页。在list方法中,在查询文章列表之后添加分页逻辑。
php
复制
public function list()
{
// 前面的条件查询部分省略...
$articleList = Db::name('archives')->alias('a')->where($where)->select();
$count = Db::name('archives')->alias('a')->where($where)->count();
$page = input('page', 1);
$limit = 10;
$pages = ceil($count / $limit);
$articleList = Db::name('archives')->alias('a')->where($where)->page($page, $limit)->select();
$this->assign('articleList', $articleList);
$this->assign('page', $page);
$this->assign('pages', $pages);
return $this->fetch();
}
在模板文件中,添加分页链接的显示:
html
复制
<div class="pagination">
{eyou:page current="{eyou:$page}" pages="{eyou:$pages}" url="{eyou:arcurl function='list'}?keywords={eyou:$keywords}&category_id={eyou:$category_id}&start_date={eyou:$start_date}&end_date={eyou:$end_date}"}
{/eyou:page}
</div>
这样就可以根据搜索条件实现带有分页的多条件搜索功能。
后端代码如下:
public function product_search(){
//接收参数
//类别
$category = input('ProType');
//NetSelect1
$netselect1 = input('NetSelect1');
//NetSelect2
$netselect2 = input('NetSelect2');
//NetSelect3
$netselect3 = input('NetSelect3');
//Proname
$proname = input('Proname');
//组装条件
//获取所有符合条件产品
$map = [];
if($category){
$map['b.category'] = ['like',"%".$category.'%'];
}
if($netselect1){
$map['b.netselect1'] = ['like',"%".$netselect1.'%'];
}
if($netselect2){
$map['b.netselect2'] = ['like',"%".$netselect2.'%'];
}
if($netselect3){
$map['b.netselect3'] = ['like',"%".$netselect3.'%'];
}
$where = [
'a.status'=>1,
'a.is_del'=>0,
'a.channel'=>2
];
if($proname){
$where['a.title'] = ['like',"%".$proname.'%'];
}
$list = array();
//分页查询
$count = Db::name('archives')->alias('a')->join('__PRODUCT_CONTENT__ b', 'b.aid = a.aid', 'LEFT')->where($where)->where($map)->count();
$Page = new Page($count, config('paginate.list_rows'));
$field = !empty($field) ? $field : 'b.*, a.*, a.aid as aid';
$list = Db::name('archives')->field($field)
->alias('a')
->join('__PRODUCT_CONTENT__ b', 'b.aid = a.aid', 'LEFT')
->where($map)
->where($where)
->limit($Page->firstRow.','.$Page->listRows)
->select();
$show = $Page->show();
$this->assign('page', $show);
$this->assign('list', $list);
$this->assign('pager', $Page);
$viewfile = 'product_search';
return $this->fetch(":{$viewfile}");
}
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, Fastadmin, ClassCMS, LeCMS, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。