Home > Backend Development > PHP Tutorial > Typecho中的皮肤函数functions.php

Typecho中的皮肤函数functions.php

WBOY
Release: 2016-06-23 13:36:53
Original
2205 people have browsed it

很抱歉,最近很忙,没有时间上来更新内容哈。
上篇文章《Typecho主题制作文件结构》介绍了制作Typecho主题所需要的模板文件,其中有一个特殊的文件,叫“皮肤函数”,文件名为functions.php,。本文将详细介绍此文件的作用。

文件在何时被加载

《Typecho中Widget_Archive解析》中有介绍,Typecho大部分请求的路由,都会转发到Widget_Archive中,在execute()函数中,即大概1357行处,有如下代码:

    /** 初始化皮肤函数 */    $functionsFile = $this->_themeDir . 'functions.php';    if (!$this->_invokeFromOutside && file_exists($functionsFile)) {        require_once $functionsFile;        if (function_exists('themeInit')) {            themeInit($this);        }    }
Copy after login

可见,在Widget_Archive加载目标模板文件前,会先加载模板目录下的functions.php文件,并尝试执行其中的themeInit函数,$this作为参数。

文件中可定义的特殊函数

上文提及了themeInit函数,会在所有模板文件被执行前执行,及可以认为是模板代码中第一个被执行的函数。类似的特殊函数还有:
* themeInit
* themeConfig
* themeConfigHandle
* themeFields
* threadedComments
* singlePing
* treeViewCategories

themeInit函数
themeInit函数会在所有模板文件前加载,一般用于配置Typecho行为,譬如修改默认pageSize为20等。

function themeInit($archive) {    if ($archive->is('index')) {        $archive->parameter->pageSize = 20; // 自定义条数    }}
Copy after login

其作用就是,主页中每页显示文章数由默认值改成20.

themeConfig函数
此函数用于生成模板在后台的配置选项。譬如如下函数,将生成如图的配置页面。

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());}
Copy after login

以上代码的效果:

themeConfigHandle函数
还没有搞明白怎么用,欢迎大侠补充哈

themeFields函数
作用类似themeConfig吧,这个也没有仔细研究过。

threadedComments函数
此函数用于配置评论输出。譬如:

function threadedComments($comments, $options) {    echo '自定义内容1';    $comments->content();    echo '自定义内容2';}
Copy after login

那么listComments(); ?>将输出:

<ol><li>自定义内容1 评论内容 自定义内容2</li><li>自定义内容1 评论内容 自定义内容2</li>...</ol>
Copy after login

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 '';    }}
Copy after login

那么在模板文件中,可以这样使用:

<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>
Copy after login

但要注意,functions.php是在Widget_Archive的execute函数中require进来的,因此functions.php中定义的函数都不能直接使用$this,即不能直接访问Widget_Archive内部变量。如果需要使用Widget_Archive的内容,可以通过函数参数的形式传进去,譬如上面的例子。

  • 文章转载自:www.typechodev.com
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template