DokuWiki 插件开发要点总结

DokuWiki 插件开发要点总结表格(含日志、调试、缓存)

主题 说明 建议与注意事项
语法类型 块级语法 vs 内联语法 块级:使用 addEntryPattern / addExitPattern;内联:用 addSpecialPattern
块级语法 可跨行,常以两个连续换行符(空行)断开段落或块 注意保留换行,避免影响下一个语法块匹配
内联语法 单行匹配,不跨行、不包含换行符 正则不要匹配 \n;适用于加粗、斜体、代码片段等
getSort() 控制语法插件的执行优先级,数字越小越早执行 避免语法冲突,基础语法如加粗斜体应优先
handle() 匹配时解析原始语法,返回结构化数据供 render() 使用 不输出内容,只解析和整理匹配数据
render() 根据 handle() 返回值渲染 HTML 或其他输出 根据 $mode 区分 xhtmlodt 等渲染方式
换行符处理 块级语法匹配中可包含换行,内联语法应避免换行 不当处理可能吞掉换行,导致后续语法失效
语法冲突常见问题 上一个语法块过度吞噬换行符,下一个语法块失去匹配前导 控制退出正则、避免贪婪匹配、合理设置 getSort()
常见错误陷阱 退出语法模式使用贪婪正则或直接匹配多换行符 使用非贪婪正则,或分层处理换行逻辑
日志记录方式 Logger::log()Logger::debug()Logger::error() 分别记录信息、调试、错误日志 组件名建议使用 plugin.插件名,日志等级如 LOG_INFO、LOG_WARNING、LOG_ERR 等
调试方式:msg() 使用 msg($msg) 向页面输出调试信息,支持类型标记(例如 INFO, DEBUG, ERROR 仅开发时使用,调试完务必移除
调试方式:dbg() 快速输出变量或文本,仅在 $conf['debug'] = 1 时生效 开发调试极为方便,格式化输出,页面底部可见
调试方式:dbg_backtrace() 输出调用栈信息,调试调用顺序与问题定位 配合复杂插件或钩子排查执行路径
缓存刷新方式:purge=1 强制刷新页面缓存,重走语法解析和渲染逻辑 用于开发调试时测试最新渲染效果
其他日志输出方式 var_dump()print_r() 直接输出内容至页面(仅开发中使用) 开发环境可用,正式环境应避免
开启调试模式 conf/local.php 中设置 $conf['debug'] = 1; 配合 dbg()Logger::debug() 使用
查看日志输出 DokuWiki 日志记录到 data/cache/log/ 目录(或服务器日志) 持续追踪错误、调试信息

示例:在插件中使用 Loggerdbg

public function handle($match, $state, $pos, Doku_Handler $handler) {
    Logger::debug('plugin.myplugin', 'Handling match at position: ' . $pos);
    dbg(['match' => $match, 'state' => $state]);  // 开发调试
    return [$state, $match];
}

插件架构与生命周期

主题 说明 建议与注意事项
插件类型 DokuWiki 支持多种插件类型:语法、动作、管理、帮助、渲染等 根据功能需求选择合适的插件类型,可以实现多种类型的组合插件
插件注册 通过 plugin.info.txt 文件注册插件基本信息 必须包含 base、author、email、date、name、desc、url 等字段 PluginTrait.php:33-40
插件初始化 通过 register() 方法注册事件处理器 动作插件必须实现此方法,语法插件通过 getSort() 和连接方法注册
缓存控制 插件可通过 $renderer->nocache() 禁用页面缓存 动态内容插件应禁用缓存,但注意性能影响 renderer.php:94-99

错误处理与调试增强

主题 说明 建议与注意事项
异常处理 使用 try/catch 捕获异常,避免插件错误影响整个系统 插件加载失败会被 PluginController 捕获并显示错误信息 PluginController.php:130-133
错误处理器 DokuWiki 有内置的错误处理系统 严重错误会被 ErrorHandler 捕获并记录到日志 ErrorHandler.php:58-66
调试模式检测 使用 DebugHelper::isEnabled() 检查调试是否启用 避免在生产环境输出调试信息

性能优化

主题 说明 建议与注意事项
缓存策略 合理使用 DokuWiki 的缓存系统 静态内容使用缓存,动态内容考虑局部缓存或禁用缓存
资源加载 按需加载 JavaScript 和 CSS 使用 script()tpl_addStyle() 函数,避免不必要的资源加载
数据结构优化 处理大量数据时注意内存使用 使用迭代器或生成器处理大型数据集,避免一次性加载全部数据

国际化与本地化

主题 说明 建议与注意事项
语言文件 使用 lang/xx/lang.php 存储翻译字符串 通过 $this->getLang('key') 获取当前语言的翻译
日期与时间格式 考虑不同地区的日期时间格式 使用 DokuWiki 的 dformat() 函数格式化日期时间

安全性考虑

主题 说明 建议与注意事项
输入验证 始终验证和清理用户输入 使用 hsc() 函数转义 HTML,防止 XSS 攻击
权限检查 使用 auth_quickaclcheck() 检查用户权限 在执行敏感操作前验证用户权限
CSRF 保护 使用 DokuWiki 的表单安全令牌 通过 formSecurityToken() 生成和验证安全令牌

示例:完整的插件调试与日志记录

public function handle($match, $state, $pos, Doku_Handler $handler) {  
    global $conf;  

    // 1. 使用 Logger 记录调试信息(始终写入日志文件)  
    Logger::debug('plugin.myplugin', "处理匹配:$match,状态:$state,位置:$pos");  

    // 2. 仅在调试模式下输出到页面  
    if ($conf['allowdebug']) {  
        dbg(['match' => $match, 'state' => $state, 'pos' => $pos]);  
        msg('插件处理中...', 0); // 0=信息, -1=错误, 1=成功, 2=通知  
    }  

    // 3. 记录错误(如有)  
    try {  
        // 处理逻辑  
        $result = $this->processMatch($match);  
    } catch (\Exception $e) {  
        Logger::error('plugin.myplugin', $e->getMessage(), $e->getFile(), $e->getLine());  
        return false;  
    }  

    // 4. 禁用缓存(如果内容是动态的)  
    if ($this->isDynamic) {  
        $handler->_addCall('nocache', [], $pos);  
    }  

    return $result;  
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