主页 > 编程资料 > Dedecms >
发布时间:2018-09-01 作者:apizl 阅读:644次

联动介绍:

首先网站的筛选能够方便让用户更快找到自己想要的内容,比如有人想搜索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;
}
}


 处理完成后我们找到 CountRecord 方法



OK这个时候我们已经处理完了,分页计算和分页数据连表功能,剩下需要解决分页生成后URL问题!


找到GetPageListDM方法:

if ($this->PageNo != 1) {

的上方新增如下:

$query = $_GET;
unset($query['tid']);
unset($query['PageNo']);
unset($query['totalresult']);
$url = http_build_query($query);

解决分页生成后URL问题


解决分页生成后URL问题

在当前方法如上几个生成分页地方新增“?{$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>

dedephp方式调用联动功能

htmltype是什么意思呢,这个时候后台联动枚举中的名称!


1000是顶级联动枚举!


这样我们就改造完了dedecms联动筛选功能,后期使用也是非常的简单!


有什么不懂的可以加入群进行交流。

文章由爱资料原创本文地址:https://www.apizl.com/archives/view-141128-1.html,转载请以链接形式标明本文地址!
关键字词: