====== DokuWiki PHP埋め込みのあれこれ ======
DokuWiki には、コンテンツに直接PHPを記述できる、とても**便利で危険**な機能があります。
この機能を投稿が公開された Wiki で有効にすれば、まず間違いなく問題が起こるでしょう。
名前空間毎に有効、無効を切り替えられればいいのですが、そういった機能は無いので、コンテンツの編集が管理者に閉じられた Wiki でしか使えません。
普段は静的なコンテンツを記述しているけど、一部だけ DB から値を読み出したい!という場合に便利です。
DB から値を読み出すだけであれば、HTML埋め込み機能を利用してフロントを Vue.js で記述し WebAPI を用意してクライアントサイドで描画する、という手もあるのですが、
* DB から読み出す値が SEO に関係する
* DB から読み出す値を ACL を介して表示したい
等の場合は、サーバーサイドで処理した方が良い結果を得られると思います。
===== 実行パスの調査 =====
以下のコードを埋め込むことで、埋め込まれた PHP が実際に何処で実行されているかが判ります。
echo __FILE__ . PHP_EOL;
echo __DIR__ . PHP_EOL;
以下が実行結果です。
echo __FILE__ . PHP_EOL;
echo __DIR__ . PHP_EOL;
${DOKU_ROOT}/inc/parser/xhtml.php(549) : eval()'d code
${DOKU_ROOT}/inc/parser
悪名高き eval() が実行されていることが判ります。**ご利用は計画的に。。。**
https://www.php.net/manual/ja/function.eval.php
実行ファイルパスが判ったので、autoload 等を相対パスで呼び出せます。
# 絶対パスで autoload を呼んでもいいのですが、環境依存になるので避けたいところです。
===== サーバー変数の調査 =====
その他、サーバー変数に設定されている値なども、同じ様に調査できます。
echo '';
var_dump($_SERVER);
echo '
';
出力結果は省略します。みなさんの DokuWiki 環境で実際に試してみてください。
//echo '';
//var_dump($_SERVER);
//echo '
';
===== グローバル変数の調査 =====
グローバル変数も同様です。ここには DokuWiki 特有の値も含まれているため、いろいろ活用できます。
例えば、現在のユーザーに関する情報を以下の様に参照できます。
echo '';
var_dump($GLOBALS['INFO']['userinfo']);
echo '
';