dedecms专题功能剖析--如何解析filed.note标记

之前为智通人才网写专题程序的时候已经发现专题的关键解析代码在specialtopic.lib.php这个文件中.这次有新的功能需求须要完成新的,单独的,不受原专题功能干扰的新型专题类页面.因而自建了一个新的专题模型,频道id为-2 ,而后利用原有的专题增删改文件创见了本身的专题增删改功能.一切彷佛都很顺利.....php

 

 
ohye ..测试新建一个自定义专题...模板调用专题节点,{dede:field.note/}..前台浏览页面,.傻眼了.........直接把filed.note解析成普通字段了。
凭经验可知,这个字段在解析的时候没有调用到specialtopic.lib.php这个文件,而是使用普通文章模型去解析了。难题来了。。。。

 
咱们知道dedecms中是没有单独的专题标签的,专题的解析最终仍是使用arclist标签。那么到底{dede:field.note/}在何时解析到specialtopic.lib.php文件的呢?因而乎,分析源代码:arc.archives.class.php,channelunit.class.php,几乎把include下的文件全看了一边。一天过去,毫无进展。。。。。。。。
次日,继续奋斗,实在没办法,逐个代码段分析.从view.php到dedetag.class.最重要的是要发现,模板解析到底从那里解析到specialtopic.lib.php文件的.
度娘,谷歌都没用,最后在arc.archives.class.php找出一点苗头来.此文件内有这么一串代码:
if(is_object($cobj))
{
foreach($this->dtp->CTags as $ctag)
{
if($ctag->GetTagName()=='field' && $ctag->GetAtt('name')==$k)
{
//带标识的专题节点
if($ctag->GetAtt('noteid') != '') {
$this->Fields[$k.'_'.$ctag->GetAtt('noteid')] = $this->ChannelUnit->MakeField($k, $row[$k], $ctag);
}
//其它字段
else {
$this->Fields[$nk] = $this->ChannelUnit->MakeField($k, $row[$k], $ctag);

 
}
}
}
从这里来看,应该是在解析tag名称的时候根据某属性跳到specialtopic.lib.php文件的.因而进入ChannelUni.class.php找到MakeField函数,
终于发现这么一串关键代码:
else if(file_exists(DEDEINC.'/taglib/channel/'.$ftype.'.lib.php'))
{
include_once(DEDEINC.'/taglib/channel/'.$ftype.'.lib.php');
$func = 'ch_'.$ftype;
$fvalue = $func($fvalue,$addvalue,$this,$fname);
}
return $fvalue;
原来这个函数根据$ftype来判断调用specialtopic.lib.php文件...而这个$ftype貌似是字段类型.因而查看数据库note字段的类型,终于真相大白:
原数据库专题附加表addonspec中的note字段类型是一个特殊类型,这个在数据库设计界面或者内容模型字段添加那里是找不到的,这个字段类型就是:
<field:note type="specialtopic" isnull="true" default="" rename=""/>
 
没指定 note 系统专用类型 固化字段 禁止修改
却原来.弄了类型为specialtopic的专用类型出来....
而我新增模型中的字段类型是text..
剩下的就简单了,直接复制原版专题字段编辑区( 模型字段配置(文本模式))到自定义字段区保存成专用类型便可.