Dokuwiki 二次开发记录

【转】http://www.syyong.com/other/Dokuwiki-Secondary-Development-Record.html

DokuWiki 是一种在 GPLv2 下获得许可并以 PHP 编程语言编写的 wiki 应用程序。 它适用于纯文本文件,因此不需要数据库。它的语法与 MediaWiki 使用的语法类似。

DokuWiki 具有丰富的插件,如Markdown、sidebar、流程图、时序图、svg、数学公式、ToDo等等这些实用的插件。

但由于直接安装 DokuWiki 和使用她的插件,对有些地方和样式不是很满意。如 Markdown 插件存在 bug,样式风格过于传统,登录方式需要自定义等。由于这些问题的存在,也就需要在源码的基础上做些配置和二次开发。

下载安装Dokuwiki

https://www.dokuwiki.org/

安装插件

  1. SVG-Edit plugin
  2. DokuWiki Upgrade
  3. Wrap Plugin
  4. Sequencediagram plugin
  5. Plugin: Numbered Headings
  6. Note Plugin
  7. Move plugin
  8. MathJax plugin
  9. PHP Markdown Extra plugin
  10. Indexmenu Plugin
  11. imgpaste plugin
  12. Gallery Plugin
  13. Flowchartjs Plugin
  14. S5 Slideshow Plugin
  15. edittable plugin
  16. color syntax plugin
  17. ToDo
  18. Copy Page Plugin
  19. Page Redirect
  20. Remove irrelevant entries from the change history
  21. Searchindex Manager
  22. CSV Plugin
  23. ShortURL Plugin

data目录名支持中文

inc/pageutils.php

  1. # utf8_encodeFN()
  2. // $file = urlencode($file);
  3. // $file = str_replace('%2F','/',$file);
  4. return $file;
  5. # utf8_decodeFN()
  6. // return urldecode($file);
  7. return $file;

配置管理器

DokuWiki 设置

  1. title: 聚美wiki
  2. 语言:zh
  3. 高级设置:自动检查更新关闭

显示设置

  1. toptoclevel -> 1
  2. tocminheads -> 1
  3. maxtoclevel -> 3
  4. maxseclevel -> 3

Mathjax配置

plugin»mathjax»url

  1. // 先从网上下载MathJax到指定目录.
  2. /lib/plugins/mathjax/2.7.1/MathJax.js?config=TeX-AMS_CHTML.js

plugin»mathjax»config

  1. MathJax.Hub.Config({
  2. tex2jax: {
  3. inlineMath: [ ["\\$","\\$"] ],
  4. displayMath: [ ["\\$\\$","\\$\\$"] ],
  5. processEscapes: true
  6. }
  7. });

Indexmenu

生成管理左侧目录树。

