moodle1.8.1+を使用しています.
以前から気になっていたのですが,Wikiのデータを表示する際に,時折,添付したファイル(上は正常な時,下は表示されない時の画面)のように選択したページの中身が表示されないことがあります.[編集]タブを一旦,選択してから[表示]タブを選び直すと表示されますので,「まぁ,いいか」と気にしないことにしていました.しかし,近頃,かなりの作業をWiki上で行なうようになってきてからは,この現象があまり無視できなくなってきました.日本語を使用しているのが原因だとすると放置しておく訳にはいかないでしょう.
この現象,他の方々の環境でも発生しているのでしょうか?
根本的な原因ではありませんが,どのようなメカニズムに関係しているのか,までは分かりました.キャッシュです.
画面に表示するテキストデータをそのまま出力するのではなく,選択したオプションに従って余計な文字を取り除いたり,付加したりするフィルタ処理を行うformat_text()関数に組み込まれている機能です.format_text()関数のオーバーヘッドを抑えるために,既に一回,同じデータを同じオプションで一定時間以内に処理したのであれば,その処理結果をMySQLに(MD5ハッシュ文字列をキーとして)キャッシュしておくことで,同じ整形処理をもう一度行なわずに,キャッシュのデータをデータベースから読み出して再利用します.
ewiki_page()でデータベースから獲得した$contentを単にprint()している箇所でこの現象が発生しています.データベースから獲得したWikiのデータを画面に表示する前に,lib/weblib.php中のformat_text()でフィルタリングする際に,まずデータベース上に成型済みのデータがキャッシュされていないかどうかを調べています.そしてmd5ハッシュが同一であるデータがデータベース中にキャッシュされているのを見付けたら,整形処理は行わず,そのデータをformat_text()の戻り値としてmod/wiki/view.phpに返します.このキャッシュから受け取ったデータがおかしい.
厳密に言うと,まず$pagenameに対応するwikiデータをデータベースからewiki_page()で獲得してきます.どうやらこの関数の奥の方で,一旦,format_text()を呼んでいるようです.この段階では$contentはWikiタイトルなどは含まれず,単に本文だけのデータでした.その後,ewiki_page()から戻ってくるまでの間に$contentには他の情報(タイトルなど)が追加されて戻ってきます.ヘッダー情報やシンプルボックスを出力した後に,print(format_text($content, $moodle_format));で$contentを出力します.この段階で$contentは正しい情報を持っているにも関わらず,format_text()からの戻り値が期待通りではありません.キャッシュが無効な時は正しく表示され,キャッシュが有効になるとhtmlタグの一部のみが表示されるだけです.
キャッシュの格納段階でおかしいのか,それとも読み出しでおかしいのか,まだ分かりません.ただ,消極的な対処方法だけは見つけました.wikiの本文を表示する時だけはキャッシュを無効にする方法です.以下にその修正箇所を示します.
print_simple_box_start('center', '100%', '', '20');
/// Don't filter any pages containing wiki actions (except view). A wiki page containing
/// actions will have the form [action]/[pagename]. If the action is 'view' or the '/'
/// isn't there (so the action defaults to 'view'), filter it.
/// If the page does not yet exist, the display will default to 'edit'.
if((count($actions) < 2 || $actions[0] == "view") && $wiki_entry &&
/// Don't filter any pages containing wiki actions (except view). A wiki page containing
/// actions will have the form [action]/[pagename]. If the action is 'view' or the '/'
/// isn't there (so the action defaults to 'view'), filter it.
/// If the page does not yet exist, the display will default to 'edit'.
if((count($actions) < 2 || $actions[0] == "view") && $wiki_entry &&
record_exists('wiki_pages', 'pagename', addslashes($page), 'wiki', $wiki_entry->id)) {
// print(format_text($content, $moodle_format));
$options->nocache = true;
print(format_text($content, $moodle_format, $options));
} else if($actions[0]=='edit' && $reallyedit) {// print(format_text($content, $moodle_format));
$options->nocache = true;
print(format_text($content, $moodle_format, $options));
繰り返しますが,根本的な解決では無いでしょう.キャッシュを使用しないで毎回,Wikiのページを表示するたびにテキストデータの整形処理を行うため効率は落ちるのだと思います(うちの環境ではデータベースへのアクセスの方が負担が大きいのでは?).長々とすみません.もし他の方の環境でも発生する問題ならば,もう少し詳しく調べてみます.