Typecho中的皮膚函數functions.php

很抱歉,最近很忙,沒有時間上來更新內容哈。
上篇文章《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());
}

以上代碼的效果:
模板配置.pngspa

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的內容,能夠經過函數參數的形式傳進去,譬如上面的例子。

相關文章
相關標籤/搜索