添加sidebar页面,内容为:

  1. {{indexmenu>..#1|js navbar}}

Markdownextra

lib/plugins/markdownextra/action.php

  1. if (preg_match('/^---\s*\n(.*?\n?)^---\s*$\n?(.+)/sm',$event->data, $match)){
  2. $event->data = preg_replace('/^---\s*\n(.*?\n?)^---\s*$\n?/sm', "</markdown>\n\\1<markdown>\n" ,$event->data, -1);
  3. $event->data = "<markdown>\n".$event->data."\n</markdown>";
  4. $event->data = preg_replace('/^<markdown>\s*\n*<\/markdown>\s*$\n?/sm', "" ,$event->data);
  5. }else{
  6. $event->data = "<markdown>\n".$event->data."\n</markdown>";
  7. }

lib/plugins/markdownextra/syntax.php

  1. Warning: DOMDocument::loadHTML(),加上 @ 屏蔽报错

解决解析md时概率性出错问题

1)inc/parserutils.php -> p_cached_instructions():

  1. $isMD = strtolower(substr($file, -7)) === '.md.txt';
  2. if (!$isMD && ($cacheonly || $cache->useCache() || (isset($run[$file]) && !defined('DOKU_UNITTEST')))) {
  3. return $cache->retrieveCache();
  4. } else {
  5. if (file_exists($file)) {
  6. // no cache - do some work
  7. $ins = p_get_instructions(io_readWikiPage($file, $id));
  8. if (!$isMD) {
  9. if ($cache->storeCache($ins)) {
  10. $run[$file] = true; // we won't rebuild these instructions in the same run again
  11. } else {
  12. msg('Unable to save cache file. Hint: disk full; file permissions; safe_mode setting.', -1);
  13. }
  14. }
  15. return $ins;
  16. }
  17. }

2)inc/parserutils.php -> p_cached_output():

  1. # 130
  2. + $isMD = strtolower(substr($file, -7)) === '.md.txt';
  3. * if (!$isMD && $cache->useCache()) {

其他修改文件

  1. lib/plugins/markdownextra/lib/meltdown/js/jquery.meltdown.js
  2. lib/plugins/markdownextra/lib/meltdown/css/meltdown.css
  3. lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.js
  4. lib/plugins/markdownextra/lib/meltdown-tweaks/meltdown-tweaks.css
  5. lib/scripts/editor.js

svgedit

lib/plugins/svgedit/script.js

  1. * var svgeditor_path = DOKU_BASE+'lib/plugins/svgedit/svg-edit/'; //offline

网上下载embedapi.js文件放到 lib/plugins/svgedit/svg-edit/ 目录下。

外部链接新tab打开

在conf/local.php加上:

  1. $conf['target']['extern'] = '_black';

copypage

修改图片顺序

修改右侧“页面复制”按钮的顺序由默认的倒数第一变为倒数第二。

lib/plugins/copypage/action.php

  1. public function add_tool_button(Doku_Event &$event, $param) {
  2. $newitem = '<li>' .
  3. '<a href="#" class="action copypage copypageplugin__copy" rel="nofollow">' .
  4. '<span>' .
  5. $this->getLang('copypage') .
  6. '</span>' .
  7. '</a>' .
  8. '</li>';
  9. $offset = count($event->data['items']) - 1;
  10. $event->data['items'] =
  11. array_slice($event->data['items'], 0, $offset, true) +
  12. array('copypage' => $newitem) +
  13. array_slice($event->data['items'], $offset, null, true);
  14. }

添加中文翻译

进入 lib/plugins/copypage/lang

  1. cp -r en zh

修改lang.php

  1. <?php
  2. $lang['copypage'] = '页面复制';
  3. $lang['js']['enter_page_id'] = "输入新文档地址";
  4. $lang['js']['different_id_required'] = '不能和当前文档重名.';

S5

可添加一个自定义的模板,自定义样式。

imgpaste

图片粘贴后默认是wiki语法,如果是Markdown类型的文档则需要做兼容性支持:

lib/plugins/imgpaste/script.js

  1. // insert syntax and close dialog
  2. success: function (data) {
  3. $box.find('.content').addClass('success').text(data.message);
  4. var _id = getUrlParam('id');
  5. if (_id == null || _id.substr(-3, 3).toLowerCase() != '.md') {
  6. insertAtCarret('wiki__text', '{{ :' + data.id + ' |}}');
  7. } else {
  8. insertAtCarret('wiki__text', '![Title](/lib/exe/fetch.php?media=' + data.id + ')');
  9. }
  10. $box.delay(500).fadeOut(500, function () {
  11. $box.dialog('destroy').remove()
  12. });
  13. },

配置设置

管理 -> 模板样式设置

  1. 全站的宽度 :100em
  2. 侧边栏的宽度 :18em

修改样式

1、lib/scripts/editor.js

  1. 300px -> 550px;

2、conf目录下添加userstyle.css文件:

  1. .dokuwiki div.page, .dokuwiki .pageId span, pre.code, pre, code {
  2. box-shadow: none;
  3. }
  4. .dokuwiki .group p, .dokuwiki li, .dokuwiki dd {
  5. line-height: 1.7;
  6. }
  7. .dokuwiki div.page {
  8. border: 1px solid #a7d7f9;
  9. font-size: 15px;
  10. padding: 1.556em 1.5em 1.5em;
  11. }
  12. #dokuwiki__pagetools {
  13. top: 2.5em;
  14. }
  15. div.mode_edit #dokuwiki__header, div.mode_preview #dokuwiki__header, div.mode_draft #dokuwiki__header, div.mode_recover #dokuwiki__header {
  16. display: none;
  17. }
  18. div.mode_edit #dokuwiki__content div.page, div.mode_preview #dokuwiki__content div.page, div.mode_draft #dokuwiki__content div.page, div.mode_recover #dokuwiki__content div.page {
  19. padding: 10px 0px 0px 0px;
  20. background: inherit;
  21. border: 0px;
  22. }
  23. div.mode_edit #dokuwiki__footer, div.mode_preview #dokuwiki__footer, div.mode_draft #dokuwiki__footer, div.mode_recover #dokuwiki__footer {
  24. display: none;
  25. }
  26. div.mode_edit .dokuwiki.hasSidebar div.preview, div.mode_preview div.preview, div.mode_draft div.preview, div.mode_recover div.preview {
  27. border-right: 0px;
  28. background: #fff;
  29. }
  30. div.mode_edit .dokuwiki.hasSidebar div.preview, div.mode_preview div.preview .pad, div.mode_draft div.preview .pad, div.mode_recover div.preview .pad {
  31. padding-left: 5px;
  32. padding-right: 5px;
  33. }
  34. div.mode_edit textarea, div.mode_preview textarea, div.mode_draft textarea, div.mode_recover textarea {
  35. padding-left: 5px;
  36. padding-right: 5px;
  37. }
  38. div.mode_edit #edbtn__save, div.mode_preview #edbtn__save, div.mode_draft #edbtn__save, div.mode_recover #edbtn__save {
  39. background: #4285f4;
  40. border: 1px solid #4285f4;
  41. color: #fff;
  42. }
  43. div.mode_edit div.docInfo, div.mode_preview div.docInfo, div.mode_draft div.docInfo, div.mode_recover div.docInfo {
  44. display: none;
  45. }
  46. div.mode_edit button, div.mode_preview button, div.mode_draft button, div.mode_recover button {
  47. padding: .1em 1.5em;
  48. }
  49. div.mode_edit #dokuwiki__pagetools, div.mode_preview #dokuwiki__pagetools, div.mode_draft #dokuwiki__pagetools, div.mode_recover #dokuwiki__pagetools {
  50. top: 6em;
  51. }
  52. html, body {
  53. background: #fbfaf9;
  54. -webkit-font-smoothing: antialiased;
  55. font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  56. }
  57. a:link, a:visited, a:hover, a:active {
  58. color: #4183c4
  59. }
  60. form.search {
  61. display: inline-block; /*float: left;*/
  62. }
  63. #dokuwiki__header .tools li#site_home_l {
  64. float: left;
  65. margin-left: 0px;
  66. font-size: 20px;
  67. font-weight: bold;
  68. margin-top: -6px;
  69. }
  70. div.mode_show #dokuwiki__content div.page pre.code, div.mode_edit #dokuwiki__content div.page pre.code {
  71. background: #f6f8fa;
  72. border: 0px;
  73. font-size: 14px;
  74. }
  75. div.mode_show #dokuwiki__content div.page code {
  76. font-size: 14px;
  77. }
  78. div.mode_show #dokuwiki__content div.page pre, div.mode_edit #dokuwiki__content div.page pre {
  79. background: #f6f8fa;
  80. border: 0px;
  81. box-shadow: none;
  82. }
  83. .dokuwiki dl.code dt, .dokuwiki dl.file dt {
  84. background: #f6f8fa;
  85. border: 0px;
  86. }
  87. div.mode_show p code {
  88. padding: 3px;
  89. }
  90. div.mode_show p a {
  91. padding: 0 3px;
  92. }
  93. .dokuwiki .page ul li, .dokuwiki .aside ul li, .dokuwiki .page ol li, .dokuwiki .aside ol li {
  94. color: #333;
  95. }
  96. .dokuwiki .fc_flowchartjs {
  97. overflow: auto;
  98. background: #f6f8fa;
  99. }
  100. #dokuwiki__site .wrapper {
  101. margin-top: -10px;
  102. }
  103. form.search input {
  104. padding: .35em 22px .35em 0.5em;
  105. border: 1px solid #a7d7f9;
  106. box-shadow: none;
  107. }
  108. code {
  109. background: #f6f8fa;
  110. }
  111. .code .re0 {
  112. color: #008;
  113. }
  114. strong, b {
  115. color: #555;
  116. }
  117. .mode_preview #dokuwiki__content div.preview {
  118. border: 1px solid #a7d7f9;
  119. padding: 1.556em 1.5em 1.5em;
  120. margin: 0 0 0 0;
  121. }
  122. .mode_preview #dokuwiki__content div.preview div.pad {
  123. margin: 0px;
  124. padding: 0px;
  125. }
  126. #dw__toc {
  127. margin: -1.556em -1em .5em 1.4em;
  128. }
  129. pre.code, pre, code {
  130. border: 0px;
  131. background: #f6f8fa;
  132. font-size: 14px;
  133. }
  134. #dokuwiki__usertools {
  135. position: inherit;
  136. }
  137. #dokuwiki__header .headings, #dokuwiki__header .tools {
  138. width: 100%;
  139. margin-bottom: 5px;
  140. margin-top: 0px;
  141. }
  142. #dokuwiki__header {
  143. padding: 1em 0 1.5em;
  144. }
  145. #size__ctl img {
  146. margin-left: 10px;
  147. }
  148. fieldset {
  149. border-radius: 5px;
  150. }
  151. fieldset input {
  152. padding: 3px;
  153. }
  154. #wiki__text {
  155. height: 500px;
  156. }
  157. .dokuwiki .editBar .summary input.missing {
  158. background-color: #fff;
  159. }
  160. #TZT {
  161. display: none;
  162. }
  163. .dokuwiki div.toolbar {
  164. margin-top: .5em;
  165. }
  166. .dokuwiki .wrapper {
  167. margin-bottom: 0px;
  168. }
  169. #wiki__editbar .summary span, #draft__status {
  170. color: #555;
  171. font-size: 13px;
  172. }
  173. table tbody tr:hover {
  174. background: #f6f8fa
  175. }
  176. div.export {
  177. background: #fff;
  178. padding: 10px;
  179. }
  180. div.export #dw__toc {
  181. margin-top: 0px;
  182. }
  183. #dokuwiki__content ul li {
  184. list-style: disc;
  185. }
  186. #dokuwiki__content ul li ul li {
  187. list-style: circle;
  188. }
  189. #dokuwiki__content #dw__toc ul li {
  190. list-style: circle;
  191. }
  192. #dokuwiki__content div.meltdown_bar ul li {
  193. list-style: none;
  194. }
  195. #dokuwiki__content div.diagram {
  196. margin-bottom: 1.5em;
  197. }
  198. #dokuwiki__content div.flowchartjs {
  199. overflow: auto;
  200. background: #f6f8fa;
  201. }
  202. .noteclassic, .noteimportant, .notewarning, .notetip {
  203. border-radius: 0px;
  204. }
  205. #dokuwiki__content h1,#dokuwiki__content h2{
  206. border-bottom: 1px solid #eaecef;
  207. padding-bottom: 0.3em;
  208. }
  209. .dokuwiki .plugin_wrap{
  210. overflow: auto;
  211. }
  212. ul, ol{
  213. padding: 0 0 0 0;
  214. }
  215. .dtree{
  216. font-size:13px;
  217. }
  218. .dokuwiki a.wikilink1{
  219. color:#08c;
  220. }
  221. del{
  222. color:#808080;
  223. }
  224. span.todohlght:hover{
  225. background: #eee;
  226. border-radius: 3px;
  227. }
  228. div.mode_show p a{
  229. display: inline-block;
  230. }
  231. .mode_search dl.search_results dt{
  232. color: #999;
  233. font-size:small;
  234. }
  235. dl.search_results dt a.wikilink1{
  236. color: #609;
  237. font-size: 18px;
  238. }
  239. .mode_search dl.search_results dd{
  240. color: #000;
  241. font-size:small;
  242. margin: 0 0 26px 0;
  243. }
  244. .mode_search .search_results strong.search_hit{
  245. color: #dd4b39;
  246. background: none;
  247. }
  248. .mode_search .page h1.sectionedit1,.mode_search .page div.level1 p{
  249. display: none;
  250. }
  251. .dokuwiki div.search_quickresult ul li{
  252. width: 24em;
  253. }
  254. .dokuwiki div.editbutton_table form div.no button, .dokuwiki div.editbutton_table form div.no input.button{
  255. background: #fefefe;
  256. border: 1px solid #eee;
  257. margin-left:0px;
  258. }
  259. .noteclassic, .noteimportant, .notewarning, .notetip{
  260. min-height: auto;
  261. }
  262. blockquote{
  263. color: #6a6a6a;
  264. }
  265. .dokuwiki .pageId {
  266. float: left;
  267. margin-top: 0px;
  268. padding-left: 0px;
  269. position: absolute;
  270. width: 5em;
  271. padding: 5px 0;
  272. }
  273. .dokuwiki .pageId #short-url{
  274. margin-top: -10px;
  275. width: 10px;
  276. height: 12px;
  277. border:#fff 0px solid;
  278. background: #fff;
  279. color: #fff;
  280. margin-left: 2px;
  281. }
  282. .dokuwiki .pageId #copy-url-btn {
  283. width: 5em;
  284. height: 20px;
  285. line-height: 20px;
  286. position: absolute;
  287. left: 1px;
  288. top: 1px;
  289. background: #eee;
  290. color: #08c;
  291. border: 0;
  292. border-radius: 0 0 5px 0;
  293. font-size: 13px;
  294. padding: 0px;
  295. }

