好!欢迎访问迷津渡口 现在时间是: 天气 °C ~ °C

迷津渡口

越感到迷惑 越接近真理

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模型:

  1. Model-模型:文件保存在include/model/下面;属性一般仅包含一个内部数据库连接变量,用于向数据库存取数据。方法一般包括新建获取ID,更新数据,获取单个数据,获取多个数据,删除数据,各种判断等等。

  2. View-视图:文件在include/lib/view.php,仅仅包含两个方法,一个是调用前台模板,一个是输出缓存,和工具类类似。

  3. Controller-控制器:文件保存在include/controller/下面;依赖于各种工具类和工具函数,调用Model模型存取更新数据,调用View视图输出数据。


看到这里emlog的MVC模型非常清晰了,后面还将继续解析其他controller和重要的基础函数库function.base.php等。

点赞2
   支持一下
挤眼 亲亲 咆哮 开心 想想 可怜 糗大了 委屈 哈哈 小声点 右哼哼 左哼哼 疑问 坏笑 赚钱啦 悲伤 耍酷 勾引 厉害 握手 耶 嘻嘻 害羞 鼓掌 馋嘴 抓狂 抱抱 围观 威武 给力
 点赞
 签到
 表情
 图片
 代码
提交评论

清空信息
关闭评论
jneecedesigns
 jneecedesigns 2018-12-16 05:53回复
