在根目录的 index.php 文件中,有一个函数很重要的函数 ViewIndex(); 它的作用是显示前台的页面.该函数位于c_system_event.php 事件相关函数文件中.首页,搜索页和feed页面都是调用的这个显示函数.
这个函数首先设置全局变量 $zbp 和 $action, $zbp 对于 zblogphp 来说是一个很重要的全局对象,基本上系统的大部分数据都可以通过这个对象来获取.
例如:$zbp->option['ZC_BLOG_NAME'] 获得的是网站博客的名称
然后 foreach 循环输出插件函数,(只输出位于 Filter_Plugin_ViewIndex_Begin 接口的,看位置应该是模板之前的位置,index 和 view 的入口位置是不同的,也就是说 index 位置的插件函数比view位置的插件函数先执行).
插件注册的时候是把方法名赋值给插件名的,所以 return $fpname() 会直接执行插件的函数
在插件挂载的时候是把中断方式赋值给执行函数名的,所以 $fpname => &$fpsignal 获得插件的中断方式
不过这里不管是什么中断方式都会设置成无.保证页面能顺利执行下去.
然后 $zbp->template->hasTemplate('404') 执行模板类对象的 hasTemplate 方法,得到当前使用模版的404.php内容? 路径:\zb_users\cache\compiled\default\404.php
如果主题有这个404文件,则在该文件挂载过滤接口 函数 Include_ShowError404,这个是怎么挂载的?是在zblogphp.php文件初始化是调用的 ShowError 函数,里面会有 foreach 输出插件函数.,这里的作用是判断如果有错误页则将插件挂载到这里,主要做特色化错误页面的.默认错误也是腾讯的公益404.
然后 switch 判断 $action 的值是否为 feed 和 search ,这两个操作有对应的入口文件,默认入口 index 是没有这个参数的,所以会执行 default 部分的代码块.
该代码首先判断 请求的路径 和 保存在cookie的路径是否相同,如果相同则调用 ViewList 函数 且所有参数为 null 以默认方式显示首页列表页面
如果不一样的话则判断
伪静态模式是否为 ACTIVE 或是否 GET rewrite 且 GET 了 id 或者 alias
如果是的话说明请求的是文章内容页,调用 ViewPost 显示页面
如果也不是请求的文章内容页的话,则调用 ViewList 以 对应参数请求结果列表,这包括page,cate,auth,date,tags,详细实现过程这里略过不写.
如果还不是的话,最后会调用 ViewAuto 函数来根据 伪静态规则显示页面
附加内容: ViewList函数分析
ViewList函数是显示列表页面的函数,默认 ViewList(null, null, null, null, null) 输出首页列表内容,伪静态参数默认为false
函数首页 global 全局对象 $zbp
然后 foreach 输出 挂在列表开始的插件函数,设定类型为 index
然后判断第2-5个参数,根据对应参数来设置类型(非null),后者覆盖前者.
定义4个变量值为 null ,(分离,作者,日期,标签),定义w数组,看起来是原来匹配文章是否置顶的.
$w = array();
$w[] = array('=', 'log_IsTop', 0);
$w[] = array('=', 'log_Status', 0);
获取参数1的内容,得到分页值,设置文章列表结果数组和文章置顶列表结果数组
执行 switch ,根据 类型不同执行不同的代码,默认 index 执行第一个 case
首先以伪静态正则 'ZC_INDEX_REGEX' => '{%host%}?page={%page%}', 为参数实例化 Pagebar分页类
将$zbp 的缓存对象的文章总数设置为分页类 count 的值,文章总数是通过 CountNormalArticleNums 函数获取的
然后获得首页(列表)默认模板(index),内容(页面)的默认是(single)
如果页面是第一个,则 设置 $zbp->title 为 网站副标题,否则 $zbp->title 为 第xx页
也就是说,如果不是第一页的列表是不会显示网站副标题的!
之后 break 来到
$pagebar->PageCount = $zbp->displaycount;
$pagebar->PageNow = $page;
$pagebar->PageBarCount = $zbp->pagebarcount;
$pagebar->UrlRule->Rules['{%page%}'] = $page;
依次设置每页显示数量,当前页,一共有多少页,URL规则类 Rules {%page%} 的值设置为 当前页数
输出 Filter_Plugin_ViewList_Core 的插件函数,看参数应该是在输出内容前执行的,官方WIKI也没有写出这个接口的说明
接下来判断如果顶部列表关闭(ZC_LISTONTOP_TURNOFF)是否等于false,也就是如果打开了置顶功能的话则获取全部置顶文章,还说了优先从缓存的数组里获取.(不过我还没看到对应的实现代码,反正 $zbp->GetTopArticle() 之后就获取到了置顶的数据了),然后依次 foreach 得到全局置顶的,首页置顶的和分类置顶的文章类型的数组待用
循环输出 Filter_Plugin_LargeData_Aritcle 的插件函数,看情况是在查询数据库之前(获取数据之前)的插件接口,官方WIKI依然没有这个接口的说明.
然后就是执行 $zbp->GetArticleList 函数查询获得文章列表了.
获取主题标签中的网站标题,中的文章
如果总页数等于0,则将分页类对象删除?(不知道,反正他是把对象 pagebar 设置为了 null)
一长串的 SetTags 设置主题标签和对应的值,有什么用?不知道,反正在这个函数内没看到他用这个!
之后使用 hasTemplate 判断对应的主题文件是否存在,如果存在则 SetTemplate设置主题类中的 entryPage 的值为对应的主题文件的名称,如果不存在则设置为 index (如果 index 也不存在呢?哈哈)
这里有循环输出 Filter_Plugin_ViewList_Template 位置接口的插件函数,官方WIKI终于有说明了,是 处理列表页模板接口 ,然后呢?我还是没有理解能在这里做什么啊,不过可以知道的是这个位置肯定在显示模板文件之前的,因为后面 $zbp->template->Display(); 就是显示模板页面的函数.