3、lib/tpl/dokuwiki/tpl_header.php 改为:

  1. <?php
  2. /**
  3. * Template header, included in the main and detail files
  4. */
  5. // must be run from within DokuWiki
  6. if (!defined('DOKU_INC')) {
  7. die();
  8. }
  9. ?>
  10. <!-- ********** HEADER ********** -->
  11. <div id="dokuwiki__header">
  12. <div class="pad group">
  13. <?php tpl_includeFile('header.html') ?>
  14. <div class="tools group">
  15. <!-- USER TOOLS -->
  16. <?php if ($conf['useacl']): ?>
  17. <div id="dokuwiki__usertools">
  18. <h3 class="a11y"><?php echo $lang['user_tools']; ?></h3>
  19. <ul>
  20. <li id="site_home_l">
  21. <?php
  22. tpl_link(
  23. wl(),
  24. $conf["title"]
  25. );
  26. ?>
  27. </li>
  28. <li><?php tpl_searchform(); ?></li>
  29. <?php
  30. if (!empty($_SERVER['REMOTE_USER'])) {
  31. echo '<li class="user">';
  32. tpl_userinfo(); /* 'Logged in as ...' */
  33. echo '</li>';
  34. }
  35. tpl_toolsevent('usertools', array(
  36. tpl_action('recent', true, 'li', true),
  37. tpl_action('media', true, 'li', true),
  38. tpl_action('index', true, 'li', true),
  39. tpl_action('admin', true, 'li', true),
  40. tpl_action('profile', true, 'li', true),
  41. tpl_action('register', true, 'li', true),
  42. //tpl_action('login', true, 'li', true)
  43. ));
  44. if ($_SERVER['REMOTE_USER']) {
  45. tpl_toolsevent('usertools', array(
  46. tpl_action('login', true, 'li', true)
  47. ));
  48. }
  49. ?>
  50. <?php
  51. function get_current_url(){
  52. $current_url='http://';
  53. if(isset($_SERVER['HTTPS'])&&$_SERVER['HTTPS']=='on'){
  54. $current_url='https://';
  55. }
  56. if($_SERVER['SERVER_PORT']!='80'){
  57. $current_url.=$_SERVER['SERVER_NAME'].':'.$_SERVER['SERVER_PORT'].$_SERVER['REQUEST_URI'];
  58. }else{
  59. $current_url.=$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
  60. }
  61. return $current_url;
  62. }
  63. if (empty($_SERVER['REMOTE_USER'])) {
  64. echo '<li><a href="https://auth.xxx.com/api/login/?camefrom=dokuwiki&login_url='.rawurlencode(get_current_url()).'" class="action login" rel="nofollow" title="登录">登录</a></li>';
  65. }
  66. ?>
  67. </ul>
  68. </div>
  69. <?php endif ?>
  70. </div>
  71. <!-- BREADCRUMBS -->
  72. <?php if ($conf['breadcrumbs'] || $conf['youarehere']): ?>
  73. <div class="breadcrumbs">
  74. <?php if ($conf['youarehere']): ?>
  75. <div class="youarehere"><?php tpl_youarehere() ?></div>
  76. <?php endif ?>
  77. <?php if ($conf['breadcrumbs']): ?>
  78. <div class="trace"><?php tpl_breadcrumbs() ?></div>
  79. <?php endif ?>
  80. </div>
  81. <?php else: ?>
  82. <div class="breadcrumbs">
  83. </div>
  84. <?php endif ?>
  85. <hr class="a11y"/>
  86. </div>
  87. </div><!-- /header -->

