【DEDE栏目】dedecms内容模型管理—联动类别的使用、调用及修改方法
DEDE织梦cms常用的参数标签汇总、以及操作过程中的一些bug问题解决方法,dede网站二开,以下龙腾飞网络科技-小吴在建站实操中笔记记录,织梦dede建站教程保存使用非常方便:
【DEDE建站教程】
dedecms内容模型管理—联动类别的使用、调用及修改方法
联动类别使用的地方还是比较多的
解决方法一:dedecms内容模型管理—联动类别的使用
后台 - 核心 - 频道模型 - 联动类别管理
联动类别其定义如下:
系统一种特殊的枚举数据类别,可以有系统内置或由用户管理。系统内置的枚举用户是不可以删除的,但可以对这些数据进行添加子分类及修改。到这里可能一些用户还是不了解什么是联动类型,下面我们举几个简单的例子。
一个最简单的联动类型是只有一级选择的类型,比如说系统内置的星座、教育程度、血型,这种类型你可以点击进去查看,其结构很简单,例如星座(star):
在这个联动类别中级数为“一级选择”,就是在这个星座类别下面只有一列品级数据进行选择,我们点击进去可以查看到以下内容:
需要用户选择星座,就可以通过一个下拉框进行选择:
当然,上面说到的是最简单的联动类别,只有一级联动,这种一级联动就可以好比是一个下拉框,用户在选择具体数据的时候只要通过下拉框这种形式就可以对数据进行选择。但是我们在很多联动数据中遇到不少需要二级联动的类型,例如我们在资料设置中选择“所在城市”这个类别,如
这种数据类型就属于需要选择2次分类,首先选择上海市,然后列出上海市拥有的地区,然后再进行第二次选择,这就是一个二级联动的类别
接下来我们要应用这个联动类型,我们在新创建的模型中添加字段,在字段添加的页面中添加相应的字段名称,选择数据类型为联动类型,如下图所示:
在我们发布图书内容的时候,就会发现有一个选择是图书特征的内容类型选择,不过个人建议如果设计一级联动选择,最好还是使用“option下拉框”这个数据类型。
使用同样的字段设置方法也可以添加其他二级联动的字段,这个我们可以查看“分类信息”这个模型里面的联动类型数据。
当然我们在系统的自定义表单中也可以使用这个联动类型,使用的方法和模型管理里面添加字段是一样的,这里就不再重复了。
当然,在二次开发中也会遇到在一些页面调用这些枚举的列表,可以查看 /include/enums.func.php 第61行 GetEnumsForm这个函数,具体的使用可以参考下会员中心编辑用户信息这个页面文件的方法,具体文件为/member/templets/edit_info_person.htm。
解决方法二:dede织梦网站新建模型中自定义联动类别调用及修改方法
一、后台调整
后台的“联动类别管理”里新增“类别组”,“类别 名”填中文,“缓存组名”填英文字母。
在“分类名称”后面增加分类
然后在“内容模型管理”里点“分类信息”,在点“字段管理”,点“添加新字段”。“表单提示文字”填中文,“字段名称”填英文字母
在分类信息里添加文字的时候就有对应的选择了。
二、前台显示——后台文件
先修改 include\taglib\infolink.lib.php 文件
1、搜索
代码语言:javascript代码运行次数:0运行复制require_once(DEDEDATA.'/enums/infotype.php');
下面添加
代码语言:javascript代码运行次数:0运行复制require_once(DEDEROOT.'/data/enums/自定义联动类别字段名.php');
修改
代码语言:javascript代码运行次数:0运行复制function lib_infolink(&$ctag,&$refObj)
{
global $dsql,$nativeplace,$infotype,$自定义联动类别字段名,$hasSetEnumJs,$cfg_cmspath,$cfg_mainsite;
global $em_nativeplaces,$em_infotypes,$em_自定义联动类别字段名s; //看清楚,这里后面的个s
}
2、搜索
代码语言:javascript代码运行次数:0运行复制$fields = array('nativeplace'=>'','infotype'=>''
修改
代码语言:javascript代码运行次数:0运行复制$fields = array('nativeplace'=>'','infotype'=>'','自定义联动类别字段名'=>'','typeid'=>$typeid,
'channelid'=>$channelid,'linkallplace'=>'','linkalltype'=>'','linkall自定义联动类别字段名'=>'');
$fields['nativeplace'] = $fields['infotype'] = $fields['自定义联动类别字段名'] = '';
3、搜索
代码语言:javascript代码运行次数:0运行复制$fields['linkalltype'] =
在下面添加
代码语言:javascript代码运行次数:0运行复制$fields['linkall自定义联动类别字段名'] = "<a href='{$baseurl}plus/list.php?channelid={$channelid}&tid={$typeid}&自定义联动类别字段名={$自定义联动类别字段名}'>不限</a>";
4、搜索
代码语言:javascript代码运行次数:0运行复制if(is_array($ctp->CTags))
在这句上面添加
代码语言:javascript代码运行次数:0运行复制//自定义联动类别字段链接
if(empty($自定义联动类别字段名))
{
foreach($em_自定义联动类别字段名s as $eid=>$em)
{
if($eid % 500 != 0) continue;
$fields['自定义联动类别字段名'] .= " <a href='{$baseurl}plus/list.php?channelid={$channelid}&tid={$typeid}&自定义联动类别字段名={$eid}&nativeplace={$nativeplace}'>{$em}</a>";
}
}
else
{
$sontype = ( ($自定义联动类别字段名 % 500 != 0) ? $自定义联动类别字段名 : 0 );
$toptype = ( ($自定义联动类别字段名 % 500 == 0) ? $自定义联动类别字段名 : ( $自定义联动类别字段名-($membertype%500) ) );
$fields['自定义联动类别字段名'] = "<a href='{$baseurl}plus/list.php?channelid={$channelid}&tid={$typeid}&自定义联动类别字段名={$toptype}&nativeplace={$nativeplace}'><b>{$em_自定义联动类别字段名s[$toptype]}</b></a> ";
foreach($em_自定义联动类别字段名s as $eid=>$em)
{
if($eid < $toptype+1 || $eid > $toptype+499) continue;
if($eid == $自定义联动类别字段名) {
$fields['自定义联动类别字段名'] .= " <b>{$em}</b>";
}
else {
$fields['自定义联动类别字段名'] .= " <a href='{$baseurl}plus/list.php?channelid={$channelid}&tid={$typeid}&自定义联动类别字段名={$eid}&nativeplace={$nativeplace}'>{$em}</a>";
}
}
}
再修改 plus\list.php 文件
1、搜索
代码语言:javascript代码运行次数:0运行复制$infotype = ( (empty($infotype) || !is_numeric($infotype)) ? 0 : $infotype );
在下面添加一句
代码语言:javascript代码运行次数:0运行复制$自定义联动类别字段名 = ( (empty($自定义联动类别字段名) || !is_numeric($自定义联动类别字段名)) ? 0 : $自定义联动类别字段名 );
2、搜索
代码语言:javascript代码运行次数:0运行复制if(!empty($infotype)) $cArr['infotype'] = $infotype;
在下面添加
代码语言:javascript代码运行次数:0运行复制if(!empty($自定义联动类别字段名)) $cArr['自定义联动类别字段名'] = $自定义联动类别字段名;
再找到include\arc.sglistview.class.php文件
1、搜索
代码语言:javascript代码运行次数:0运行复制if(!empty($this->searchArr['keyword']))
在上面添加
代码语言:javascript代码运行次数:0运行复制//自定义联动类别
if(!empty($this->searchArr['自定义联动类别字段名']))
{
if($this->searchArr['自定义联动类别字段名'] % 500 ==0 )
{
$naddQuery .= " And arc.自定义联动类别字段名 >= '{$this->searchArr['自定义联动类别字段名']}' And arc.自定义联动类别字段名 < '".($this->searchArr['自定义联动类别字段
名']+500)."'";
}
else
{
$naddQuery .= "And arc.自定义联动类别字段名 = '{$this->searchArr['自定义联动类别字段名']}'";
}
}
二、前台显示——前台模板调用
代码语言:javascript代码运行次数:0运行复制[field:linkall自定义联动类别字段名/] [field:自定义联动类别字]
至此,就已经可以正常使用了联动筛选了,但是分页标签会有问题。
解决办法:
修改 /include/arc.sglistview.class.php 文件
1、查找
代码语言:javascript代码运行次数:0运行复制function GetPageListDM
将以下代码
代码语言:javascript代码运行次数:0运行复制global $nativeplace,$infotype,$keyword;
替换为
代码语言:javascript代码运行次数:0运行复制global $nativeplace,$infotype,$自定义联动类别字段名,$keyword;
2、查找
代码语言:javascript代码运行次数:0运行复制if(empty($infotype)) $infotype = 0;
改为
代码语言:javascript代码运行次数:0运行复制if(empty($自定义联动类别字段名)) $自定义联动类别字段名 = 0;
将
代码语言:javascript代码运行次数:0运行复制$geturl = "tid=".$this->TypeID."&TotalResult=".$this->TotalResult."&nativeplace=$nativeplace&infotype=$infotype&keyword=".urlencode($keyword)."&";
改为
代码语言:javascript代码运行次数:0运行复制$geturl = "tid=".$this->TypeID."&TotalResult=".$this->TotalResult."&nativeplace=$nativeplace&infotype=$infotype&自定义联动类别字段名=$自定义联动类别字段名&keyword=".urlencode($keyword)."&";
解决方法三:织梦二级联动设置,织梦如何添加二级联动
一、找到:dede/stepselect_main.php文件将以下替换源文件215-290行的对应代码
代码语言:javascript代码运行次数:0运行复制else if($action=='addenum_save')
{
if(empty($ename) || empty($egroup)) {
Showmsg("类别名称或组名称不能为空!","-1");
exit();
}
if($issign==1 || $topvalue==0)
{
$enames = explode(',', $ename);
foreach($enames as $ename)
{
$arr = $dsql->GetOne("Select * From `dede_sys_enum` where egroup='$egroup' And (evalue mod 500)=0 order by evalue desc ");
if(!is_array($arr)) $disorder = $evalue = ($issign==1 ? 1 : 500);
else $disorder = $evalue = $arr['disorder'] + ($issign==1 ? 1 : 500);
$dsql->ExecuteNoneQuery("Insert into `dede_sys_enum`(`ename`,`evalue`,`egroup`,`disorder`,`issign`)
values('$ename','$evalue','$egroup','$disorder','$issign'); ");
}
WriteEnumsCache($egroup); #p#分页标题#e#
ShowMsg("成功添加枚举分类!".$dsql->GetError(), $ENV_GOBACK_URL);
exit();
}
else
{
$minid = $topvalue;
$maxid = $topvalue + 500;
$enames = explode(',', $ename);
foreach($enames as $ename)
{
$arr = $dsql->GetOne("Select * From `dede_sys_enum` where egroup='$egroup' And evalue>$minid And evalue<$maxid order by evalue desc ");
if(!is_array($arr))
{
$disorder = $evalue = $minid+1;
}
else
{
$disorder = $arr['disorder']+1;
$evalue = $arr['evalue']+1;
}
$dsql->ExecuteNoneQuery("Insert into `dede_sys_enum`(`ename`,`evalue`,`egroup`,`disorder`,`issign`)
values('$ename','$evalue','$egroup','$disorder','$issign'); ");
}
WriteEnumsCache($egroup);
ShowMsg("成功添加枚举分类!", $ENV_GOBACK_URL);
exit();
}
}
二、找到:dede/templets/stepselect_main.htm 文件(原211行)
将
代码语言:javascript代码运行次数:0运行复制if($topvalue % 500 != 0) $arr['issign'] = 2;
替换为:
代码语言:javascript代码运行次数:0运行复制if($topvalue % 500 != 0) $arr['issign'] = 3;
if($topvalue % 500 == 0) $arr['issign'] = 2;
以上这样修改后1,2,3 联动能添加,再4级就不行了。应为这里的标记只判断到3,织梦也最多能添加3级联动。所以足够用了。
解决方法四:DEDECMS分类信息按联动类别筛选的实现方法
本教程只在DedeCMS V5.6上测试过,v5.7sp1的话一般也会通用。
实现方法:
1. 修改 include\taglib\infolink.lib.php 文件,
1、查找:
代码语言:javascript代码运行次数:0运行复制require_once(DEDEROOT.'/data/enums/infotype.php');
在其下面添加:
代码语言:javascript代码运行次数:0运行复制require_once(DEDEROOT.'/data/enums/自定义联动类别字段名.php');
function lib_infolink($ctag,$refObj)
{
global $dsql,$nativeplace,$infotype,$自定义联动类别字段 名,$hasSetEnumJs,$cfg_cmspath,$cfg_mainsite;
global $em_nativeplaces,$em_infotypes,$em_自定义联动类别字段名s; //看清楚,这里后面的个S
$fields = array('nativeplace'=>'','infotype'=>'','自定义联动类别字段名'=> '','typeid'=>$typeid, 'channelid'=>$channelid,'linkallplace'=>'','linkalltype'=> '','linkeall自定义联动类别字段名'=>'');
$fields['nativeplace'] = $fields['infotype'] = $fields['自定义联动类别字段名'] = '';
2、查找:
代码语言:javascript代码运行次数:0运行复制if(is_array($ctp->CTags))
在其下面添加:
代码语言:javascript代码运行次数:0运行复制$fields['linkalltype'] = "<a href='{$baseurl}plus/list.php?channelid={$channelid}&tid={$typeid}& amp;nativeplace={$nativeplace}'>不限</a>";
//下面添加一行
$fields['linkeall自定义联动类别字段名'] = "<a href='{$baseurl}plus/list.php?channelid={$channelid}&tid={$typeid}& amp;nativeplace={$nativeplace}'>不限</a>";
//自定义联动类别字段链接
if(emptyempty($自定义联动类别字段名))
{
foreach($em_自定义联动类别字段名s as $eid=>$em)
{
if($eid % 500 != 0) continue;
$fields['自定义联动类别字段名'] .= " <a href='{$baseurl}plus/list.php?channelid={$channelid}&tid={$typeid}& amp;自定义联动类别字段名={$eid}&nativeplace={$nativeplace}'>{$em}</a& gt;";
}
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2024-12-19,如有侵权请联系 cloudcommunity@tencent 删除数据搜索系统管理模型