之前爲智通人才網寫專題程序的時候已經發現專題的關鍵解析代碼在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..
剩下的就簡單了,直接複製原版專題字段編輯區(
模型字段配置(文本模式))到自定義字段區保存成專用類型便可.