4、lib/tpl/dokuwiki/css/content.less

  1. .dokuwiki.hasSidebar div.preview -> border-right:0px;
  2. [dir=rtl] .dokuwiki.hasSidebar div.preview -> border-left:0px;
  3. .dokuwiki table.inline tr:hover td {
  4. * //background-color: @ini_background_alt;
  5. }
  6. .dokuwiki table.inline tr:hover th {
  7. //background-color: @ini_border;
  8. }

5、lib/tpl/dokuwiki/main.php

  1. <!--<div class="pageId"><span><?php echo hsc($ID) ?></span></div>-->

6、lib/tpl/dokuwiki/css/mobile.less

  1. #dokuwiki__aside > .pad, [dir=rtl] #dokuwiki__aside > .pad
  2. border: 1px solid #a7d7f9;
  3. /* box-shadow: 0 0 .5em @ini_text_alt;*/

7、inc/html.php

  1. if(false && $wr && $conf['license']){...}

8、lib/tpl/dokuwiki/css/basic.less

  1. address {
  2. margin: 0 0 0.85em 0; /* bottom margin = line-height */
  3. padding: 0;
  4. }

短链

安装 ShortURL Plugin 插件 修改 lib/tpl/dokuwiki/main.php

  1. # 61
  2. function copyShortUrl() {
  3. var obj = document.getElementById("short-url");
  4. obj.select();
  5. document.execCommand("Copy");
  6. document.getElementById("copy-url-btn").innerText = "已复制";
  7. }
  8. </script>
  9. <?php
  10. $shorturl =& plugin_load('helper', 'shorturl');
  11. if ($shorturl) {
  12. $shortID = $shorturl->autoGenerateShortUrl($ID);
  13. $schema = $_SERVER['HTTPS'] ? 'https://' : 'http://';
  14. $shortUrl = $schema . $_SERVER['HTTP_HOST'] . '/' . $shortID;
  15. echo "<div class=\"pageId\">";
  16. echo "<input type=\"text\" id=\"short-url\" value=\"{$shortUrl}\">";
  17. echo "<button id=\"copy-url-btn\" onclick=\"copyShortUrl()\">复制短链</button>";
  18. echo "</div>";
  19. }
  20. ?>

