图片 11

dedecms教程之单表模型动态浏览设置方法分享

联动搜索效果如下:

图片 1

如上图,有分类和代码类型。这样用户可以通过多级的联动筛选找到自己想要的东西。

然后打开之前修改过的arc.listview.class.php文件,分别在第117行左右和第809行的左右的样子,找到如下代码:

方法二:

如何使用和关联文章的联动筛选呢?

我们在编辑内容模型时候添加对应字段,二这个字段对应是联动管理里面的字段。这个时候我们就可以在发布管理看到对应的联动下拉框了!

联动多选功能

方法一:

如何实现这个功能呢?

我们需要修改两个文件:

arc.listview.class.php和extend.func.php

如果有耐心可以继续往下看!

arc.listview.class.php是一个列表处理库,主要处理列表数据以及分页内容。

extend.func.php是一个扩展方法库,可以在模板中进行调用!

AddFilter函数里面的第一个数字4是内容模型的id号,各个内容模型的id请到后台内容模型管理里面查看;

我们的目的就是将GetFileUrl()参数中的 1[$row[‘title’]后面的1]
改为$row[‘ismake’]

联动介绍:

首先网站的筛选能够方便让用户更快找到自己想要的内容,比如有人想搜索PHP相关的字符串处理。

刚好你网站有对应栏目,这个时候也有对应的多篇文章。但是没有做联动相关处理,这个时候就需要一页页找下去。

可能刚开始时候用户还可以翻几页,但是也不可能无止境翻下去。如果没有做联动相关处理,用户这个时候很可能直接离开了网站。

两处的代码都修改为下面的代码:

注:如果只需要arclistsg标签显示动态,则到此步就可以了

设置联动字段:

图片 2

{dede:php}AddFilter(4,1,'linestyle,linethem,youdays,jgqujian');{/dede:php}

第二,修改arc.sglistview.class.php,大约760行,将$row[‘ismake’] =
1;注释掉,下其下面的几行,有$row[‘arcurl’] =
GetFileUrl()有与第一步中的代码,改成第一步中一样的即可

联动枚举组管理:

图片 3

添加的新字段需要和联动枚举组管理要对应一致!

这个时候发布就会有添加的联动类型了:

图片 4

如下开始修改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方法了,用来处理分页连表功能的!

图片 5

我们在

} 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='';
}

分别在如下两个地方新增变量:

图片 6

为什么要新增这个变量呢,主要用来获取连表新条件判断!

处理完成后我们找到 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;
}
}

图片 7

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

找到GetPageListDM方法:

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

的上方新增如下:

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

图片 8

图片 9

在当前方法如上几个生成分页地方新增“?{$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.'><a href="?' . $url . '">全部</a></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;"><a href="?' . $url . '">' . $data[$i]['ename'] . '</a></dd>';
} else {
$html .= '<dd><a href="?' . $url . '" >' . $data[$i]['ename'] . '</a></dd>';
}
}
return $html;
}

里面的链接生成不做过多的介绍和相关说明!

剩下就是我们如何在模板中使用联动相关功能了:

我们使用php方式调用联动功能,

<dl class="mydllist">
<dd>分类:</dd>
{dede:php}echo liandong('htmltype','1000');{/dede:php}
</dl>

图片 10

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

1000是顶级联动枚举!

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

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

文章由爱资料原创本文地址:

到这里联动筛选单选的功能就弄完了,如果只需要单选功能的朋友可以直接用了,但是如果需要多选功能的朋友请继续往下面看。

第一,arclistsg
源码中,大约在264行,找到$row[‘arcurl’]这个,GetFileUrl()【这个函数在helpers/channelunit.helper.php中】,就是获取url地址用的,其中有一个ismake参数,有兴趣可以看看这个函数。

内容模型管理:

图片 11

$filtersql .= ($key!=``"tid"
&& $key!=``"TotalResult"
&& $key!=``"PageNo"``) ? ``" AND $addtable."``.wwwcms_filter($key).``" = "``.wwwcms_filter(iconv(``"UTF-8"``, ``"gb2312"``, $value)).``""
: ";

到此,基本上可以实现动态浏览,不过在新增或修改时还是会生成html文件,将对应发布程序或修改程序将生成html的代码注释就可以了。

3.然后进入内容管理模块定义自己要添加的字段

单表模型的创建,默认是不没有ismake字段,因为我们手工创建一个ismake字段,设其传值为-1。

