DokuWiki

It's better when it's simple

用户工具

站点工具


zh:devel:overview

核心流程总览

这里说明了DokuWiki程序处理一个/doku.php?id=start&do=showURL请求的基本流程。阅读之前,你需要结合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

auth_setup()
初始化插件控制器, 事件处理 系统,安全认证,初始化邮件
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

$ACT = act_permcheck($ACT)
调用ACL权限模块,检查用户是否有Action(s)的执行权限.全局变量$ACT可能会在act_dispatch()中发生改变.
global $INFO
global $conf
申明全局变量$INFO给模板使用。
trigger_event(ACTION_HEADERS_SEND) 调用插件事件ACTION_HEADERS_SEND
include(template('main.php')) 引入所选模板的主脚本,如:lib/tpl/模板名称/main.php,模板名称在config中设置,官方默认为dokuwiki
lib/tpl/default/main.php
tpl_metaheaders()
模板主脚本包含了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 pluginsDOKUWIKI_DONE事件

返回

1)
参数安全过滤,防sql注入等
zh/devel/overview.txt · 最后更改: 2023-08-13 14:52 由 Klap-in

除额外注明的地方外,本维基上的内容按下列许可协议发布: CC Attribution-Share Alike 4.0 International
CC Attribution-Share Alike 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki