zh:devel:overview
核心流程总览
这里说明了DokuWiki程序处理一个/doku.php?id=start&do=show
URL请求的基本流程。阅读之前,你需要结合DokuWiki的原码进行深入的学习和理解。到XRef页面可以下载稳定版原码。callgraph页面提供了一个详细的程序调用图,包括了整个渲染过程。为了简化流程(仅列出了最核心的流程),以下说明省去了许多处理细节:
文件名称 | 代码片断 | 说明 |
---|---|---|
doku.php | if(!defined('DOKU_INC')) | 定义代码基础目录常量,一切从这里开始 |
$ACT = $_REQUEST['do'] | 紧接着,获取调用的action(也叫do modes) | |
require_once('init.php') | 引入init.php, 初始化核心模块 | |
inc/init.php | include('preload.php') | preload preload.php用来重写目录或系统配置 |
if(!defined('DOKU_CONF') | 创建环境 的 代码目录 | |
include(DOKU_INC. 'inc/config_cascade.php') | 准备和加载全局配置文件 | |
global $lang; | 加载和准备 多国语言文件,默认为英语 | |
if(!defined('DOKU_REL') | 查检和定义DokuWiki的安装目录,可在配置中进行设定。为了安全性,你可以重定义目录位置 | |
if(!headers_sent() && .. | 初始化session和cookie | |
require_once (DOKU_INC.'inc/load.php') | 加载所有libraries | |
… | 初始化插件控制器, 事件处理 系统,安全认证,初始化邮件 | |
doku.php | $ID = getID() | 从init.php返回,净化1)request并封装到全局变量]中。| | ::: |'' $INFO = pageinfo() '' | 把页面[[devel:metadata 封装到$INFO全局变量中,其调用了auth_quickaclcheck() 和p_get_metadata()方法,如果没有缓存就会重新生成一个。 |
if(!$INFO['exists'] … | 调转404错误页面 | |
trigger_event(DOKUWIKI_STARTED) | 调用插件事件DOKUWIKI_STARTED | |
inc/actions.php | act_dispatch($ACT) | 分发action处理 |
if ($evt->advise_before()) ... | 可以插件使用ACTION_ACT_PREPROCESS事件重写这个默认的行为 | |
$ACT = act_clean($ACT) | 净化和重定向到do=show Action |
|
… | 调用ACL权限模块,检查用户是否有Action(s)的执行权限.全局变量$ACT可能会在act_dispatch()中发生改变. | |
global $INFO | 申明全局变量$INFO给模板使用。 | |
trigger_event(ACTION_HEADERS_SEND) | 调用插件事件ACTION_HEADERS_SEND | |
include(template('main.php')) | 引入所选模板的主脚本,如:lib/tpl/模板名称/main.php,模板名称在config中设置,官方默认为dokuwiki | |
lib/tpl/default/main.php | … | 模板主脚本包含了HTML元素,调用了php方法来创建内容,如 metaheaders、 按钮、 面包屑导航元素等。所有可用的方法定义在inc/template.php 文件中。 |
tpl_content() | wiki页面的最终HTML代码 | |
inc/template.php | ||
trigger_event(TPL_ACT_RENDER) | 通过插件事件TPL_ACT_RENDER 调用 tpl_content_core() | |
switch($ACT) | 根据action选择内容,如最基础的do=show 调用html_show() |
|
inc/html.php | $html = p_wiki_xhtml(…) | p_wiki_xhtml()会返回一个XHTML的缓存页面,或由renderer利用缓存instructions创建页面,如果instructions也没有缓存,就会先使用parser将wiki文本转化成instructions。就是说一个wiki文本转化成wiki页面,主要分为两步,先由parser将文本将成中间instructions的数组,再由renderer调用Doku_Renderer_xhtml将中间instructions转成XTHML,当然你也可以设计出更多的Renderer,如pdf等,这是整个wiki程序中最为核心的部分。 |
inc/template.php | trigger_event(TPL_CONTENT_DISPLAY) | 从 tpl_content()返回, 调用插件事件TPL_CONTENT_DISPLAY,这是 action 插件改变原生HTML代码的最后一个事件。 |
doku.php | trigger_event(DOKUWIKI_DONE) | 当main.php脚本执行完后,最后调用 action plugins的DOKUWIKI_DONE事件 |
返回
1)
参数安全过滤,防sql注入等
zh/devel/overview.txt · 最后更改: 2023-08-13 14:52 由 Klap-in