第二个数字1是表示筛选的样式,1是使用超链接进行选择,2是使用select下拉框选择,具体可以自己设置了查看效果;

其实和方法一是一个道理,如果不想建立ismake字段,将对应的地方法修改为-1就可以了,不过这样做兼容性不怎么好,建议方法一

 

修改源码:

if($key=="goodstype" || $key=="goodscolor" ){//你自定义字段的字段名英文名字,每个字段要检查的
        $count=0;
        $nowsql ='';
        $var=explode(",",wwwcms_filter(iconv("UTF-8", "gb2312", $value)));//iconv是转码的意思,如果你url传进来的参数是中文,就需要转码

        if(!empty($var)){
            foreach($var as $value){ 
               if($count==0){
                  $filtersql.="and ($addtable.".wwwcms_filter($key)." like '%".$value."%'";
                  $count++;
               }else{
                 $filtersql.="or $addtable.".wwwcms_filter($key)." like '%".$value."%'";
            }

             }
        $filtersql.=")";
        }


    }else{
     //注意这个地方要可能和你的源文件不同要用你的源代码覆盖
    $filtersql .= ($key!="tid" && $key!="TotalResult" && $key!="PageNo") ? " AND $addtable.".wwwcms_filter($key)." = ".wwwcms_filter(iconv("UTF-8", "gb2312", $value))."" : '';//跟上面一样,如果传递的值是中文,那么就需要转码
}

注:创建模型时,可以添加一个ismake字段。如果没有,则可以在对应表中直接添加,并在dede_channeltype表中的listfields中加上ismake字段,此举为添加查询字段。如果最后一步都完了,发现不起作用,可以查询listfields是否有ismake

下载地址http://pan.baidu.com/s/1hqs2E9Y 

arclistsg 标签,单表独立模型的文档列表调用标记

 

在arclist标签使用中,其对应主表dede_archives中有一个字段ismake字段,其作用大家应该知道,值为-1时动态,我们的方法就是模仿这个。

1.后台——系统——系统基本参数——其它选项——模板引擎禁用标签:php

第一个

记住,一定要以英文半角逗号隔开,如果你编码是gbk的,传值的时候如果url显示的是中文,就可以直接使用上面的代码,否则的话在转码那可能要稍微修改下

 //通过以下代码进行调用

    //dedecms联动筛选功能 By 织梦技术研究中心 技术支持群:217479292