修改index.php

  1. # 开头加上
  2. $shortId = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';
  3. if(preg_match('/\/[a-z0-5]{6}/', $shortId)) {
  4. header("Location: /x.php?id=" . $shortId);
  5. exit;
  6. }

自定义注册 & 登录支持

案例:在根目录下新加 login.php 文件,内容为:

  1. <?php
  2. define('AUTH_APP_KEY', 'xxx');
  3. define('DEFAULT_USER_PASS', '123456');
  4. define('LOGIN_TOKEN_SALT', 'xxx');
  5. if (isset($_GET['_ltoken']) && isset($_GET['username']) && isset($_GET['fullname']) && isset($_GET['mail'])) {
  6. $token = md5($_GET['username'] . $_GET['fullname'] . $_GET['mail'] . LOGIN_TOKEN_SALT);
  7. if ($token != $_GET['_ltoken']) {
  8. exit('Login token verify failed!');
  9. }
  10. $userInfo = array(
  11. 'username' => $_GET['username'],
  12. 'fullname' => rawurldecode($_GET['fullname']),
  13. 'mail' => $_GET['mail'],
  14. );
  15. } else {
  16. if (!isset($_REQUEST['token']) || !isset($_REQUEST['username'])) {
  17. exit('Paramater invalid.');
  18. }
  19. $sessionId = md5($_REQUEST['token'] . AUTH_APP_KEY . $_REQUEST['username']);
  20. $resp = file_get_contents('https://auth.xxx.com/api/info/?session_id=' . $sessionId);
  21. $userInfo = @json_decode($resp, true);
  22. if (!isset($userInfo['username']) || !isset($userInfo['fullname']) || !isset($userInfo['mail'])) {
  23. exit($resp);
  24. }
  25. }
  26. $username = $userInfo['username'];
  27. $fullname = $userInfo['fullname'];
  28. $mail = $userInfo['mail'];
  29. $_POST['u'] = $username;
  30. $_POST['p'] = DEFAULT_USER_PASS;
  31. $_SERVER['REQUEST_METHOD'] = 'post';
  32. //========Doku========
  33. if (!defined('DOKU_INC')) {
  34. define('DOKU_INC', dirname(__FILE__) . '/');
  35. }
  36. // define all DokuWiki globals here (needed within test requests but also helps to keep track)
  37. global $ACT, $INPUT, $QUERY, $ID, $REV, $DATE_AT, $IDX, $DATE, $RANGE, $HIGH, $TEXT, $PRE, $SUF, $SUM, $INFO, $JSINFO;
  38. $ACT = 'login';
  39. // load and initialize the core system
  40. require_once(DOKU_INC . 'inc/init.php');
  41. // check user exists.
  42. $authplain = new auth_plugin_authplain();
  43. // user not exists & create a new user.
  44. if ($authplain->getUserData($username) == false) {
  45. if ($authplain->createUser($username, DEFAULT_USER_PASS, $fullname, $mail, 'user') == null) {
  46. exit('Login failed(MESSAGE:write user infomation to file failed;CODE:1024)...');
  47. }
  48. $query = array(
  49. 'username' => $username,
  50. 'fullname' => rawurlencode($fullname),
  51. 'mail' => $mail,
  52. '_ltoken' => md5($username . rawurlencode($fullname) . $mail . LOGIN_TOKEN_SALT)
  53. );
  54. $location = '/login.php?' . http_build_query($query, null, '&');;
  55. header('Location: ' . $location);
  56. }
  57. //import variables.
  58. $id = 'sitemap';
  59. if (!empty($_REQUEST['login_url'])) {
  60. $urlArr = parse_url(rawurldecode($_REQUEST['login_url']));
  61. if (!empty($urlArr['query'])) {
  62. $tArr = explode('&', $urlArr['query']);
  63. foreach ($tArr as $param) {
  64. $tItem = explode('=', $param);
  65. if (count($tItem) == 2 && $tItem[0] == 'id') {
  66. $id = $tItem[1];
  67. break;
  68. }
  69. }
  70. }
  71. }
  72. //$INPUT->set('id', str_replace("\xC2\xAD", '', $INPUT->str('id')));
  73. $INPUT->set('id', str_replace("\xC2\xAD", '', $id));
  74. $QUERY = trim($INPUT->str('id'));
  75. $ID = getID();
  76. $INFO = pageinfo();
  77. // No event data
  78. $tmp = array();
  79. trigger_event('DOKUWIKI_STARTED', $tmp);
  80. //close session
  81. session_write_close();
  82. //do the work (picks up what to do from global env)
  83. act_dispatch();
  84. $tmp = array(); // No event data
  85. trigger_event('DOKUWIKI_DONE', $tmp);

