很抱歉,最近很忙,沒有時間上來更新內容哈。
上篇文章《Typecho主題製做文件結構》介紹了製做Typecho主題所須要的模板文件,其中有一個特殊的文件,叫「皮膚函數」,文件名爲functions.php,。本文將詳細介紹此文件的做用。php
《Typecho中Widget_Archive解析》中有介紹,Typecho大部分請求的路由,都會轉發到Widget_Archive中,在execute()
函數中,即大概1357行處,有以下代碼:ide
/** 初始化皮膚函數 */ $functionsFile = $this->_themeDir . 'functions.php'; if (!$this->_invokeFromOutside && file_exists($functionsFile)) { require_once $functionsFile; if (function_exists('themeInit')) { themeInit($this); } }
可見,在Widget_Archive加載目標模板文件前,會先加載模板目錄下的functions.php文件,並嘗試執行其中的themeInit
函數,$this做爲參數。函數
上文說起了themeInit
函數,會在全部模板文件被執行前執行,及能夠認爲是模板代碼中第一個被執行的函數。相似的特殊函數還有:
* themeInit
* themeConfig
* themeConfigHandle
* themeFields
* threadedComments
* singlePing
* treeViewCategoriestypecho
themeInit函數
themeInit函數會在全部模板文件前加載,通常用於配置Typecho行爲,譬如修改默認pageSize爲20等。網站
function themeInit($archive) { if ($archive->is('index')) { $archive->parameter->pageSize = 20; // 自定義條數 } }
其做用就是,主頁中每頁顯示文章數由默認值改爲20.ui
themeConfig函數
此函數用於生成模板在後臺的配置選項。譬如以下函數,將生成如圖的配置頁面。this
function themeConfig($form) { $logoUrl = new Typecho_Widget_Helper_Form_Element_Text('logoUrl', NULL, NULL, _t('站點LOGO地址'), _t('在這裏填入一個圖片URL地址, 以在網站標題前加上一個LOGO')); $form->addInput($logoUrl); $sidebarBlock = new Typecho_Widget_Helper_Form_Element_Checkbox('sidebarBlock', array('ShowRecentPosts' => _t('顯示最新文章'), 'ShowRecentComments' => _t('顯示最近回覆'), 'ShowCategory' => _t('顯示分類'), 'ShowArchive' => _t('顯示歸檔'), 'ShowOther' => _t('顯示其它雜項')), array('ShowRecentPosts', 'ShowRecentComments', 'ShowCategory', 'ShowArchive', 'ShowOther'), _t('側邊欄顯示')); $form->addInput($sidebarBlock->multiMode()); }
以上代碼的效果:
spa
themeConfigHandle函數
尚未搞明白怎麼用,歡迎大俠補充哈插件
themeFields函數
做用相似themeConfig
吧,這個也沒有仔細研究過。code
threadedComments函數
此函數用於配置評論輸出。譬如:
function threadedComments($comments, $options) { echo '自定義內容1'; $comments->content(); echo '自定義內容2'; }
那麼<?php $comments->listComments(); ?>
將輸出:
<ol> <li>自定義內容1 評論內容 自定義內容2</li> <li>自定義內容1 評論內容 自定義內容2</li> ... </ol>
singlePing函數
//這個也沒有研究出是幹什麼的哈
treeViewCategories函數
此函數用於修改分類的輸出樣式。具體怎麼使用,我研究下再補充上來哈。
另外,因爲functions.php在模板最前面加載,所以這裏能夠定義本身的函數,並在模板中使用。
舉例,最經常使用的菜單高亮功能中,咱們能夠在functions.php中定義一個函數判斷是否應該高亮當前菜單:
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函數中require進來的,所以functions.php中定義的函數都不能直接使用$this,即不能直接訪問Widget_Archive內部變量。若是須要使用Widget_Archive的內容,能夠經過函數參數的形式傳進去,譬如上面的例子。