标题：emlog模板
emlog模板总纲
emlog的模板一般包括如下文件：
images文件夹：存放模板所需图片。
echo_log.php：显示日志内容。
footer.php：页面底部。
header.php：页面头部。
log_list.php：显示日志列表内容。
main.css：模板的css文件。
module.php：模板公共代码，包含侧边widgets、评论、引用、编辑等。
page.php：自定义的页面内容的模板。
preview.jpg：在后台模板选择界面显示的模板预览图，300X225 jpg格式。
side.php：模板侧边栏文件，如制作单栏模板则该文件不是必须的。
t.php：显示emlog系统自带的微博（碎语）内容。
下面我们一个个分析文件内容：
header.php开头注释内容是模板信息，该信息显示在模板选择界面
Template Name:模板名称
Description:模板介绍描述
Author:模板作者
Author Url:作者或模板发布的URL
Sidebar Amount:标记该模板有几个侧边栏，一般为1，有些模板有两个侧边栏则标记2。这样可以在后台widgets里识别管理（具体可下载体验官方收录的模板G7）。
之后是具体代码部分：
if(!defined('EMLOG_ROOT')) {exit('error!');} 
该行代码同样存在于其它模板文件中，为防止该文件被直接执行。
require_once View::getView('module');
加载模板公共代码，需要注意的是加粗部分与3.x有变化，模板升级的同学需要注意一下。
$blogtitle：标题
$site_key：关键字（4.0的关键字可以输出日志的标签了）
$description：输出博客设置的摘要
BLOG_URL：博客首页的URL，输出形如http://域名/blog/
TEMPLATE_URL：模板文件夹的URL，用于加载模板内的css、js及其他内容，输出形如http://域名 /blog/content/templates/simue-tuso/
BLOG_URL.Option::get('topimg')：这句可以无视，因为只默认模板可以自定义banner，其它模板没这功能（卡片语：很没营养的设定，嗯。）
<?php echo $curpage == CURPAGE_HOME ? 'current' : 'common';?> 判断当前是否首页，是则给导航加current类，用于表现当前位置。
<?php if($istwitter == 'y'):?>.......<?php endif;?> 如后台设置在前台显示碎语，则输出.......中的内容。
<?php echo $curpage == CURPAGE_TW ? 'current' : 'common';?> 判断当前URL是否为碎语并选择加类名。
<?php foreach ($navibar as $key => $val):?>.......<?php endforeach;?> 输出自定义页面的链接
<?php doAction('navbar', '<li class="common">', '</li>'); ?> 导航挂载点加入，第2、3参数分别为包裹导航链接的开始和结束部分，可根据模板自定义。
<?php if(ROLE == 'admin' || ROLE == 'writer'): ?>......<?php endif; ?> 如管理员或作者登录则显示.......中的内容。
footer.phpOption::EMLOG_VERSION：获得版本号。
$icp：获得后台设置的ICP备案号。
<?php doAction('index_footer'); ?> 页脚底部挂载点加入。
log_list.php<?php doAction('index_loglist_top'); ?> 页脚底部挂载点加入。
$value['logid'] 该变量为当前日志的id
<?php topflg($value['top']); ?> 显示置顶标记，该函数位于模板module.php内。
<?php echo $value['log_url']; ?> 输出日志URL
<?php echo $value['log_title']; ?> 输出日志标题
<?php blog_author($value['author']); ?> 输出日志的作者，该函数位于模板module.php内。
<?php echo gmdate('Y-n-j G:i l', $value['date']); ?> 输出日志发布时间，参数'Y-n-j G:i l'用于定义日期格式。
<?php blog_sort($value['logid']); ?> 输出日志所属的分类，该函数位于模板module.php内。
<?php editflg($value['logid'],$value['author']); ?> 当管理员或作者登陆时显示“编辑”链接，该函数位于模板module.php内。
<?php echo $value['log_description']; ?> 输出日志摘要（没有摘要则输出全文）。
<?php blog_att($value['logid']); ?> 如日志有附件则输出附件，该函数位于模板module.php内。
<?php blog_tag($value['logid']); ?> 输出日志的标签，该函数位于模板module.php内。
<?php echo $value['comnum']; ?> 输出当前日志的评论数
<?php echo $value['tbcount']; ?> 输出当前日志的引用量
<?php echo $value['views']; ?> 输出当前日志的浏览量
<?php echo $page_url;?> 显示当前列表页的翻页功能。
<?php
include View::getView('side');
include View::getView('footer');
?> 加入侧边栏及加入页脚。
echo_log.php该文件功能函数与列表页一致，但参数有区别，注意区分。
$logid 该变量为当前日志的id
<?php topflg($top); ?> 显示置顶标记，该函数位于模板module.php内。
<?php echo $log_title; ?> 输出日志标题。
<?php blog_author($author); ?> 输出日志的作者，该函数位于模板module.php内。
<?php echo gmdate('Y-n-j G:i l', $date); ?> 输出日志发布时间，参数'Y-n-j G:i l'用于定义日期格式。
<?php blog_sort($logid); ?> 输出日志所属的分类，该函数位于模板module.php内。
<?php editflg($logid,$author); ?> 当管理员或作者登陆时显示“编辑”链接，该函数位于模板module.php内。
<?php echo $log_content; ?> 输出日志全文内容。
<?php blog_att($logid); ?> 如日志有附件则输出附件，该函数位于模板module.php内。
<?php blog_tag($logid); ?> 输出日志的标签，该函数位于模板module.php内。
<?php echo $comnum; ?> 日志页显示评论数
<?php echo $tbcount; ?> 日志页显示引用数
<?php echo $views; ?> 日志页显示浏览量
<?php doAction('log_related', $logData); ?> 相关日志的挂载点，与3.x版本不同，4.0带第二参数。
<?php neighbor_log($neighborLog); ?> 输出邻近，就是上一篇及下一篇，该函数位于模板module.php内。
<?php blog_trackback($tb, $tb_url, $allow_tb); ?> 输出该日志被引用的信息列表，与3.x不同注意区分。
<?php blog_comments($comments); ?> 输出该日志评论列表，与3.x不同注意区分。
<?php blog_comments_post($logid,$ckname,$ckmail,$ckurl,$verifyCode,$allow_remark); ?> 输出发表评论框，与3.x不同注意区分。
page.php该文件写法与echo_log.php类似，不再重复。
t.php与之前相同的内容不再重复。
<?php echo $avatar; ?> 输出头像。
<?php echo $author; ?> 输出作者名。
<?php echo $val['t'];?> 输出碎语内容。
<?php echo DYNAMIC_BLOGURL; ?> 根据当前url输出博客地址，主要用于js，解决跨域问题。
<?php echo $tid;?> 输出碎语所在数据库中的id号。
<?php echo $val['date'];?> 发布碎语的时间。
$reply_code ：其值为‘n’或‘y’，后台设置是否启用碎语回复验证码。
<?php echo $rcode; ?> 输出验证码。
side.php侧边栏，主要负责根据后台widgets设置信息输出侧边栏内容。建议该文件内代码保持不变。
doAction('diff_side'); //侧边栏挂载点。
module.php模板公共代码，包含侧边widgets、评论、引用、编辑等。
该文件由若干函数组成，被博客前台文件调用，可在内自定义函数实现更多功能。
如在自定义函数内调用emlog缓存时，假设读取user缓存信息，则形如：
global $CACHE;
$user_cache = $CACHE->readCache('user');
如需要操作数据库，则形如：
$DB = MySql::getInstance();
$res = $DB->query($sql);
以上两点与3.x不同，请注意区分。
最后附：前台模板部分挂载点一览：
doAction('navbar', '<li class="common">', '</li>'); //头部导航挂载点
doAction('index_footer'); //页脚底部挂载点
doAction('index_loglist_top'); //首页日志列表顶部挂载点
doAction('log_related', $logData); //相关日志挂载点
doAction('diff_side'); //侧边栏挂载点
emlog 模板安装
各个博客系统安装更改主题模板的操作方法都是非常简单的，通常的步骤都是下载模板压缩包、解压出模板目录、上传模板文件到博客系统相关目录位置，然后登陆博客后台进入已安装模板界面，点击相关选项按钮进行切换就可以了。下面博客吧详细介绍下 Emlog 博客系统安装主题模板的操作步骤。  
1. 把下载的emlog博客主题压缩包解压得到主题模板目录。
2. 把解压出来的目录文件上传到content/templates/目录下。
3. 然后博客后台，点击右上角的“换模板”选项进入已安装模板界面。
4. 该页面会列出刚上传的主题模板的缩略图，点击该缩略图表示把该主题设置为博客当前主题。[1]
emlog结构详细介绍
header.php篇<?php
/*
Template Name:默认模板
模板名称
Description:默认模板，简洁优雅 ……
模板简介
Version:1.2
模板版本号
Author:emlog
模板作者名称
Author Url:http://域名
模板作者链接地址
Sidebar Amount:1
边栏数目（一般是0，1或者2。0代表是没有边栏即单栏模板，1代表1个边栏即二栏模板，2代表2个边栏即三栏模板）
ForEmlog:5.0.0
emlog程序版本号
*/
if(!defined('EMLOG_ROOT')) {exit('error!');}
模板文件开头的判断语句。检查是否是函数EMLOG_ROOT的绝对地址，否就显示error。
require_once View::getView('module');
公共模块加载项，加载module，这里面包含了模板必须要的函数。
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www点w3点org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
声明文件，声明了文档的根元素是 html，它在公共标识符被定义为 "-//W3C//DTD XHTML 1.0 Strict//EN" 的 DTD 中进行了定义。浏览器将明白如何寻找匹配此公共标识符的 DTD。如果找不到，浏览器将使用公共标识符后面的 URL 作为寻找 DTD 的位置。
<html xmlns="http:///www点w3点org<cite class="highlight" highlight="true" style="background-image: none; background-position: initial initial; background-repeat: initial initial; "></cite>/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
meta原标记，这里标记了为UTF-8格式
<title><?php echo $site_title; ?></title>
页面的title标记，这里输出的是博客名称。
<meta name="keywords" content="<?php echo $site_key; ?>" />
meta原标记，这里标记的是关键词。输出博客后台设置的关键词。
<meta name="description" content="<?php echo $site_description; ?>" />
meta原标记，这里标记的是网站简介信息。这里输出的是博客后台设置的站点描述。在日志内容页面的时候输出的是日志的摘要。
<meta name="generator" content="emlog" />
meta原标记，这里标记的是系统名称，这里输出的是emlog。
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="<?php echo BLOG_URL; ?>xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="<?php echo BLOG_URL; ?>wlwmanifest.xml" />
这两个元素主要供远程发布使用，比如你使用Windows Live Write等桌面博客编辑器来发布文章。
<link rel="alternate" type="application/rss+xml" title="RSS" href="<?php echo BLOG_URL; ?>rss.php" />
这里是emlog博客的RSS发布地址。
<link href="<?php echo TEMPLATE_URL; ?>main.css" rel="stylesheet" type="text/css" />
CSS加载链接，这里加载的是main.css样式文件。该文件存放在模板文件夹的根目录下。
<script src="<?php echo BLOG_URL; ?>include/lib/js/common_tpl.js" type="text/javascript"></script>
JS文件加载链接，这里加载的是common_tpl.js文件。该文件存放于程序include/lib/js/目录下，这个JS文件主要用于镶套评论。
<?php doAction('index_head'); ?>
页面头部插件挂载钩子。（主要用于插件挂载一些CSS或者JS文件）
</head>
heder头部文件到此结束，上面部分一般是不用修改。在移植模板或者制作模板的时候，样式文件是必须要修改加载的。如果有特效的话，也要在这里加载一些JS文件的。当然也可以在底部加载。
<body>
<div id="wrap">
<div id="header">
<h1><a href="<?php echo BLOG_URL; ?>"><?php echo $blogname; ?></a></h1>
站点名称 站点链接
<h3><?php echo $bloginfo; ?></h3>
输出博客描述，输出的是后台设置的博客描述信息。
</div>
<div id="banner"><a href="<?php echo BLOG_URL; ?>"><img src="<?php echo BLOG_URL.Option::get('topimg'); ?>" height="134" width="960" /></a></div>
这里是页面头部的banner图片，这个只有在默认模板才有。不用理会，直接删除就行。
<div id="nav"><?php blog_navi();?></div>
页面头部导航菜单加函数。该函数位于module.php文件，这个是emlog5.0新增加的与以往版本的区别。
log_list.php篇<?php 
/*
* 首页日志列表部分
*/
if(!defined('EMLOG_ROOT')) {exit('error!');} 
?>
注释文件头，表明是日志列表页面。
模板文件开头的判断语句。检查是否是函数EMLOG_ROOT的绝对地址，否就显示error。
<p id="content">
<p id="contentleft">
<?php doAction('index_loglist_top'); ?>
日志列表页的插件钩子，加载插件所需要的文件。如：em_ad插件，RSS订阅插件等。。。
<?php foreach($logs as $value): ?>
日志列表页面列表循环开始。大体意思是设置变量$logs为$value。
<h2><?php topflg($value['top']); ?>
置顶日志输出函数，该函数位于module.php文件。主要用于置顶日志的显示图标，或者可以更改module.php文件显示【推荐】之类的效果。
<a href="<?php echo $value['log_url']; ?>"><?php echo $value['log_title']; ?></a>
带超链接的日志标题。
</h2>
<p class="date">作者：<?php blog_author($value['author']); ?>
作者名称的输出函数，该函数位于module.php文件。
发布于：<?php echo gmdate('Y-n-j G:i l', $value['date']); ?> 
日志日期的输出函数，该函数位于系统核心。一般不需要改动，如果想显示不同样式的日期格式，可以百度下PHP日期代码。
<?php blog_sort($value['logid']); ?> 
日志分类的输出函数，该函数位于module.php文件
<?php editflg($value['logid'],$value['author']); ?>
日志编辑函数，该函数位于module.php文件。
</p>
<?php echo $value['log_description']; ?>
日志摘要输出变量，该变量位于系统核心。
<p class="tag"><?php blog_tag($value['logid']); ?>
日志标签输出函数，该函数位于module.php文件
</p>
<p class="count">
<a href="<?php echo $value['log_url']; ?>#comments">评论(<?php echo $value['comnum']; ?>)</a>
带评论地址超链接的评论数量。点击该地址可以到该日志的评论列表。
<a href="<?php echo $value['log_url']; ?>#tb">引用(<?php echo $value['tbcount']; ?>)</a>
带引用超链接地址的引用数量。点击该地址可以到引用通告地址显示页面。
<a href="<?php echo $value['log_url']; ?>">浏览(<?php echo $value['views']; ?>)</a>
带日志超链接的浏览数量。点击该地址可以到该日志页面。
</p>
<p style="clear:both;"></p>
<?php endforeach; ?>
日志列表页面的日志列表循环结束。
<p id="pagenavi">
<?php echo $page_url;?>
日志列表分页函数，该函数位于系统核心。
</p>
</p><!-- end #contentleft-->
<?php
include View::getView('side');
加载side.php文件，即加载边栏。（如果是单栏模板不用加载该文件）
include View::getView('footer');
加载footer.php文件，即加载页面底部。（一般显示的是版权，统计代码之类，放在通用底部的代码。）
?>
echo_log.php篇<?php 
/*
* 阅读日志页面
*/
if(!defined('EMLOG_ROOT')) {exit('error!');} 
?>
注释文件头，表明是阅读日志页面。
模板文件开头的判断语句。检查是否是函数EMLOG_ROOT的绝对地址，否就显示error。
<div id="content">
<div id="contentleft">
<h2><?php topflg($top); ?>
置顶日志输出函数，该函数位于module.php文件。主要用于置顶日志的显示图标，或者可以更改module.php文件显示【推荐】之类的效果。（和list_log.php的函数为同一个函数。）
<?php echo $log_title; ?>
日志标题的输出变量。该变量位于系统核心。
</h2>
<p class="date">作者：
<?php blog_author($author); ?>
作者名称的输出函数，该函数位于module.php文件。
发布于：<?php echo gmdate('Y-n-j G:i l', $date); ?>
日志日期的输出函数，该函数位于系统核心。一般不需要改动，如果想显示不同样式的日期格式，可以百度下PHP日期代码。 
<?php blog_sort($logid); ?>
日志分类的输出函数，该函数位于module.php文件
<?php editflg($logid,$author); ?>
日志编辑函数，该函数位于module.php文件。
</p>
<?php echo $log_content; ?>
日志文章内容的输出变量。该变量位于系统核心。
<p class="tag">
<?php blog_tag($logid); ?>
日志标签的输出函数。该函数位于module.php文件。
</p>
<?php doAction('log_related', $logData); ?>
日志阅读内容页面的插件钩子。主要加载插件文件。如：相关日志插件，心情顶踩插件，日志顶踩插件之类。
<div class="nextlog">
<?php neighbor_log($neighborLog); ?>
上一篇 下一篇列表输出函数，该函数位于module.php文件。
</div>
<?php blog_trackback($tb, $tb_url, $allow_tb); ?>
引用通告地址显示函数，该函数位于module.php文件。（注意：请百度下引用通告的意思。这里只要显示引用通告的地址就可以了，不用做超链接的。）
<?php blog_comments($comments); ?>
评论列表输出函数，该函数位于module.php文件，后期舞城会详细介绍。
<?php blog_comments_post($logid,$ckname,$ckmail,$ckurl,$verifyCode,$allow_remark); ?>
评论表单输出函数，该函数位于module.php文件，后期舞城会详细介绍。
<div style="clear:both;"></div>
</div><!--end #contentleft-->
<?php
include View::getView('side');
加载side.php文件，即加载边栏。（如果是单栏模板不用加载该文件）
include View::getView('footer');
加载footer.php文件，即加载页面底部。（一般显示的是版权，统计代码之类，放在通用底部的代码。）
?>
page.php篇<?php 
/*
* 自建页面模板
*/
if(!defined('EMLOG_ROOT')) {exit('error!');} 
?>
<div id="content">
<div id="contentleft">
<h2><?php echo $log_title; ?>
自建页面的标题输出，该变量位于系统核心。
</h2>
<?php echo $log_content; ?>
自建页面的内容输出，该变量位于系统核心。
<?php blog_comments($comments); ?>
评论列表
<?php blog_comments_post($logid,$ckname,$ckmail,$ckurl,$verifyCode,$allow_remark); ?>
评论表单
<div style="clear:both;"></div>
</div><!--end #contentleft-->
<?php
include View::getView('side');
side.php文件加载。即加载边栏。
include View::getView('footer');
footer.php文件加载，即加载通用底部。
?>
side.php 篇<?php 
/*
* 侧边栏
*/
if(!defined('EMLOG_ROOT')) {exit('error!');} 
?>
<ul id="sidebar">
从这里开始
<?php 
$widgets = !empty(
$options_cache['widgets1']) ? unserialize(
$options_cache['widgets1']) : array();
doAction('diff_side');
边栏的插件钩子，主要用于加载插件的文件。
foreach ($widgets as $val)
{
$widget_title = @unserialize($options_cache['widget_title']);
$custom_widget = @unserialize($options_cache['custom_widget']);
if(strpos($val, 'custom_wg_') === 0)
{
$callback = 'widget_custom_text';
if(function_exists($callback))
{
call_user_func(
$callback, htmlspecialchars(
$custom_widget[$val]['title']), 
$custom_widget[$val]['content']);
}
}else{
$callback = 'widget_'.$val;
if(function_exists($callback))
{
preg_match("/^.*\s\((.*)\)/", $widget_title[$val], $matchs);
$wgTitle = isset($matchs[1]) ? $matchs[1] : $widget_title[$val];
call_user_func($callback, htmlspecialchars($wgTitle));
}
}
}
?>
到这里以上的所有代码都不用修改，这些主要是用于加载边栏组件。其函数位于module.php文件。
<div class="rss">
<a href="<?php echo BLOG_URL; ?>rss.php" title="RSS订阅"><img src="<?php echo TEMPLATE_URL; ?>images/rss.gif" alt="订阅Rss"/></a>
含有RSS订阅链接的图片超链接。
</div>
</ul><!--end #siderbar-->
side.php文件基本上是不用动的，如果是单栏模板的话，这个页面就可以删除掉。
footer.php 篇<?php 
/*
* 底部信息
*/
if(!defined('EMLOG_ROOT')) {exit('error!');} 
?>
</div><!--end #content-->
<div style="clear:both;"></div>
<div id="footerbar">
Powered by <a href="http://emlog官网网址" title="emlog <?php echo Option::EMLOG_VERSION;?>">emlog</a>
emlog程序官网超链接，title显示的是emlog版本号。请支持国产开源的emlog程序，保留他们的版权。 
<a href="http://备案信息网网址" target="_blank"><?php echo $icp; ?></a>
带有超链接的备案号。备案号是在后台设置的。
<?php echo $footer_info; ?>
页面底部信息输出变量，可以在后台设置。可以添加统计代码等信息。
<?php doAction('index_footer'); ?>
</div><!--end #footerbar-->
</div><!--end #wrap-->
</body>
</html>
module.php上篇<?php 
/*
* 侧边栏组件、页面模块
*/
if(!defined('EMLOG_ROOT')) {exit('error!');} 
?>
<?php
//widget：blogger
边栏blogger组件 
function widget_blogger($title){
global $CACHE;
$user_cache = $CACHE->readCache('user');
$name = $user_cache[1]['mail'] != '' ? "<a href=\"mailto:".$user_cache[1]['mail']."\">"
.$user_cache[1]['name']."</a>" : $user_cache[1]['name'];?>
读取blogger缓存。 
<li>
<h3><span><?php echo $title; ?></span></h3>
<ul id="bloggerinfo">
<div id="bloggerinfoimg">
<?php if (!empty($user_cache[1]['photo']['src'])): ?> 
如果有用户图片，就显示用户图片。 
<img src="<?php echo BLOG_URL.$user_cache[1]['photo']['src']; ?>" 
width="<?php echo $user_cache[1]['photo']['width']; ?>" 
height="<?php echo $user_cache[1]['photo']['height']; ?>" alt="blogger" /> 
显示用户图片 
<?php endif;?>
</div>
<p><b> 
<?php echo $name; ?> 
输出用户名称 
</b>
<?php echo $user_cache[1]['des']; ?> 
输出用户的个人描述 
</p>
</ul>
</li>
<?php }?>
<?php
//widget：日历 
边栏日历组件 
function widget_calendar($title){ ?>
<li>
<h3><span><?php echo $title; ?></span></h3>
<div id="calendar">
</div> 
这个id="calendar"千万别删除哦。是日历的显示样式。 
<script>sendinfo('<?php echo Calendar::url(); ?>','calendar');</script> 
有文章的日历项链接。 
</li>
<?php }?>
<?php
//widget：标签 
边栏标签组件 
function widget_tag($title){
global $CACHE;
$tag_cache = $CACHE->readCache('tags');?> 
读取标签缓存。 
<li>
<h3><span><?php echo $title; ?></span></h3>
<ul id="blogtags">
<?php foreach($tag_cache as $value): ?>
标签循环开始
<span style="font-size:<?php echo $value['fontsize']; ?>pt; line-height:30px;"> 
标签字体大小样式，根据该标签文章数量来决定大小。 
<a href="<?php echo Url::tag($value['tagurl']); ?>" 
title="<?php echo $value['usenum']; ?> 篇日志"><?php echo $value['tagname']; ?></a>
带超链接的标签。
</span>
<?php endforeach; ?>
标签循环结束
</ul>
</li>
<?php }?>
<?php
//widget：分类
边栏 分类 组件
function widget_sort($title){
global $CACHE;
$sort_cache = $CACHE->readCache('sort'); ?>
读取分类缓存
<li>
<h3><span><?php echo $title; ?></span></h3>
<ul id="blogsort">
<?php foreach($sort_cache as $value): ?>
分类循环开始
<li>
<a href="<?php echo Url::sort($value['sid']); ?>">
<?php echo $value['sortname']; ?>(<?php echo $value['lognum'] ?>)
</a>
带分类超链接的分类名称+该分类日志数量
<a href="<?php echo BLOG_URL; ?>rss.php?sort=<?php echo $value['sid']; ?>">
<img src="<?php echo TEMPLATE_URL; ?>images/rss.png" alt="订阅该分类"/>
</a>
带分类订阅链接的RSS图片（位于该分类的名称后面）
</li>
<?php endforeach; ?>
分类循环结束
</ul>
</li>
<?php }?>
<?php
//widget：最新碎语
边栏 最新碎语 组件
function widget_twitter($title){
global $CACHE; 
$newtws_cache = $CACHE->readCache('newtw');
$istwitter = Option::get('istwitter');
?>
读取最新碎语缓存
<li>
<h3><span><?php echo $title; ?></span></h3>
<ul id="twitter">
<?php foreach($newtws_cache as $value): ?>
最新碎语循环开始
<?php $img = empty($value['img']) ? "" : 
'<a title="查看图片" class="t_img" href="'.BLOG_URL.str_replace('thum-', '', $value['img']).'" target="_blank">&nbsp;</a>';?>
这个是emlog5.0新增加的功能，碎语图片功能。设置变量$img的图片地址。
<li><?php echo $value['t']; ?><?php echo $img;?><p><?php echo smartDate($value['date']); ?></p>
输出碎语（文字+图片） 发布碎语的时间。
</li>
<?php endforeach; ?>
最新碎语循环结束。
<?php if ($istwitter == 'y') :?>
<p><a href="<?php echo BLOG_URL . 't/'; ?>">更多&raquo;</a></p>
<?php endif;?>
判断是否开启碎语，开启的话显示带碎语页面超链接的更多字样。
</ul>
</li>
<?php }?>
<?php
//widget：最新评论
边栏 最新评论 组件
function widget_newcomm($title){
global $CACHE; 
$com_cache = $CACHE->readCache('comment');
?>
读取最新评论缓存
<li>
<h3><span><?php echo $title; ?></span></h3>
<ul id="newcomment">
<?php
foreach($com_cache as $value):
最新评论循环开始
$url = Url::comment($value['gid'], $value['page'], $value['cid']);
设置变量$url为评论的链接地址
?>
<li id="comment"><?php echo $value['name']; ?>
输出评论者的名称
<br />
<a href="<?php echo $url; ?>"><?php echo $value['content']; ?></a>
带评论超链接的评论内容
</li>
<?php endforeach; ?>
最新评论循环结束
</ul>
</li>
<?php }?>
<?php
//widget：最新日志
边栏 最新日志 组件
function widget_newlog($title){
global $CACHE; 
$newLogs_cache = $CACHE->readCache('newlog');
?>
读取最新日志缓存。
<li>
<h3><span><?php echo $title; ?></span></h3>
<ul id="newlog">
<?php foreach($newLogs_cache as $value): ?>
最新日志循环开始
<li>
<a href="<?php echo Url::log($value['gid']); ?>"><?php echo $value['title']; ?></a>
带日志超链接的日志标题
</li>
<?php endforeach; ?>
最新日志循环结束
</ul>
</li>
<?php }?>
<?php
//widget：热门日志
边栏 热门日志 组件
function widget_hotlog($title){
$index_hotlognum = Option::get('index_hotlognum');
$Log_Model = new Log_Model();
$randLogs = $Log_Model->getHotLog($index_hotlognum);?>
读取热门日志设置
<li>
<h3><span><?php echo $title; ?></span></h3>
<ul id="hotlog">
<?php foreach($randLogs as $value): ?>
热门日志循环开始
<li>
<a href="<?php echo Url::log($value['gid']); ?>"><?php echo $value['title']; ?></a>
带日志超链接的日志标题
</li>
<?php endforeach; ?>
热门日志循环结束
</ul>
</li>
<?php }?>
<?php
//widget：随机日志
边栏 随机日志 组件
function widget_random_log($title){
$index_randlognum = Option::get('index_randlognum');
$Log_Model = new Log_Model();
$randLogs = $Log_Model->getRandLog($index_randlognum);?>
读取随机日志设置
<li>
<h3><span><?php echo $title; ?></span></h3>
<ul id="randlog">
<?php foreach($randLogs as $value): ?>
随机日志循环开始
<li>
<a href="<?php echo Url::log($value['gid']); ?>"><?php echo $value['title']; ?></a>
带日志超链接的日志标题
</li>
<?php endforeach; ?>
随机日志循环结束
</ul>
</li>
<?php }?>
<?php
//widget：搜索
边栏 搜索 组件
function widget_search($title){ ?>
<li>
<h3><span><?php echo $title; ?></span></h3>
<ul id="logserch">
<form name="keyform" method="get" action="<?php echo BLOG_URL; ?>index.php">
<input name="keyword" class="search" type="text" />
</form>
from内的name method和action不要更改，搜索功能就不会出错。
</ul>
</li>
<?php } ?>
<?php
//widget：归档
边栏 归档 组件
function widget_archive($title){
global $CACHE; 
$record_cache = $CACHE->readCache('record');
?>
读取归档缓存
<li>
<h3><span><?php echo $title; ?></span></h3>
<ul id="record">
<?php foreach($record_cache as $value): ?>
归档循环开始
<li>
<a href="<?php echo Url::record($value['date']); ?>">
<?php echo $value['record']; ?>(<?php echo $value['lognum']; ?>)
</a>
带归档时间超链接的归档时间
</li>
<?php endforeach; ?>
归档循环结束
</ul>
</li>
<?php } ?>
<?php
//widget：自定义组件
边栏 自定义 组件
function widget_custom_text($title, $content){ ?>
<li>
<h3><span><?php echo $title; ?></span></h3>
<ul>
<?php echo $content; ?>
输出用户设置的自定义代码
</ul>
</li>
<?php } ?>
<?php
//widget：链接
边栏 链接 组件
function widget_link($title){
global $CACHE; 
$link_cache = $CACHE->readCache('link');
?>
读取链接缓存
<li>
<h3><span><?php echo $title; ?></span></h3>
<ul id="link">
<?php foreach($link_cache as $value): ?>
链接循环开始
<li>
<a href="<?php echo $value['url']; ?>" title="<?php echo $value['des']; ?>" target="_blank">
<?php echo $value['link']; ?>
</a>
带链接站点超链接的链接名称
</li>
<?php endforeach; ?>
链接循环结束
</ul>
</li>
<?php }?>
module.php中篇<?php
//blog：导航
页面顶部的导航函数
function blog_navi(){
global $CACHE; 
$navi_cache = $CACHE->readCache('navi');
?>
读取导航缓存
<ul>
<?php 
foreach($navi_cache as $value):
导航循环开始
if($value['url'] == 'admin' && (ROLE == 'admin' || ROLE == 'writer')):
?>
<li class="common"><a href="<?php echo BLOG_URL; ?>admin/write_log.php">写日志</a></li>
<li class="common"><a href="<?php echo BLOG_URL; ?>admin/">管理站点</a></li>
<li class="common"><a href="<?php echo BLOG_URL; ?>admin/?action=logout">退出</a></li>
<?php 
continue;
endif;
判断是否是管理员登陆，是就显示管理员相关功能链接
$newtab = $value['newtab'] == 'y' ? 'target="_blank"' : '';
$value['url'] = $value['isdefault'] == 'y' ? BLOG_URL . $value['url'] : trim($value['url'], '/');
$current_tab = (BLOG_URL . trim(Dispatcher::setPath(), '/') == $value['url']) ? 'current' : 'common';
?>
设置相关变量，不需要改动。$newtab (是否是新窗口打开，后台设置) $value['url'] (导航链接) $current_tab(导航的class类，当前页面的类为current,非当前页的类为common)
<li class="<?php echo $current_tab;?>"><a href="<?php echo $value['url']; ?>" <?php echo $newtab;?>><?php echo $value['naviname']; ?></a></li>
输出带导航地址超链接的导航名称。
<?php endforeach; ?>
导航循环结束。
</ul>
<?php }?>
<?php
//blog：置顶
function topflg($istop){
$topflg = $istop == 'y' ? "<img src=\"".TEMPLATE_URL."/images/import.gif\" title=\"置顶日志\" /> " : '';
echo $topflg;
}
?>
置顶日志函数，主要用于log_list.php echo_log.php文件。
<?php
//blog：编辑
function editflg($logid,$author){
$editflg = ROLE == 'admin' || $author == UID ? '<a href="'.BLOG_URL.'admin/write_log.php?action=edit&gid='.$logid.'">编辑</a>' : '';
echo $editflg;
}
?>
日志编辑函数，主要用于echo_log.php page.php文件，也可以用在log_list.php文件。
<?php
//blog：分类
function blog_sort($blogid){
global $CACHE; 
$log_cache_sort = $CACHE->readCache('logsort');
?>
<?php if(!empty($log_cache_sort[$blogid])): ?>
分类：<a href="<?php echo Url::sort($log_cache_sort[$blogid]['id']); ?>"><?php echo $log_cache_sort[$blogid]['name'];?></a>
<?php endif;?>
<?php }?>
日志分类函数，主要用于echo_log.php文件，也可以用在log_list.php文件。
<?php
//blog：日志标签
function blog_tag($blogid){
global $CACHE;
$log_cache_tags = $CACHE->readCache('logtags');
if (!empty($log_cache_tags[$blogid])){
$tag = '标签:';
foreach ($log_cache_tags[$blogid] as $value){
$tag .= " <a href=\"".Url::tag($value['tagurl'])."\">".$value['tagname'].'</a>';
}
echo $tag;
}
}
?>
日志标签函数，主要用于echo_log.php文件。
<?php
//blog：日志作者
function blog_author($uid){
global $CACHE;
$user_cache = $CACHE->readCache('user');
$author = $user_cache[$uid]['name'];
$mail = $user_cache[$uid]['mail'];
$des = $user_cache[$uid]['des'];
$title = !empty($mail) || !empty($des) ? "title=\"$des $mail\"" : '';
echo '<a href="'.Url::author($uid)."\" $title>$author</a>";
}
?>
日志作者函数，主要用于echo_log.php文件。
<?php
//blog：相邻日志
function neighbor_log($neighborLog){
extract($neighborLog);?>
<?php if($prevLog):?>
&laquo; <a href="<?php echo Url::log($prevLog['gid']) ?>"><?php echo $prevLog['title'];?></a>
<?php endif;?>
<?php if($nextLog && $prevLog):?>
|
<?php endif;?>
<?php if($nextLog):?>
<a href="<?php echo Url::log($nextLog['gid']) ?>"><?php echo $nextLog['title'];?></a>&raquo;
<?php endif;?>
<?php }?>
相邻日志函数（即上一篇 下一篇），主要用于echo_log.php文件。
<?php
//blog：引用通告
function blog_trackback($tb, $tb_url, $allow_tb){
if($allow_tb == 'y' && Option::get('istrackback') == 'y'):?>
<div id="trackback_address">
<p>引用地址: <input type="text" style="width:350px" class="input" value="<?php echo $tb_url; ?>">
<a name="tb"></a></p>
</div>
<?php endif; ?>
<?php foreach($tb as $key=>$value):?>
<ul id="trackback">
<li><a href="<?php echo $value['url'];?>" target="_blank"><?php echo $value['title'];?></a></li>
<li>BLOG: <?php echo $value['blog_name'];?></li><li><?php echo $value['date'];?></li>
</ul>
<?php endforeach; ?>
<?php }?>
module.php下篇<?php
//blog：评论列表
function blog_comments($comments){
extract($comments);
if($commentStacks): ?>
<a name="comments"></a>
<p class="comment-header"><b>评论：</b></p>
<?php endif; ?>
<?php
$isGravatar = Option::get('isgravatar');
foreach($commentStacks as $cid):
评论列表循环开始（注意！）
$comment = $comments[$cid];
$comment['poster'] = $comment['url'] ? '<a href="'.$comment['url'].'" target="_blank">'.$comment['poster'].'</a>' :$comment['poster'];
?>
以上为Gravatar头像，地址，内容的相关变量设置，一般无需更改，除了红色字体部分。
<div class="comment" id="comment-<?php echo $comment['cid']; ?>">
该ID为评论列表的编号ID
<a name="<?php echo $comment['cid']; ?>"></a>
name为评论列表的编号
<?php if($isGravatar == 'y'): ?><div class="avatar"><img src="<?php echo getGravatar($comment['mail']); ?>" /></div><?php endif; ?>
判断Gravatar头像是否开启，开启就显示Gravatar头像。
<div class="comment-info">
<b>
<?php echo $comment['poster']; ?> 
评论人名称
</b><br /><span class="comment-time">
<?php echo $comment['date']; ?>
评论时间
</span>
<div class="comment-content">
<?php echo $comment['content']; ?>
评论内容
</div>
<div class="comment-reply">
<a href="#comment-<?php echo $comment['cid']; ?>" onclick="commentReply(<?phpecho $comment['cid']; ?>,this)">回复</a>
回复该评论的链接
</div>
</div>
<?php blog_comments_children($comments, $comment['children']); ?>
子评论列表函数。
</div>
<?php endforeach; ?>
评论列表循环结束（注意）
<div id="pagenavi">
<?php echo $commentPageUrl;?>
评论分页输出变量
</div>
<?php }?>
<?php
//blog：子评论列表
function blog_comments_children($comments, $children){
$isGravatar = Option::get('isgravatar');
foreach($children as $child):
子评论列表循环开始
$comment = $comments[$child];
$comment['poster'] = $comment['url'] ? '<a href="'.$comment['url'].'" target="_blank">'.$comment['poster'].'</a>' :$comment['poster'];
?>
以上为Gravatar头像，地址，内容的相关变量设置，一般无需更改
<div class="comment comment-children" id="comment-<?php echo $comment['cid']; ?>">
该ID为评论列表的编号ID
<a name="<?php echo $comment['cid']; ?>"></a>
name为评论列表的编号
<?php if($isGravatar == 'y'): ?><div class="avatar"><img src="<?php echo getGravatar($comment['mail']); ?>" /></div><?php endif; ?>
判断Gravatar头像是否开启，开启就显示Gravatar头像。
<div class="comment-info">
<b>
<?php echo $comment['poster']; ?>
评论人名称
</b><br /><span class="comment-time">
<?php echo $comment['date']; ?>
评论时间
</span>
<div class="comment-content">
<?php echo $comment['content']; ?>
评论内容
</div>
<?php if($comment['level'] < 4): ?>
镶套级数，这里为4级镶套。
<div class="comment-reply">
<a href="#comment-<?php echo $comment['cid'];?>" onclick="commentReply(<?php echo $comment['cid']; ?>,this)">回复</a>
回复该评论的链接
</div><?php endif; ?>
镶套级数判断结束
</div>
<?php blog_comments_children($comments, $comment['children']);?>
子评论列表函数。
</div>
<?php endforeach; ?>
子评论列表循环结束。
<?php }?>
<?php
//blog：发表评论表单
function blog_comments_post($logid,$ckname,$ckmail,$ckurl,$verifyCode,$allow_remark){
if($allow_remark == 'y'): ?>
<div id="comment-place">
<div class="comment-post" id="comment-post">
<div class="cancel-reply" id="cancel-reply" style="display:none"><a href="javascript:void(0);" onclick="cancelReply()">取消回复</a></div>
<p class="comment-header"><b>发表评论：</b><a name="respond"></a></p>
<form method="post" name="commentform" action="<?php echo BLOG_URL; ?>index.php?action=addcom" id="commentform">
<input type="hidden" name="gid" value="<?php echo $logid; ?>" />
<?php if(ROLE == 'visitor'): ?>
<p>
<input type="text" name="comname" maxlength="49" value="<?php echo $ckname; ?>" size="22" tabindex="1">
<label for="author"><small>昵称</small></label>
</p>
<p>
<input type="text" name="commail" maxlength="128" value="<?php echo $ckmail; ?>" size="22" tabindex="2">
<label for="email"><small>邮件地址 (选填)</small></label>
</p>
<p>
<input type="text" name="comurl" maxlength="128" value="<?php echo $ckurl; ?>" size="22" tabindex="3">
<label for="url"><small>个人主页 (选填)</small></label>
</p>
<?php endif; ?>
<p><textarea name="comment" id="comment" rows="10" tabindex="4"></textarea></p>
<p><?php echo $verifyCode; ?> <input type="submit" id="comment_submit" value="发表评论" tabindex="6" /></p>
<input type="hidden" name="pid" id="comment-pid" value="0" size="22" tabindex="1"/>
</form>
</div>
</div>
<?php endif; ?>
<?php }?> 
评论表单里面其实没什么好介绍，主要是红色标出的name id之类的别弄错，基本上是没问题的。还有就是镶套评论所使用到的ID，要保留。如果非要更改也要在common_tpl.js文件更改。
404.php篇404错误页面，这个是emlog5.0新增加的页面。可能是因为官方论坛有网友提到无法自定义404错误，或者更有说emlog根本就没有404页面。所以emlog官方索性把404错误页面放到模板中来，让用户自己定义。
这个其实是很简单的页面，主要是由CSS样式与html语言组成。
<?php 
/*
* 自定义404页面
*/
if(!defined('EMLOG_ROOT')) {exit('error!');}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:///www点w3点org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http:///www点w3点org<cite class="highlight" highlight="true" style="background-image: none; background-position: initial initial; background-repeat: initial initial; "></cite>/1999/xhtml" lang="zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>错误提示-页面未找到</title>
错误页面标题
<style type="text/css">
<!--
body {
background-color:#F7F7F7;
font-family: Arial;
font-size: 12px;
line-height:150%;
}
.main {
background-color:#FFFFFF;
font-size: 12px;
color: #666666;
width:650px;
margin:60px auto 0px;
border-radius: 10px;
padding:30px 10px;
list-style:none;
border:#DFDFDF 1px solid;
}
.main p {
line-height: 18px;
margin: 5px 20px;
}
-->
</style>
CSS样式
</head>
<body>
<div class="main">
<p>抱歉，你所请求的页面不存在！</p>
<p><a href="javascript:history.back(-1);">&laquo;点击返回</a></p>
404错误页面提示信息
</div>
</body>
</html>
[2]
[3]
[4]