====== 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 '
';