会点点代码修改,会各种程序上手运营,会电商,会运营,还会吃点喝点!*_*
当前位置:首页- emlog MVC解构19 - 控制器Controller之Log_Controller及MVC解

emlog MVC解构19 - 控制器Controller之Log_Controller及MVC解

作者:李元波发布时间:2024-12-12 08:53分类: 日常 浏览:4评论:0


导读:对于emlog网站来说,最常被调用的Controller莫过于Log_Controller了,这个控制器主要用于显示列表页和显示内容页。两个方法:display($params)和...

对于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等

标签:


发表评论: