dede独立模型中的联动类型字段是如何在文章页面中显示枚举名的

2021-07-29 0 5,844

dede的联动类型是是通过将字段和系统枚举表dede_sys_enum相关联的,独立模型的表中联动类别字段存储的是表dede_sys_enum的枚举值,这是一个数值,类似于代号的意思,当要显示独立模型的联动类别字段时,首先根据这个枚举值在dede_sys_enum中找出相应枚举名,然后才显示出来。在模版文件中我们不需要知道这个过程是如何进行的,只需按照显示一般字段的方式就能正确显示联动类型了。

这篇文章主要讨论的就是在dede代码中是如何显示联动类型字段的。

不管是在文章页面还是列表页面都能直接使用[field:codecategory/]这样的方式来显示联动类型,这里就以列表页面为例。

显示独立模型的列表是通过/include/arc.sglistview.class.php来完成的,在arc.sglistview.class.php的GetArcList方法中如下代码完成了对独立模型所有字段的特殊处理:


foreach($this->ChannelUnit->ChannelFields as $k=>$arr)
{
if(isset($row[$k]))
{
$row[$k] = $this->ChannelUnit->MakeField($k,$row[$k]);
}
}

没有这段代码独立模型的联动字段就显示的是乱七八糟的数字。ChannelUnit的MakeField的在/include/channelunit.class.php中,用于处理某个字段的值,代码如下:


/**
* 处理某个字段的值
*
* @access public
* @param string $fname 字段名称
* @param string $fvalue 字段值
* @param string $addvalue 增加值
* @return string
*/
function MakeField($fname, $fvalue, $addvalue='')
{
//处理各种数据类型
$ftype = $this->ChannelFields[$fname]['type'];
if($fvalue=='')
{
if($ftype != 'checkbox') $fvalue = $this->ChannelFields[$fname]['default'];
}
if($ftype=='text')
{
$fvalue = HtmlReplace($fvalue);
}
else if($ftype=='textdata')
{
if(!is_file($GLOBALS['cfg_basedir'].$fvalue))
{
return '';
}
$fp = fopen($GLOBALS['cfg_basedir'].$fvalue,'r');
$fvalue = '';
while(!feof($fp))
{
$fvalue .= fgets($fp,1024);
}
fclose($fp);
}
else if($ftype=='addon')
{
$foldvalue = $fvalue;
$tmptext = GetSysTemplets("channel_addon.htm");
$fvalue = str_replace('~link~',$foldvalue,$tmptext);
$fvalue = str_replace('~phpurl~',$GLOBALS['cfg_phpurl'],$fvalue);
}
else if(file_exists(DEDEINC.'/taglib/channel/'.$ftype.'.lib.php'))
{ echo "$fname-";
echo "$fvalue $ftype<br>";
include_once(DEDEINC.'/taglib/channel/'.$ftype.'.lib.php');
$func = 'ch_'.$ftype;
echo "$func";
$fvalue = $func($fvalue,$addvalue,$this,$fname);
}
return $fvalue;
}

其中,上面的不同case值处理不同字段类型,联动类型在最后一个case中,他引入了\include\taglib\channel\stepselect.lib.php文件(因为联动类型的$ftype值为stepselect),然后最终的代码进入stepselect.lib.php的ch_stepselect方法中。


