首页 >

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

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

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

这篇文章主要讨论的就是在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
";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方法中。

=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方法中的那段代码。


织梦DedeCMS独立模型中的联动类型字段是如何在文章页面中显示枚举名的
  • 织梦DedeCMS5.7sp问答模块实现游客提问的方法
  • 织梦DedeCMS5.7sp问答模块实现游客提问的方法 | 织梦DedeCMS5.7sp问答模块实现游客提问的方法 ...

    织梦DedeCMS独立模型中的联动类型字段是如何在文章页面中显示枚举名的
  • 织梦DedeCMS去除列表页推荐文章标题加粗标签的方法
  • 织梦DedeCMS去除列表页推荐文章标题加粗标签的方法 | 织梦DedeCMS去除列表页推荐文章标题加粗标签的方法 ...

    织梦DedeCMS独立模型中的联动类型字段是如何在文章页面中显示枚举名的
  • 织梦DedeCMS栏目列表页URL优化
  • 织梦DedeCMS栏目列表页URL优化 | 织梦DedeCMS栏目列表页URL优化 ...