其他

  1. inc/lang/{zh,en}/edit.txt \ 内容清空.

Dokuwiki 二次开发记录的更多相关文章

  1. OBS-Studio二次开发记录

    OBS-Studio 是一款跨平台的,开源的视频直播客户端软件. 公司需要对他进行二次开发,开发的目的是使用它的录屏功能. 开发的要求是:定制全新的界面,所见即所得,window系统兼容要好. 开发步 ...

  2. jquery easyui根据需求二次开发记录

    1.tree需要显示多个图标 实际需求:设备树上节点需搁三个图片,分别标识运行状态.告警状态.设备类型 解决方法:给tree的iconCls传入一个数组,分别是各状态下的class(css),然后要改 ...

  3. (dede)织梦系统二次开发笔记

    (dede)织梦系统二次开发记录 --soulsjie 一.模板常用文件说明 模板文件都在文件夹templets下,我们以默认模板(default)为例,对模板文件结构进行分析: 首页模板文件目录 \ ...

  4. NopCommerce上二次开发 触发器记录

    最近要在NopCommerce上二次开发. 开发也就算了,该项目的架构设计很好,但性能不可谓不低. 扯远了,为了保持项目以后升级顺利,开次开发不允许在原项目基础上大改,只能以插件形式开发…… 因一个功 ...

  5. 23 Pro/E二次开发中的问题记录

    0 引言 由于项目中涉及到Pro/E的二次开发技术,因此在边用边学的情况下,解决了不少问题,也积攒了不少问题.其中有些问题可能不是调个函数就能搞定的,得了解CAD底层的东西. 1 问题描述 (1)CA ...

  6. CozyRSS开发记录9-快速实现一个RSS解析器

    CozyRSS开发记录9-快速实现一个RSS解析器 1.再读RSS标准 既然需要自己实现一个RSS解析器,那自然需要仔细的读一读RSS的标准文档.在网上随便找了两份,一份英文一份中文: http:// ...

  7. 蓝凌OA二次开发手册

    1.蓝凌OA表单前端调用后台数据 一.后台存储过程: create procedure sp_test @ftext nvarchar(50) as begin select @ftext as '测 ...

  8. 关于FlexPaper 2.1.2版本 二次开发 Logo 、打印、搜索、缩略图、添加按钮、js交互、右键菜单、书签等相关问题

    2015-03-02 更新文章,由于需求修改,更改了flexpaper插件,故增加第9.10.11小节,下载代码时请注意. 先废话几句.最近用到文档在线浏览功能,之前用的是print2flash(一个 ...

  9. Android VLC播放器二次开发1——程序结构分析

    最近因为一个新项目需要一个多媒体播放器,所以需要做个视频.音频.图片方面的播放器.也查阅了不少这方面的资料,如果要从头做一个播放器工作量太大了,而且难度也很大.所以最后选择了VLC作为基础,进行二次开 ...

随机推荐

  1. 一步一步学Linq to sql(五):存储过程

    普通存储过程 首先在查询分析器运行下面的代码来创建一个存储过程: create proc sp_singleresultset as set nocount on select * from cust ...

  2. java字符流实现文件间的内容复制

    package com.io.demo1; import java.io.FileReader; import java.io.FileWriter; public class TestFileSTr ...

  3. 一次和别人争吵一个按钮,点击后显示导航;再点击不显示的效果,是否一定以及必须用js?

    事情经过是这样的,我们组一个说话很喜欢用一定,肯定的哥们,吃午饭的时候拿了自己做的一个UI库,头部有一个按钮 点击展开,再次点击收缩,他意思说一个按钮无法记录点击状态,必须使用js.然后我看了一眼,心 ...

  4. Python网络编程(socketserver、TFTP云盘、HTTPServer服务器模型)

    HTTP协议? HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型.HTTP是一个无状态的协议. 通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了 ...

  5. TensorFlow 常见错误与解决方法——长期不定时更新

    1. TypeError: Cannot interpret feed_dict key as Tensor: Can not convert a builtin_function_or_method ...

  6. 在 C/C++ 中使用 TensorFlow 预训练好的模型—— 间接调用 Python 实现

    现在的深度学习框架一般都是基于 Python 来实现,构建.训练.保存和调用模型都可以很容易地在 Python 下完成.但有时候,我们在实际应用这些模型的时候可能需要在其他编程语言下进行,本文将通过 ...

  7. 分词(Tokenization) - NLP学习(1)

    自从开始使用Python做深度学习的相关项目时,大部分时候或者说基本都是在研究图像处理与分析方面,但是找工作反而碰到了很多关于自然语言处理(natural language processing: N ...

  8. 软件工程项目组Z.XML会议记录 2013/09/25

    软件工程项目组Z.XML会议记录 [例会时间]2013年9月25日周三21:30-22:10 [例会形式]小组讨论 [例会地点]三号公寓楼会客厅 [例会主持]李孟 [会议记录]肖俊鹏 会议整体流程 签 ...

  9. hadoop 集群常见错误解决办法

    hadoop 集群常见错误解决办法 hadoop 集群常见错误解决办法: (一)启动Hadoop集群时易出现的错误: 1.   错误现象:Java.NET.NoRouteToHostException ...

  10. mootools框架里如何使用ajax

    ajax可通过直接写源码实现,但有点繁琐,现在流行的ajax框架都集成了ajax的功能,而且写起来非常简单方便.当然mootools也不例外.mootools是一个非常优秀的javascript的库, ...