<?php
if(!defined('DEDEINC')) exit("Request Error!");
function ch_stepselect($fvalue,&$arcTag,&$refObj,$fname='')
{
return GetEnumsValue2($fname,$fvalue);
}
/**
* 获取二级枚举的值
*
* @version $Id: stepselect.lib.php 16:24 2010年7月26日Z tianya $
* @package DedeCMS.Taglib
* @copyright Copyright (c) 2007 - 2010, DesDev, Inc.
* @license http://help.dedecms.com/usersguide/license.html
* @link http://www.dedecms.com
*/
function GetEnumsValue2($egroup,$evalue=0)
{
if( !isset($GLOBALS['em_'.$egroup.'s']) )
{
$cachefile = DEDEDATA.'/enums/'.$egroup.'.php';
if(!file_exists($cachefile))
{
require_once(DEDEINC.'/enums.func.php');
WriteEnumsCache();
}
if(!file_exists($cachefile))
{
return '';
}
else
{
require_once($cachefile);
}
}
if($evalue>=500)
{
if($evalue % 500 == 0)
{
return (isset($GLOBALS['em_'.$egroup.'s'][$evalue]) ? $GLOBALS['em_'.$egroup.'s'][$evalue] : '');
}
else if (preg_match("#([0-9]{1,})\.([0-9]{1,})#", $evalue, $matchs))
{
$esonvalue = $matchs[1];
$etopvalue = $esonvalue - ($esonvalue % 500);
$esecvalue = $evalue;
$GLOBALS['em_'.$egroup.'s'][$etopvalue] = empty($GLOBALS['em_'.$egroup.'s'][$etopvalue])? ''
: $GLOBALS['em_'.$egroup.'s'][$etopvalue];
$GLOBALS['em_'.$egroup.'s'][$esonvalue] = empty($GLOBALS['em_'.$egroup.'s'][$esonvalue])? ''
: $GLOBALS['em_'.$egroup.'s'][$esonvalue];
$GLOBALS['em_'.$egroup.'s'][$esecvalue] = empty($GLOBALS['em_'.$egroup.'s'][$esecvalue])? ''
: $GLOBALS['em_'.$egroup.'s'][$esecvalue];
return $GLOBALS['em_'.$egroup.'s'][$etopvalue].' -- '.$GLOBALS['em_'.$egroup.'s'][$esonvalue].' -- '.$GLOBALS['em_'.$egroup.'s'][$esecvalue];
}
else
{
$elimit = $evalue % 500;
$erevalue = $evalue - $elimit;
$GLOBALS['em_'.$egroup.'s'][$erevalue] = empty($GLOBALS['em_'.$egroup.'s'][$erevalue])? ''
: $GLOBALS['em_'.$egroup.'s'][$erevalue];
$GLOBALS['em_'.$egroup.'s'][$evalue] = empty($GLOBALS['em_'.$egroup.'s'][$evalue])? ''
: $GLOBALS['em_'.$egroup.'s'][$evalue];
return $GLOBALS['em_'.$egroup.'s'][$erevalue].' -- '.$GLOBALS['em_'.$egroup.'s'][$evalue];
}
}
}

其实我并没有去研究ch_stepselect方法以及其调用的GetEnumsValue2方法,因为这里的关键是arc.sglistview.class.php的GetArcList方法中的那段代码。

收藏 (0) 打赏

您的支持是我们前进最大的动力!

打开微信扫一扫,即可进行扫码打赏哦
点赞 (0)

本站声明: 根据2013年1月30日《计算机软件保护条例》2次修订第17条规定:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬,鉴于此,也希望大家遵守相关法律法规使用、研究软件。 1、本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解。 2、下载用户仅供学习交流,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担。 3、站内资源均来源于网络公开发表文件或网友投稿发布,如侵犯您的权益,请联系管理员处理。 4、本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用,如有链接无法下载、失效或广告,请联系客服处理。 5、所有资源均收集于互联网仅供学习、参考和研究,请理解这个概念,所以不能保证每个细节都符合你的需求,也可能存在未知的BUG与瑕疵,因本站资源均为可复制品,所 以不支持任何理由的退款兑现,请熟知后再下载。

彤彤模板团 织梦CMS教程 dede独立模型中的联动类型字段是如何在文章页面中显示枚举名的 https://www.xiaoyuerqingfen.cn/12170.html

一家有态度的精品资源分享平台

常见问题
  • 模板团承诺演示效果图均和网站95%一样,并且我们的模板和数据都没有留后门,请放心使用。
查看详情
  • 因为模板具有可复制性和可传播性,模板一旦发货,非质量问题,不支持退换;所以务必请您一定看清楚后再购买。
查看详情

相关文章

评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务

  • 0 +

    访问总数

  • 0 +

    会员总数

  • 0 +

    资源总数

  • 0 +

    今日发布

  • 0 +

    本周发布

  • 0 +

    运行天数

开通会员,尊享海量资源下载特权