联动介绍:
首先网站的筛选能够方便让用户更快找到自己想要的内容,比如有人想搜索PHP相关的字符串处理。
刚好你网站有对应栏目,这个时候也有对应的多篇文章。但是没有做联动相关处理,这个时候就需要一页页找下去。
可能刚开始时候用户还可以翻几页,但是也不可能无止境翻下去。如果没有做联动相关处理,用户这个时候很可能直接离开了网站。
联动搜索效果如下:
如上图,有分类和代码类型。这样用户可以通过多级的联动筛选找到自己想要的东西。
如何实现这个功能呢?
我们需要修改两个文件:
arc.listview.class.php和extend.func.php
如果有耐心可以继续往下看!
arc.listview.class.php是一个列表处理库,主要处理列表数据以及分页内容。
extend.func.php是一个扩展方法库,可以在模板中进行调用!
如何使用和关联文章的联动筛选呢?
我们在编辑内容模型时候添加对应字段,二这个字段对应是联动管理里面的字段。这个时候我们就可以在发布管理看到对应的联动下拉框了!
内容模型管理:
设置联动字段:
联动枚举组管理:
添加的新字段需要和联动枚举组管理要对应一致!
这个时候发布就会有添加的联动类型了:
如下开始修改arc.listview.class.php:
我们在class里面新建一个方法在 ‘GetArcList’ 上面
public function newQuery(){ //获得附加表的相关信息 $addtable = $this->ChannelUnit->ChannelInfos['addtable']; if ($addtable != "") { $addJoin = " LEFT JOIN `$addtable` ON arc.id = " . $addtable . '.aid '; $addField = ''; $fields = explode(',', $this->ChannelUnit->ChannelInfos['listfields']); foreach ($fields as $k => $v) { $nfields[$v] = $k; } if (is_array($this->ChannelUnit->ChannelFields) && !empty($this->ChannelUnit->ChannelFields)) { foreach ($this->ChannelUnit->ChannelFields as $k => $arr) { if (isset($nfields[$k])) { if (!empty($arr['rename'])) { $addField .= ',' . $addtable . '.' . $k . ' as ' . $arr['rename']; } else { $addField .= ',' . $addtable . '.' . $k; } } } } } else { $addField = ''; $addJoin = ''; } $youxi = isset($_GET['youxi']) ? $_GET['youxi'] : '0'; $youxitype = isset($_GET['youxitype']) ? $_GET['youxitype'] : '0'; $htmltype = isset($_GET['htmltype']) ? $_GET['htmltype'] : '0'; $pcmobile = isset($_GET['pcmobile']) ? $_GET['pcmobile'] : '0'; $newWhere = ' and ( '; $orWhere=[]; if (!empty($youxi) && is_numeric($youxi)) { $orWhere[]= " $addtable.youxi={$youxi}"; } if (!empty($youxitype) && is_numeric($youxitype)) { $orWhere[]= " $addtable.youxitype={$youxitype}"; } if (!empty($htmltype) && is_numeric($htmltype)) { $orWhere[]= " $addtable.htmltype={$htmltype}"; } if (!empty($pcmobile) && is_numeric($pcmobile)) { $orWhere[]= " $addtable.pcmobile={$pcmobile}"; } $orWhere=implode(' and ',$orWhere); $newWhere .= $orWhere.' ) '; if($newWhere==' and ( ) '){ //判断是否有点击联动 $newWhere=''; return ; } $query = "SELECT count(*) as dd FROM `dede_archives` arc LEFT JOIN `dede_arctype` tp ON arc.typeid=tp.id $addJoin WHERE {$this->addSql} {$newWhere} "; $this->queryAll = $query; return $query; }
里面有对应的联动类型参数,后期可以自己改成查询类型省掉多余的步骤,不过这个是后话了!
以上主要生成SQL是给分页计算文章总数量。
$youxi = isset($_GET['youxi']) ? $_GET['youxi'] : '0'; if (!empty($youxi) && is_numeric($youxi)) { $orWhere[]= " $addtable.youxi={$youxi}"; }
这个参数主要对应联动枚举名的youxi,如果有新参数需要再次新增!
新增完参数我们就需要修改GetArcList方法了,用来处理分页连表功能的!
我们在
} else { $addField = ''; $addJoin = ''; }
下方新增代码:
$youxi = isset($_GET['youxi']) ? $_GET['youxi'] : '0'; $youxitype = isset($_GET['youxitype']) ? $_GET['youxitype'] : '0'; $htmltype = isset($_GET['htmltype']) ? $_GET['htmltype'] : '0'; $pcmobile = isset($_GET['pcmobile']) ? $_GET['pcmobile'] : '0'; $newWhere = ' and ( '; $orWhere=[]; if (!empty($youxi) && is_numeric($youxi)) { $orWhere[]= " $addtable.youxi={$youxi}"; } if (!empty($youxitype) && is_numeric($youxitype)) { $orWhere[]= " $addtable.youxitype={$youxitype}"; } if (!empty($htmltype) && is_numeric($htmltype)) { $orWhere[]= " $addtable.htmltype={$htmltype}"; } if (!empty($pcmobile) && is_numeric($pcmobile)) { $orWhere[]= " $addtable.pcmobile={$pcmobile}"; } $orWhere=implode(' and ',$orWhere); $newWhere .= $orWhere.' ) '; if($newWhere==' and ( ) '){//判断是否有点击联动 $newWhere=''; }
分别在如下两个地方新增变量:
为什么要新增这个变量呢,主要用来获取连表新条件判断!
处理完成后我们找到 CountRecord 方法:
找到这行代码
if ($this->TotalResult == -1) { $cquery = "SELECT COUNT(*) AS dd FROM `dede_arctiny` arc WHERE " . $this->addSql; $row = $this->dsql->GetOne($cquery); if (is_array($row)) { $this->TotalResult = $row['dd']; } else { $this->TotalResult = 0; } }
在后面新增:
$this->newQuery(); if(!empty($this->queryAll)){ $row = $this->dsql->GetOne($this->queryAll); if (is_array($row)) { $this->TotalResult = $row['dd']; } else { $this->TotalResult = 0; } }
OK这个时候我们已经处理完了,分页计算和分页数据连表功能,剩下需要解决分页生成后URL问题!
找到GetPageListDM方法:
if ($this->PageNo != 1) {
的上方新增如下:
$query = $_GET; unset($query['tid']); unset($query['PageNo']); unset($query['totalresult']); $url = http_build_query($query);
在当前方法如上几个生成分页地方新增“?{$url}”来解决分页后的参数问题。
如上修改arc.listview.class.php可能比较复杂,但是修改extend.func.php就简单的多了!只是新增一个方法!
我们新站如下联动方法:
function liandong($type, $mid) { global $dsql; $data = []; $d = $mid + 500; $dsql->SetQuery("SELECT * FROM `dede_sys_enum` WHERE `egroup` = '$type' and (evalue>$mid and evalue<$d) and evalue!=$mid ORDER BY `disorder` LIMIT 0, 1000"); $dsql->Execute(); while ($row = $dsql->GetArray()) { $data[] = $row; } $id = isset($_GET[$type]) ? $_GET[$type] : 0; if (!is_numeric($id)) { $id = 0; } // var_dump($_GET);exit; $query = $_GET; unset($query['tid']); unset($query['PageNo']); unset($query['totalresult']); $query[$type] = 0; $url = http_build_query($query); $ben = $id == 0 ? 'style="background-color: #76b5ea;"' : ''; $html = '<dd '.$ben.'><span class="ml"></span><span class="mm"><a href="?' . $url . '">全部</a></span><span class="mr"></span></dd>'; for ($i = 0; $i < count($data); $i++) { $query[$type] = $data[$i]['evalue']; $url = http_build_query($query); if ($id == $data[$i]['evalue']) { $html .= '<dd style="background-color: #76b5ea;"><span class="ml"></span><span class="mm"><a href="?' . $url . '">' . $data[$i]['ename'] . '</a></span><span class="mr"></span></dd>'; } else { $html .= '<dd><span class="ml"></span><span class="mm"><a href="?' . $url . '" >' . $data[$i]['ename'] . '</a></span><span class="mr"></span></dd>'; } } return $html; }
里面的链接生成不做过多的介绍和相关说明!
剩下就是我们如何在模板中使用联动相关功能了:
我们使用php方式调用联动功能,
<dl class="mydllist"> <dd>分类:</dd> {dede:php}echo liandong('htmltype','1000');{/dede:php} </dl>
htmltype是什么意思呢,这个时候后台联动枚举中的名称!
1000是顶级联动枚举!
这样我们就改造完了dedecms联动筛选功能,后期使用也是非常的简单!
有什么不懂的可以加入群进行交流。