emlog MVC解构19--控制器Controller之Log_Controller及MVC解析
对于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等。
点赞2
支持一下