Li Yuan Bo
啥都会点……-李元波
对于emlog网站来说,最常被调用的Controller莫过于Log_Controller了,这个控制器主要用于显示列表页和显示内容页。
两个方法:display($params)和displayContent($params)。
下面来详细分析一下
display:显示列表页
function display($params) {
// 建立日志模型
$Log_Model = new Log_Model();
// 建立数据缓存
$CACHE = Cache::getInstance();
// 设置缓存变量
$options_cache = Option::getAll();
/**
* extract(array($key=>$value))
* 将每个键名独立成变量,并将相对于的键值赋值给对应的变量
*/
// 将每个设置转换成独立变量,需要查看option变量的看Option篇
extract($options_cache);
// 判断列表页是第几页,默认为首页
$page = isset($params[1]) && $params[1] == 'page' ? abs(intval($params[2])) : 1;
// 新建页面URL变量
$pageurl = '';
// 配置列表先按是否置顶(y,n)反向排--置顶排前面,然后按日期反向排--新的排前面
$sqlSegment ='ORDER BY top DESC ,date DESC';
// 统计信息缓存变量
$sta_cache = $CACHE->readCache('sta');
// emlog_blog表已提交的总日志数量
$lognum = $sta_cache['lognum'];
// 调用Url静态方法logPage,获取首页文章分页链接
$pageurl .= Url::logPage();
// $index_lognum为单页输出列表文章数量,为上面Option extract获得的变量
// 获得一共需要几页
$total_pages = ceil($lognum / $index_lognum);
// 页码超过总页数,则页码设为最后一页
if ($page > $total_pages) {
$page = $total_pages;
}
// 调用Log_Model的getLogsForHome方法获取文章列表
$logs = $Log_Model->getLogsForHome($sqlSegment, $page, $index_lognum);
// 利用工具函数获取输出列表页底部页码导航的字符串
$page_url = pagination($lognum, $index_lognum, $page, $pageurl);
// 调用View的静态方法getView
// 调用前台模板的header.php文件和log_list.php文件,输出文章列表页
include View::getView('header');
include View::getView('log_list');
}
displayContent:显示文章页
function displayContent($params) {
// 评论存在则判断评论的页码,默认为1
$comment_page = isset($params[4]) && $params[4] == 'comment-page' ? intval($params[5]) : 1;
// 建立日志模型
$Log_Model = new Log_Model();
// 建立数据缓存
$CACHE = Cache::getInstance();
// 设置缓存数组变量
$options_cache = $CACHE->readCache('options');
// 将每个设置变成独立变量
extract($options_cache);
// 新建日志ID变量,默认为第一篇
$logid = 0 ;
// 根据Dispatcher的正则表达式获取的结果获取$logid
if (isset($params[1])) {
if ($params[1] == 'post') { // 链接设置为默认形式,文件形式,目录形式时
$logid = isset($params[2]) ? intval($params[2]) : 0;
} elseif (is_numeric($params[1])) { // 链接设置为分类形式时
$logid = intval($params[1]);
} else { // 采用别名时
// 别名缓存变量数组
// Cache类的mc_logalias方法可知:数组键名为gid即日志ID,键值为别名
$logalias_cache = $CACHE->readCache('logalias');
if (!empty($logalias_cache)) { // 别名开启,数组非空
// 参数里的别名去除两边的空格,还原URL编码,特殊字符添加反斜杠
$alias = addslashes(urldecode(trim($params[1])));
// 查询别名缓存数组是否存在查询的别名,存在则返回键名日志ID,否则返回false
$logid = array_search($alias, $logalias_cache);
if (!$logid) { // 出错则显示404页面
show_404_page();
}
}
}
}
// 新建评论模型
$Comment_Model = new Comment_Model();
// 调用模型方法获取包含此日志内容参数的数组,不存在则返回false
$logData = $Log_Model->getOneLogForHome($logid);
if ($logData === false) { // 日志不存在输出404页面
show_404_page();
}
/********
* $logData =
* array(
* 'log_title' => 日志标题,
* 'timestamp' => 日志提交时间戳,
* 'date' => 日志提交日期字符串,
* 'logid' => 日志唯一ID,
* 'sortid' => 日志分类ID,
* 'type' => 日志类型,普通日志为blog,页面为page,
* 'author' => 日志作者ID,
* 'log_content' => 日志内容,
* 'views' => 日志浏览数量,
* 'comnum' => 日志评论数量,
* 'top' => 日志是否首页置顶,
* 'sortop' => 日志是否分类置顶,
* 'attnum' => 日志附件数量,
* 'allow_remark' => 日志是否允许评论,
* 'password' => 日志加密密码,
* 'template' => 日志模板,
* );
********/
// 将$logData的键名转换为变量,键值为相应的变量值
extract($logData);
// 加密文章判断密码是否正确
if (!empty($password)) {
// 获取提交的密码
$postpwd = isset($_POST['logpwd']) ? addslashes(trim($_POST['logpwd'])) : '';
// cookie保存的数据
$cookiepwd = isset($_COOKIE['em_logpwd_'.$logid]) ? addslashes(trim($_COOKIE['em_logpwd_'.$logid])) : '';
// 利用日志模型方法获取并验证密码,验证后将设置Cookie
$Log_Model->authPassword($postpwd, $cookiepwd, $password, $logid);
}
// option_cache获取的变量$log_title_style:文章浏览器标题方案号
switch ($log_title_style) {
case '0':
// 方案0,设置日志页面站点标题为日志标题
$site_title = $log_title;
break;
case '1':
// 方案1,设置日志页面站点标题为日志标题-站点标题
$site_title = $log_title . ' - ' . $blogname;
break;
case '2':
// 方案2,设置日志页面站点标题为日志标题-站点浏览器标题
$site_title = $log_title . ' - ' . $site_title;
break;
}
// 去除日志内容里面的html标记,获取90字符纯文本设置为日志页面站点描述
$site_description = extractHtmlData($log_content, 90);
// 获取日志标签
$log_cache_tags = $CACHE->readCache('logtags');
// 设置日志页面的关键字为日志标签
if (!empty($log_cache_tags[$logid])) {
foreach ($log_cache_tags[$logid] as $value) {
$site_key .= ','.$value['tagname'];
}
}
// 获取日志验证码和输入框
$verifyCode = ISLOGIN == false && $comment_code == 'y' ? "<img src="".BLOG_URL."include/lib/checkcode.php" align="absmiddle" /><input name="imgcode" type="text" class="input" size="5" tabindex="5" />" : '';
// 获取cookie里面保存的评论者名
$ckname = isset($_COOKIE['commentposter']) ? htmlspecialchars(stripslashes($_COOKIE['commentposter'])) : '';
// 获取cookie里面保存的评论者邮箱
$ckmail = isset($_COOKIE['postermail']) ? htmlspecialchars($_COOKIE['postermail']) : '';
// 获取cookie里面保存的评论者个人网站网址
$ckurl = isset($_COOKIE['posterurl']) ? htmlspecialchars($_COOKIE['posterurl']) : '';
// 获取评论列表内容的数组
$comments = $Comment_Model->getComments(0, $logid, 'n', $comment_page);
// View调用前台模板的header.php,输出header等
include View::getView('header');
if ($type == 'blog') { // 文章页
// 更新浏览数
$Log_Model->updateViewCount($logid);
// 获取上一篇,下一篇的数组
$neighborLog = $Log_Model->neighborLog($timestamp);
$tb = array();$tb_url = '';//兼容未删除引用模板
// View调用前台模板的echo_log.php,输出文章内容评论等
include View::getView('echo_log');
}elseif ($type == 'page') { // 页面页
// 获取页面的模板文件名,默认为page,即文件为page.php
$template = !empty($template) && file_exists(TEMPLATE_PATH . $template . '.php') ? $template : 'page';
// View调用前台模板的$template.php输出页面页
include View::getView($template);
}
}
利用Log_Controller详细解析我们可以非常清楚的看到emlog的MVC模型:
Model-模型:文件保存在include/model/下面;属性一般仅包含一个内部数据库连接变量,用于向数据库存取数据。方法一般包括新建获取ID,更新数据,获取单个数据,获取多个数据,删除数据,各种判断等等。
View-视图:文件在include/lib/view.php,仅仅包含两个方法,一个是调用前台模板,一个是输出缓存,和工具类类似。
Controller-控制器:文件保存在include/controller/下面;依赖于各种工具类和工具函数,调用Model模型存取更新数据,调用View视图输出数据。
看到这里emlog的MVC模型非常清晰了,后面还将继续解析其他controller和重要的基础函数库function.base.php等
标签:emlog
发表评论: