《Typecho中Widget_Archive解析》中有介紹,Typecho大部分請(qǐng)求的路由,都會(huì)轉(zhuǎn)發(fā)到Widget_Archive中,在execute()函數(shù)中,即大概1357行處,有如下代碼:
/** 初始化皮膚函數(shù) */ $functionsFile = $this->_themeDir . 'functions.php'; if (!$this->_invokeFromOutside && file_exists($functionsFile)) { require_once $functionsFile; if (function_exists('themeInit')) { themeInit($this); } }
可見,在Widget_Archive加載目標(biāo)模板文件前,會(huì)先加載模板目錄下的functions.php文件,并嘗試執(zhí)行其中的themeInit函數(shù),$this作為參數(shù)。
文件中可定義的特殊函數(shù)
上文提及了themeInit函數(shù),會(huì)在所有模板文件被執(zhí)行前執(zhí)行,及可以認(rèn)為是模板代碼中第一個(gè)被執(zhí)行的函數(shù)。類似的特殊函數(shù)還有:
* themeInit
* themeConfig
* themeConfigHandle
* themeFields
* threadedComments
* singlePing
* treeViewCategories
themeInit函數(shù)
themeInit函數(shù)會(huì)在所有模板文件前加載,一般用于配置Typecho行為,譬如修改默認(rèn)pageSize為20等。
function themeInit($archive) { if ($archive->is('index')) { $archive->parameter->pageSize = 20; // 自定義條數(shù) } }
其作用就是,主頁中每頁顯示文章數(shù)由默認(rèn)值改成20.
themeConfig函數(shù)
此函數(shù)用于生成模板在后臺(tái)的配置選項(xiàng)。譬如如下函數(shù),將生成如圖的配置頁面。
function themeConfig($form) { $logoUrl = new Typecho_Widget_Helper_Form_Element_Text('logoUrl', NULL, NULL, _t('站點(diǎn)LOGO地址'), _t('在這里填入一個(gè)圖片URL地址, 以在網(wǎng)站標(biāo)題前加上一個(gè)LOGO')); $form->addInput($logoUrl); $sidebarBlock = new Typecho_Widget_Helper_Form_Element_Checkbox('sidebarBlock', array('ShowRecentPosts' => _t('顯示最新文章'), 'ShowRecentComments' => _t('顯示最近回復(fù)'), 'ShowCategory' => _t('顯示分類'), 'ShowArchive' => _t('顯示歸檔'), 'ShowOther' => _t('顯示其它雜項(xiàng)')), array('ShowRecentPosts', 'ShowRecentComments', 'ShowCategory', 'ShowArchive', 'ShowOther'), _t('側(cè)邊欄顯示')); $form->addInput($sidebarBlock->multiMode()); }
以上代碼的效果:
themeConfigHandle函數(shù)
還沒有搞明白怎么用,歡迎大俠補(bǔ)充哈
themeFields函數(shù)
作用類似themeConfig吧,這個(gè)也沒有仔細(xì)研究過。
threadedComments函數(shù)
此函數(shù)用于配置評(píng)論輸出。譬如:
function threadedComments($comments, $options) { echo '自定義內(nèi)容1'; $comments->content(); echo '自定義內(nèi)容2'; }
那么<?php $comments->listComments(); ?>將輸出:
<ol> <li>自定義內(nèi)容1 評(píng)論內(nèi)容 自定義內(nèi)容2</li> <li>自定義內(nèi)容1 評(píng)論內(nèi)容 自定義內(nèi)容2</li> ... </ol>
singlePing函數(shù)
//這個(gè)也沒有研究出是干什么的哈
treeViewCategories函數(shù)
此函數(shù)用于修改分類的輸出樣式。具體怎么使用,我研究下再補(bǔ)充上來哈。
文件還可以定義自定義函數(shù)
另外,由于functions.php在模板最前面加載,因此這里可以定義自己的函數(shù),并在模板中使用。
舉例,最常用的菜單高亮功能中,我們可以在functions.php中定義一個(gè)函數(shù)判斷是否應(yīng)該高亮當(dāng)前菜單:
function active_current_menu($archive,$expected,$active_class='active'){ if($expected == 'index' && $archive.is('index')){ echo $active_class; }else if($archive.is('archive') && $archive.getArchiveSlug() == $expected){ echo $active_class; }else{ echo ''; } }
那么在模板文件中,可以這樣使用:
<ul class='site-nav'> <li class='<?php active_current_menu($this,'index','active') ?>'><a href="/index.php">首頁</a></li> <li class='<?php active_current_menu($this,'theme','active') ?>'><a href="/index.php/category/theme">模板</a></li> <li class='<?php active_current_menu($this,'plugin','active') ?>'><a href="/index.php/category/plugin">插件</a></li> ... ... </ul>
但要注意,functions.php是在Widget_Archive的execute函數(shù)中require進(jìn)來的,因此functions.php中定義的函數(shù)都不能直接使用$this,即不能直接訪問Widget_Archive內(nèi)部變量。如果需要使用Widget_Archive的內(nèi)容,可以通過函數(shù)參數(shù)的形式傳進(jìn)去,譬如上面的例子。
更多信息請(qǐng)查看IT技術(shù)專欄
2025國考·省考課程試聽報(bào)名