#14
<a href="http://www.adamaccademia.com/discount-ray-ban-aviator-folding-sunglassesb">discount ray ban aviator folding</a> <a href="http://www.usuariobacano.com/nike-air-max-2015-black-blue-red-skot">nike air max 2015 black blue red</a> <a href="http://www.ridderdrive.com/green-purple-womens-nike-shox-avenue-shoes-shoesd">green purple womens nike shox avenue shoes</a> <a href="http://www.globalgtprc.com/elite-a.j.-jenkins-jersey-dallas-cowboys-16-road-white-nflb">elite a.j. jenkins jersey dallas cowboys 16 road white</a> <a href="http://www.checkmyprices.com/barato-nike-air-max-invigor-hombres-rojo-runningb">barato nike air max invigor hombres rojo</a> <a href="http://www.divasdelface.com/billig-nike-air-max-2017-herre-gr%C3%B8n-shoese">billig nike air max 2017 herre gr酶n</a>
[url=http://www.jneecedesigns.com/]jneecedesigns[/url]
rumelisut
 rumelisut 2018-12-14 02:48回复
#13
<a href="http://www.cakirgozoto.com/silver-pink-womens-nike-kaishi-shoes-foota">silver pink womens nike kaishi shoes</a> <a href="http://www.burayagidin.com/new-era-blank-camo-fitted-hats-lines-hatd">new era blank camo fitted hats lines</a> <a href="http://www.ftpronto.com/nike-free-ebay-kleinanzeigen-trainersb">nike free ebay kleinanzeigen</a> <a href="http://www.bukafalar.com/%EF%BB%BFconverse-shoes-shoesz">锘縞onverse shoes</a> <a href="http://www.essodustade.com/femminile-puma-future-cat-bianca-shoesn">femminile puma future cat bianca</a> <a href="http://www.biyotestatik.com/nobis-cartel-jacket-review-nobisr">nobis cartel jacket review</a>
gridironstats
 gridironstats 2018-12-13 06:01回复
#12
<a href="http://www.mbesthetics.com/michael-kors-mens-jet-set-backpack-mkr">michael kors mens jet set backpack</a> <a href="http://www.cbchispana.com/flyknit-free-4.0-pink-runningf">flyknit free 4.0 pink</a> <a href="http://www.guntruthers.com/adidas-zx-700-schwarz-wei%C3%9F-skow">adidas zx 700 schwarz wei脽</a> <a href="http://www.alaskanuber.com/parajumpers-angie-womens-jacket-parajumpersr">parajumpers angie womens jacket</a> <a href="http://www.naijafitgirl.com/zapatillas-converse-shoesz">zapatillas converse</a> <a href="http://www.gushandyman.com/nike-dunk-mid-pro-sb-all-white-trainerse">nike dunk mid pro sb all white</a>
gridironstats http://www.gridironstats.com/
shoppula
 shoppula 2018-12-07 13:57回复
#11
<a href="http://www.lieupekings.com/air-jordan-5-quai-54-black-for-sale-qld-sneakerc">air jordan 5 quai 54 black for sale qld</a> <a href="http://www.ziabio.com/nobis-jacket-black-friday-sale-nobisr">nobis jacket black friday sale</a> <a href="http://www.consultdoing.com/nike-kobe-11-low-eleven-runningf">nike kobe 11 low eleven</a> <a href="http://www.hospicevna.com/new-era-hat-patriots-baseball-cap-hatc">new era hat patriots baseball cap</a> <a href="http://www.medicinennet.com/bon-march%C3%A9-nike-free-5.0-v2-femmes-violet-sportsd">bon march茅 nike free 5.0 v2 femmes violet</a> <a href="http://www.zlotyul.com/silver-orange-womens-nike-roshe-print-shoes-trainersce">silver orange womens nike roshe print shoes</a>
shoppula http://www.shoppula.com/
virtualxbox
 virtualxbox 2018-12-02 02:31回复
#10
<a href="http://www.ozkaratasorg.com/nike-roshe-run-calypso-damen-runninge">nike roshe run calypso damen</a> <a href="http://www.housemykonos.com/nike-flyknit-free-oreo-skow">nike flyknit free oreo</a> <a href="http://www.kanpourakuen.com/retired-pandora-charms-australia-pandorar">retired pandora charms australia</a> <a href="http://www.dailysewansew.com/vanderbilt-snapback-hata">vanderbilt snapback</a> <a href="http://www.hopingforsnow.com/billig-new-balance-890-kvinders-bl%C3%A5-skob">billig new balance 890 kvinders bl氓</a> <a href="http://www.melbabishop.com/prada-belt-price-in-singapore-pradar">prada belt price in singapore</a>
virtualxbox http://www.virtualxbox.com/
sdsremote
 sdsremote 2018-11-24 19:47回复
#9
<a href="http://www.sfhires.com/nike-zoom-clear-out-royal-blue-skow">nike zoom clear out royal blue</a> <a href="http://www.gregertopsoil.com/pink-mens-nike-hyperdunk-2015-trainersd">pink mens nike hyperdunk 2015</a> <a href="http://www.rumelisut.com/nike-kobe-5-womens-red-pink-shoesb">nike kobe 5 womens red pink</a> <a href="http://www.brendonrush.com/%EF%BB%BFnikes-19-on-shoesm">锘縩ikes 19 on</a> <a href="http://www.adgamorese.com/nike-hyperdunk-2014-low-new-nba-sportsc">nike hyperdunk 2014 low new nba</a> <a href="http://www.hobihobinomi.com/grey-white-mens-nike-air-berwuda-shoes-trainersce">grey white mens nike air berwuda shoes</a>
sdsremote http://www.sdsremote.com/
jindianhua
 jindianhua 2018-11-23 12:32回复
#8
<a href="http://www.mbejobs.com/nike-roshe-run-white-zalando-shoesb">nike roshe run white zalando</a> <a href="http://www.tarbiatesabz.com/asics-gel-quantum-360-dam%C3%A4nner-gr%C3%BCn-sportsg">asics gel quantum 360 dam盲nner gr眉n</a> <a href="http://www.perialetheia.com/nike-free-everyday-femminile-footd">nike free everyday femminile</a> <a href="http://www.nauticabg.com/air-jordan-3-white-for-sale-sportsa">air jordan 3 white for sale</a> <a href="http://www.polurnetsucks.com/nike-shox-tl3-shoesm">nike shox tl3</a> <a href="http://www.alexiancancer.com/womens-asics-gel-lyte-5-black-green-trainersd">womens asics gel lyte 5 black green</a>
jindianhua http://www.jindianhua.com/
toockbespoke
 toockbespoke 2018-11-15 23:02回复
#7
<a href="http://www.meghanfresta.com/new-balance-420-revlite-white-skow">new balance 420 revlite white</a> <a href="http://www.coldwaterapps.com/silver-orange-womens-nike-hyperdunk-2017-shoes-runningc">silver orange womens nike hyperdunk 2017 shoes</a> <a href="http://www.drmilliecalko.com/nike-flyknit-lunar-3-dam%C3%A4nner-gr%C3%BCn-sportsg">nike flyknit lunar 3 dam盲nner gr眉n</a> <a href="http://www.ovisausa.com/bracelet-hermes-email-blanc-jewelryr">bracelet hermes email blanc</a> <a href="http://www.lumalenders.com/ray-ban-clubmaster-acetate-sunglassesr">ray ban clubmaster acetate</a> <a href="http://www.eysenreich.com/browning-buckmark-cap-hatr">browning buckmark cap</a>
toockbespoke http://www.toockbespoke.com/
nutraxtractor
 nutraxtractor 2018-11-14 13:31回复
#6
<a href="http://www.instabuttons.com/official-fendi-belts-beltr">official fendi belts</a> <a href="http://www.natalbags.com/nike-air-max-flair-womens-green-purple-sportsb">nike air max flair womens green purple</a> <a href="http://www.oricastg.com/nike-free-run-2-size-3-skou">nike free run 2 size 3</a> <a href="http://www.raynne.com/nike-shox-basketball-shoes-mens-shoesa">nike shox basketball shoes mens</a> <a href="http://www.elitoyreviews.com/%EF%BB%BFconverse-shoes-shoesz">锘縞onverse shoes</a> <a href="http://www.gaeconomics.com/nike-air-max-1-black-leather-1vt-skoc">nike air max 1 black leather 1vt</a>
nutraxtractor http://www.nutraxtractor.com/
joemaniophoto
 joemaniophoto 2018-11-06 14:15回复
#5
<a href="http://www.polyphonyma.com/nike-flex-fury-femmes-blanc-sportsb">nike flex fury femmes blanc</a> <a href="http://www.bondhuberman.com/nike-kaishi-all-red-eye-footc">nike kaishi all red eye</a> <a href="http://www.kokismith.com/nike-air-max-2015-kvinders-gr%C3%B8n-sneakerc">nike air max 2015 kvinders gr酶n</a> <a href="http://www.ftpronto.com/mackage-lauren-leather-jacket-mackager">mackage lauren leather jacket</a> <a href="http://www.bandbfalmouth.com/adidas-zx-700-dragon-fruit-skor">adidas zx 700 dragon fruit</a> <a href="http://www.lukonsult.com/new-york-yankees-jersey-black-nflr">new york yankees jersey black</a>
joemaniophoto http://www.joemaniophoto.com/
顶部留言底部
 00:00/00:00
我想和你虚度时光 - 花房姑娘(9)
  1. 我想和你虚度时光
  2. 花房姑娘
  3. 恋恋风尘
  4. 我喜爱一切不彻底的事物
  5. 我的心里是满的
  6. Long Way
  7. 给少年的歌
  8. 晴日共剪窗
  9. 天上的月你的脸