🎨 模板开发指南
emlog可以 方便的更换模板,模板文件位于 content\templates 目录下,每个模板都是一个单独的文件夹,文件夹以模板的英文别名命名。通过应用商店以及后台上传安装的模板都保存在这个目录下。
模板文件及目录说明
文件名 | 说明 |
---|---|
css | 存放模板所需的所有CSS样式文件 |
js | 存放模板所需的所有JS文件 |
images | 存放模板所需 LOGO 等图片资源 |
preview.jpg | 在后台模板选择界面显示的模板预览图,推荐:500x300 jpg格式 |
header.php | 站点头部信息,一般包含页面head信息和顶部标题、导航栏 |
echo_log.php | 文章详情页,展示单篇文章内容 |
log_list.php | 首页,展示文章列表 |
footer.php | 站点底部信息,展示版权信息等 |
page.php | 页面,展示自定义的页面 |
side.php | 侧边栏,如制作单栏模板则该文件不是必须的 |
module.php | 功能模块:最新文章、评论、分类、标签等 |
404.php | 自定义404页面未找到时的报错页面 |
pw.php | 自定义加密文章输入密码页面,没该文件使用系统默认样式 【非必须】 |
user.php | 路由 /user 加载的模板,可用于用户中心等页面【非必须】 |
plugins.php | 模板的系统调用文件,模板启用后,该文件会被系统自动加载。可用于实现类似插件的功能。【非必须】 |
options.php | 模 板设置的配置文件,可以构建更丰富的设置项。【非必须】 |
callback.php | 模板的事件回调函数定义,详见事件回调部分文档【非必须】 |
custom_fields.php | 预设模板自己需要的文章自定义字段【非必须】 |
模板引擎
emlog未采用任何其他第三方的模板引擎,直接使用PHP原生的语法标记来内嵌HTML生成动态页面。这样不但降低了开发者的学习负担,也大大提高了页面加载和渲染效率。
// 嵌入变量
<div><?= $value ?></div>
// 循环
<?php foreach ($abc as $v) :?>
<div><?= $v ?></div>
<?php endforeach;?>
// 判断
<?php if($a == 'abc') :?>
<div>hello</div>
<?php endif;?>
公共代码
禁止直接访问
下面这行代码存在于模板目录下的每个php文件开头,其作用是防止代码所在的php脚本被直接访问执行,务必保留。
if(!defined('EMLOG_ROOT')) {exit('error!');}
或者
defined('EMLOG_ROOT') || exit('access denied!');
引用模板文件
下面这两行代码作用是调用模板文件夹下的 side.php 和 footer.php 的代码到当前文件的当前位置。
require_once View::getView('side');
require_once View::getView('footer');
// View是模板视图控制器,View::getView('文件名','文件后缀')将返回当前模板安装路径下对应的文件。
// getView 函数的第二个参数为缺省参数,在不传入值的情况下,将默认作为.php文件后缀返回文件路径。
文件说明
header.php
站点头部信息,一般包页面head信息和顶部标题、导航栏。
页头信息
开头注释内容是模板的必要信息,该信息会显示在后台模板管理界面,务必完整填写。
/*
Template Name:默认模板
Version:1.0
Template Url:https://www.emlog.net/template/
Description:emlog的默认模板
Author:emlog
Author Url:https://www.emlog.net/author/index/577
*/
其中 Template URL 和 Author URL 请使用官网 emlog.net 的应用链接和作者页,其他非官网链接不会在后台展示超链接。
加载模板文件
require_once View::getView('module'); // 加载模板通用模块.
变量&常量
变量&常量 | 类型 | 说明 |
---|---|---|
$site_title | 变量 | 站点标 题(受后台seo优化设置影响) |
$site_key | 变量 | 站点关键字 |
$site_description | 变量 | 输出站点浏览器描述 (受后台seo优化设置影响) |
$blogname | 变量 | 站点标题 |
$bloginfo | 变量 | 站点副标题 |
BLOG_URL | 常量 | 站点首页的URL,输出形如https://emlog.net/ |
TEMPLATE_URL | 常量 | 模板文件夹的URL,用于加载模板内的css、js及其他内容,输出形如http://emlog.net/blog/content/templates/default/ |
上面的变量、常量都可以通过下面的方式在模板中输出
<?= $page_url ?>
<?= BLOG_URL ?>
footer.php
站点底部信息,展示版权、备案等信息等。
变量&常量
变量、常量 | 类型 | 说明 |
---|---|---|
$icp | 变量 | 后台设置的ICP备案号 |
$footer_info | 变量 | 后台设置的页面底部信息 |
Option::EMLOG_VERSION | 常量 | 当前emlog版本号 |
log_list.php
首页模板,展示文章列表。
变量&方法
变量、常量、方法 | 类型 | 说明 |
---|---|---|
$value['log_cover'] | 变量 | 文章封面图URL |
$value['logid'] | 变量 | 当前文章的id |
$value['log_url'] | 变量 | 文章地址URL |
$value['log_title'] | 变量 | 文章标题 |
date('Y-n-j', $value['date']) | 变量 | 文章发布时间,参数'Y-n-j G:i l'用于定义日期格式 |
$value['log_description'] | 变量 | 文章摘要 (没有摘要则输出全文) |
$value['comnum'] | 变量 | 当前文章的评论数 |
$value['views'] | 变量 | 当前文章的浏览量 |
$value['fields'] | 变量 | 自定义字段,数组类型,读取方式见下方示例 |
editflg($value['logid'],$value['author']) | 变量 | 当管理员或作者登陆时显示“编辑”链接 |
topflg($value['top']) | 变量 | 显示置顶标记,该函数位于模板module.php内 |
$page_url | 变量 | 显示当前列表页的翻页功能 |
blog_sort($value['logid']) | 方法 | 展示文章所属的分类 |
blog_author($value['author']) | 方法 | 展示文章的作者 |
blog_tag($value['logid']) | 方法 | 展示文章的标签 |
上面的变量、方法都可以通过下面的方式在模板中输出
<?= $value['logid'] ?>
<?= blog_author($value['author']) ?>
// 读取自定义字段,其中索引 abcd 即为自定义字段名称
if (isset($value['fields']['abcd'])) {
echo $value['fields']['abcd']; // 输出自定义字段名为 abcd 的值
}
echo_log.php
文章详情页模板,展示单篇文章内容。
变量&方法
变量、常量、方法 | 类型 | 说明 |
---|---|---|
$logid | 变量 | 当前文章的id |
$log_title | 变量 | 文章标题 |
$log_cover | 变量 | 封面图URL |
date('Y-n-j', $date) | 变量 | 发布时间,参数'Y-n-j G:i l'用于定义日期格式 |
$log_content | 变量 | 文章正文 |
$excerpt | 变量 | 文章摘要 |
$comnum | 变量 | 当前文章的评论数 |
$views | 变量 | 当前文章的浏览量 |
$fields | 变量 | 自定义字段,数组类型,读取方式见下方示例 |
$page_url | 变量 | 显示当前列表页的翻页功能 |
topflg($top) | 方法 | 显示置顶标记 |
blog_tag($logid) | 方法 | 标签 |
blog_author($author) | 方法 | 作者 |
blog_sort($logid) | 方法 | 所属的分类 |
editflg($logid,$author) | 方法 | 当管理员或作者登录时显示“编辑”链接。 |
neighbor_log($neighborLog) | 方法 | 邻近文章,就是上一篇、下一篇。 |
blog_comments($comments) | 方法 | 评论列表 |
blog_comments_post($logid,$ckname,$ckmail,$ckurl,$verifyCode,$allow_remark) | 方法 | 发表评论框 |
// 在模板中输出标题
<?= $log_title ?>
// 读取自定义字段,其中索引 abcd 即为自定义字段名称
if (isset($fields['abcd'])) {
echo $fields['abcd']; // 输出自定义字段名为 abcd 的值
}
page.php
页面,展示自定义的页面。变量定义等和echo_log.php相同。
side.php
侧边栏,主要负责根据后台widgets设置信息输出侧边栏内容。建议该文件内代码保持不变。
module.php
模板公共代码,包含侧边widgets、评论、引用、编辑等。
该文件由若干函数组成,被模板文件调用,可在内自定义函数实现更多功能。
如在自定义函数内调用emlog缓存时,假设读取user缓存信息,则形如: global $CACHE; $user_cache = $CACHE→readCache('user');
如需要操作数据库,则形如: $DB = MySql::getInstance(); $res = $DB→query($sql);
404.php
用于自定义404页面的模 板。
pw.php
用于自定义加密文章输入密码页面,如果没有该模板文件,将使用系统默认样式,不影响输入密码功能正常使用,模板内容请参考默认模板。
user.php
用户中心模板,可用于主题构建自己的用户中心。用户中心URL路由规则如下,其中 xxx 为自定义的路由名称,比如:/user/profile 或 /?uc=profile 等,如果该模板文件不存在,访问会提示404
- 路由规则1(需要开启伪静态): /user/xxx
- 路由规则2: /?uc=xxx
示例如下:
<?php
/**
* 前台用户中心
*/
defined('EMLOG_ROOT') || exit('access denied!');
// 判断是否登录
if (ISLOGIN) {
//do something
}
// 获取当前登录用户信息
$avatar = $userData['photo']
$name = $userData['nickname']
$bio = $userData['description']
$email = $userData['email']
// 获取当前路由路径
// 变量 $routerPath 存储了当前请求的路由路径,如:/user/profile,$routerPath 值为 profile
// 引入头部模板文件(可根据路由判断是否引入)
if (in_array($routerPath, ['', 'order', 'account', 'profile', 'weiyu'])) {
include View::getView('header');
}
// 实现路由对应功能
if ($routerPath === 'profile') {
include View::getView('user_xxxx') //可加 载其他模板文件
} elseif ($routerPath === 'weiyu') {
// 展示微语页
} elseif ($routerPath === 'order_calback') {
// 处理支付回调逻辑
} else {
show_404_page();
}
// 引入底部模板文件
include View::getView('footer')
custom_fields.php
预设模板自己需要的文章自定义字段,在后台文章编辑页面添加自定义字段支持下拉选择这些预设字段。配置内容参考如下:
<?php
/**
* 模板预设的文章自定义字段
*/
defined('EMLOG_ROOT') || exit('access denied!');
$custom_fields = [
'price' => [
'type' => 'text',
'name' => '价格',
'description' => '如:9.99',
'default' => ''
],
'need_vip' => [
'type' => 'radio',
'name' => '是否需要会员',
'values' => [
'0' => '否',
'1' => '是'
],
'description' => '1是,0否',
'default' => '0'
],
];
plugins.php
模板的系统调用文件,模板启用后,该文件会被系统自动加载。可用于实现类似插件的功能。
有时候模板也会希望在系统中自定义一些功能,包括在插件的挂载点挂载函数进行功能扩展,该文件就赋予模板这个能力,这样模板就不需要安装额外的配套插件,就可以实现更丰富的功能。
<?php
/**
* 模板的系统调用文件
* 模板启用后,该文件会被系统自动加载。可用于实现类似插件的功能。
*/
if (!defined('EMLOG_ROOT')) {
exit('error!');
}
/* eg:
function sameFunc() {
echo "xxxx";
}
addAction('adm_head', 'sameFunc');
*/
options.php
模板设置的配置文件,见下文 开启模板设置 部分。
自定义模板
文章、分类、页面:支持自定义模板,用户在创建分类、页面以及文章的时候可以选择模板主题支持的自定义模板,从而实现更丰富的页面展示。
自定义模板文件的命名规则
- 分类:文件名以 log_list_ 开头,如:log_list_abc.php
- 文章:文件名以 echo_log_ 开头,如:echo_log_abc.php
- 页面:文件名以 page_ 开头,如:page_abc.php