字符过滤函数 function wwwcms_filter($str,$stype=”inject”) { if
($stype==”inject”) { $str = str_replace( array( “select”, “insert”,
“update”, “delete”, “alter”, “cas”, “union”, “into”, “load_file”,
“outfile”, “create”, “join”, “where”, “like”, “drop”, “modify”,
“rename”, “‘”, “/*”, “*”, “../”, “./”),
array(“”,””,””,””,””,””,””,””,””,””,””,””,””,””,””,””,””,””,””,””,””,””),
$str); } else if ($stype==”xss”) { $farr = array(“/s+/” ,
“/<(/?)(script|META|STYLE|HTML|HEAD|BODY|STYLE
|i?frame|b|strong|style|html|img|P|o:p|iframe|u
|em|strike|BR|div|a|TABLE|TBODY|object|tr|td
|st1:chsdate|FONT|span|MARQUEE|body|title |rn|link
|meta|?|%)([^>]*?)>/isU”,
“/(<[^>]*)on[a-zA-Z]+s*=([^>]*>)/isU”, ); $tarr =
array(” “, “”, “\1\2”, ); $str = preg_replace($farr, $tarr,
$str); $str = str_replace( array( “<“, “>”, “‘”, “””, “;”,
“/*”, “*”, “../”, “./”), array(“<“,”>”,””,””,””,””,””,””,””),
$str); } return $str; } /** * 载入自定义表单(用于发布) * * @access
public * @param string $fieldset 字段列表 * @param string $loadtype
载入类型 * @return string */ function AddFilter($channelid, $type=1,
$fieldsnamef, $defaulttid, $loadtype=’autofield’) { global
$tid,$dsql,$id; $tid = $defaulttid ? $defaulttid : $tid; if ($id!=””) {
$tidsq = $dsql->GetOne(” Select typeid From `#@__archives` where
id=’$id’ “); $tid = $tidsq[“typeid”]; } $nofilter =
(isset($_REQUEST[‘TotalResult’]) ?
“&TotalResult=”.$_REQUEST[‘TotalResult’] :
”).(isset($_REQUEST[‘PageNo’]) ? “&PageNo=”.$_REQUEST[‘PageNo’] :
”); $filterarr = wwwcms_filter(stripos($_SERVER[‘REQUEST_URI’],
“list.php?tid=”) ? str_replace($nofilter, ”,
$_SERVER[‘REQUEST_URI’]) :
$GLOBALS[‘cfg_cmsurl’].”/plus/list.php?tid=”.$tid); $cInfos =
$dsql->GetOne(” Select * From `#@__channeltype` where
id=’$channelid’ “); $fieldset=$cInfos[‘fieldset’]; $dtp = new
DedeTagParse(); $dtp->SetNameSpace(‘field’,'<‘,’>’);
$dtp->LoadSource($fieldset); $dede_addonfields = ”;
if(is_array($dtp->CTags)) { foreach($dtp->CTags as
$tid=>$ctag) { $fieldsname = $fieldsnamef ? explode(“,”,
$fieldsnamef) : explode(“,”, $ctag->GetName());
if(($loadtype!=’autofield’ || ($loadtype==’autofield’ &&
$ctag->GetAtt(‘autofield’)==1)) && in_array($ctag->GetName(),
$fieldsname) ) { $href1 = explode($ctag->GetName().’=’, $filterarr);
$href2 = explode(‘&’, $href1[1]); $fields_value = $href2[0];
$dede_addonfields .= ‘<div
class=”scv-shaixuan”><b>’.$ctag->GetAtt(‘itemname’).’:</b>’;
switch ($type) { case 1: $dede_addonfields .=
(preg_match(“/&”.$ctag->GetName().”=/is”,$filterarr,$regm) ? ‘<a
title=”全部”
href=”‘.str_replace(“&”.$ctag->GetName().”=”.$fields_value,””,$filterarr).'”>全部</a>’
: ‘<span>全部</span>’).’ ‘; $addonfields_items =
explode(“,”,$ctag->GetAtt(‘default’)); for ($i=0;
$i<count($addonfields_items); $i++) { $href =
stripos($filterarr,$ctag->GetName().’=’) ?
str_replace(“=”.$fields_value,”=”.urlencode($addonfields_items[$i]),$filterarr)
:
$filterarr.’&’.$ctag->GetName().’=’.urlencode($addonfields_items[$i]);//echo
$href; $dede_addonfields .=
($fields_value!=urlencode($addonfields_items[$i]) ? ‘<a
title=”‘.$addonfields_items[$i].'”
href=”‘.$href.'”>’.$addonfields_items[$i].'</a>’ :
‘<span>’.$addonfields_items[$i].'</span>’).” “; }
$dede_addonfields .= ‘</div>’; break; case 2: $dede_addonfields
.= ‘<select name=”filter”‘.$ctag->GetName().’
onchange=”window.location=this.options[this.selectedIndex].value”>
‘.'<option
value=”‘.str_replace(“&”.$ctag->GetName().”=”.$fields_value,””,$filterarr).'”>全部</option>’;
$addonfields_items = explode(“,”,$ctag->GetAtt(‘default’)); for
($i=0; $i<count($addonfields_items); $i++) { $href =
stripos($filterarr,$ctag->GetName().’=’) ?
str_replace(“=”.$fields_value,”=”.urlencode($addonfields_items[$i]),$filterarr)
:
$filterarr.’&’.$ctag->GetName().’=’.urlencode($addonfields_items[$i]);
$dede_addonfields .= ‘<option
value=”‘.$href.'”‘.($fields_value==urlencode($addonfields_items[$i])
? ‘ selected=”selected”‘ :
”).’>’.$addonfields_items[$i].'</option> ‘; }
$dede_addonfields .= ‘</select><br/> ‘; break; } } } } echo
$dede_addonfields; }

2.联动筛选单选功能

 

    extend.func.php文件中在最后添加如下代码

  (1.)需要修改两个文件

第三个部分’linestyle,linethem,youdays,jgqujian’是要添加筛选功能的字段名,这里有4个字段,注意需要用半角逗号隔开。

修改arc.listview.class.php文件,这文件改动比较大,建议大家直接下载附件压缩包里面的文件替换,如果你之前对这个文件改动过的话,请在下载下来的压缩包里的这个文件里面搜索有“织梦技术研究中心”这些注释的这些地方,都是修改过的,然自己手动将有注释的代码插入到自己的文件里面! 

在禁用后台模板引擎中去掉php标签,具体位置        

 

第二个

发表评论

电子邮件地址不会被公开。 必填项已用*标注