少し機能を見直したところ,ぐっと使いやすくなりました.
追加したのは,mod/forum/discussion.phpの冒頭,
require_once("../../config.php");
require_once('lib.php');
// (Shirai085): ここから追加
if (is_trialreading_on()) $CFG->forum_usermarksread = true;
// (Shirai085): ここまで追加
$d = required_param('d', PARAM_INT); // Discussion ID
$parent = optional_param('parent', 0, PARAM_INT); // If set, then display this post and all children.
この1行だけです.$CFG->forum_usermarksreadはフォーラム未読/既読のチェックをユーザが行なうか,それとも自動で行なうのかを判断するために用いられるサイト単位の設定値で,この変数をtrueにすると,添付した図のように”未読にする”,”既読にする”の選択肢が各投稿に追加表示されます.さらに,ディスカッションを表示しても自動的には既読になりません.
is_trialreading_on()は,fs_moodle用に作った関数で,”チョイ読み機能がOn”の場合にtrueを返します.$CFG->forum_usermarksreadは,mod/forum/lib.phpで初期設定されますので,require_once('lib.php')の直後に値を変更し,”チョイ読み中”ならば強制的にtrueにします.
この追加を行なうことで,一時的に既読/未読をユーザが自由にコントロールできるようになります.ただし,「サイト管理」-「モジュール]-「活動」-「フォーラム」の”投稿を既読とする日数”(forum_oldpostdays)を過ぎた古い投稿は原理的に既読/未読をOn/Offできません.これはMoodleの仕様です.ユーザ毎のディスカッションの未読/既読はデータベース中のmdl_forum_readに一つずつのディスカッションに対して全てが記録されています.既読かどうかはこの項目をサーチして判断します.いつまでも記録を残しておくとデータベースがパンクしてしまうので,一定の日数を経過したデータは破棄する処理が行われているのでしょう.
本来,この未読/既読をユーザが設定できる機能のOn/Offはサイト単位でしか設定できない機能です.正確には「サイト管理」-「モジュール」-「活動」-「フォーラム」の”投稿を手動で既読にする”であり,デフォルトではOffです.もしOnにすると,ユーザはチェックした投稿を一つずつ”既読にする”をクリックしなくてはならなくて面倒です.このサイト単位の設定をユーザ単位で一時的にOn/Offできるようにした訳です(”未読の管理をするか,しないか”とは別の次元の設定です).でもこの設定,ユーザの好みがあるのだから,本当はユーザプロファイルで選択できた方が良いです.さらに,自動的に既読にしてしまうのはともかくとて,自由に”未読”に戻せる機能は本来のMoodleでも持っていて欲しい機能ですよね.
さらに,$CFG->forum_usermarksreadをtrueにすれば,以前に”チョイ読み機能”を実現する際に,未読の管理を行なう(既読の管理というべきかな?)関数であるforum_tp_mark_post_read()の呼び出しをパスする必要もありません.そもそものコードが,
if ($istracked && !$CFG->forum_usermarksread && !$post_read) {
forum_tp_mark_post_read($USER->id, $post, $forum->id);
}
このように,$CFG->forum_usermarksreadを含んでいたからです(笑).もっと早く気付くべきでした.
”チョイ読み”としては当初,未読フラグをクリアさせない,という思想のみ実装を始めた機能ですが,結局は,ユーザによる手動の既読/未読管理を随時,On/Offできる機能も簡単に組み込むことができました.これで「あ,しまった,チョイ読みをOnにしないでフォーラムを開いてしまった!」とガッカリすることが無くなりましたし,以前に読んだ投稿(設定値,デフォルトは2週間以内)も既読から未読にも戻せます.副作用さえ発生しなければ,フォーラム閲覧の自由度が格段に上がります.
明日公開予定のfs_moodle3.02.01にはこの機能を組み込みます.
まとめると,(すみません,調査と並行しながら記述したら長くなってしまいました)
-
チョイ読みをOn/Offするボタンを画面下に追加して,状態をクッキーで管理する
-
ディスカッショントピックスの一覧表示画面などに「いまチョイ読み中」かどうかの状態表示
-
mod/forum/discussion.phpのrequire_once('lib.php');の次の行に,もしチョイ読み機能がOnならば$CFG->forum_usermarksreadをtrueにするコードを1行追加
これだけでOKです.1と2に関しては皆さんが改造しようとするMoodleの思想に合わせて考えれば良いでしょう.3の機能を1行追加するだけで,とても便利になる,これが今回の報告の全てです.なお,3ですが,Moodle1.8とMoodle1.9とでは,require_once('lib.php');の位置が違います.では,lib.phpの最後に3のコードを追加すれば...という考えも頭の片隅を過ぎりましたが,lib.phpはdiscussion.php以外からも呼び出されるので,副作用が発生する恐れがあります.たとえばforum_cron()でも$CFG->forum_usermarksreadを参照しています.こちらに悪影響を与える可能性がありますので,discussion.phpの冒頭が無難です.