Block: Last blog entries (updated_blog)

Block: Last blog entries (updated_blog)

- Tatsuya Shirai の投稿
返信数: 7

 学生から,blogを作業日誌に使うから,ブログの更新も”最近の活動”に表示して欲しいと頼まれました.ちょっとそれは無理かな?と思ったのですが,以前に見付けたupdated_blog(Modules and PluginsにはLast blog entriesという名前で登録されている...)をコースに追加しました.Lude氏がアップロードしたものです.

 ただ,このブロックのソースの,block_updated_blogs.phpは2つのNoticeを出す上に,ファイル終端に無駄な改行があるため誤動作します.とりあえずの修正箇所を

http://moodle.org/mod/forum/discuss.php?d=48994#p535932

にアップしておきました.ブロック自体はとても有益なものです.

Tatsuya Shirai への返信

Re: Block: Last blog entries (updated_blog)

- Tatsuya Shirai の投稿

お勧めしておいて,よく見てみると色々と不具合がありましたね,このブロック.

 とりあえず気付いた問題点は全て解決しました.

  1. 最低限のワーニングを表示しないようにする改善
  2. 日付を言語パックで設定した形式で表示する改良
  3. 姓名を言語パックで指定した順序で表示する改良
  4. コースに登録された者のブログの更新のみを表示する改良

 1は,ともかく先に報告させて頂いたバグの修正と,新たにフロントページにブロックを表示した際に生じる警告を出ないようにしました.

 2と3は,まぁ,海外製のブロックですので不親切ですね.userdate()とfullname()という関数が用意される前に開発されたものかも知れません.単にこの二つの関数を使用するように修正しただけです.

 4は,機能の拡張です.オリジナルのままですと,サイト上に公開された全てのブログを対象に,最新のものをリストアップしてしまいます.フロントページに配置した場合はそれで良いのでしょうが,コースの中に配置した場合にはそのコースに入室可能な者以外のブログの更新を知らせても意味がありません.user/view.phpを参考にして,そのコースIDでの最終アクセス記録(mdl_user_lastaccess)と付きあわせて記録のあるエントリのみを選択するようにSQLを拡張しました.そのコースには属しているが,まだコースに入室したことが無ければ更新したエントリがリストアップされない問題はありますが,まぁ,アクティブではないのですから仕方が無い(逆に好都合?).

 修正点が多いので,現時点での最新のソースに修正を加えた結果を貼付します.ここまで手を加えれば文句なしです.お使いの上で何か問題がありましたらご連絡下さい.


開発チーム(?)はあまり活発に活動している感じがありません.moodle.org以外のサイトでも公開しているようですので開発を止めた訳では無さそうですが...とはいえ例えばMoodle2.0になって使えなくなったら致命的,というタイプのブロックではありません(一応,私もしばらくはウォッチし続けます.学生が使いたいと言う以上は).

Tatsuya Shirai への返信

Re: Block: Last blog entries (updated_blog)

- Tatsuya Shirai の投稿

 驚きました.ブログ大活躍です.ある特定のプロジェクト活動のコースなのですが,作業日誌もあれば日々のボヤキもあり,ともかく活発に活用する学生は一日に2つも3つもアップするので最新10項目の表示では足りないのではないかという勢いです.

 それだけ使い込んでみて,小さな問題ですが使い勝手に大きく影響するミスが発覚しました.blog/index.phpとuser/view.phpを呼び出すインタフェースになっているのですが,このそれぞれに対してコースIDを渡し忘れています.これを付けてあげるだけで,ブログやユーザプロファイル画面から元のコースへスッと戻れる(フッターのリンクが元のコースを指し示す),コースエントリー(そのコースに属するメンバの書いた全ブログを新しい順に表示する機能)が有効になります.修正箇所は3箇所,全てblock/updated_blogs/block_updated_blogs.phpです.なお,$COURSEは以前にアップしたパッチでglobal化されているという前提です.(1)と(2)の修正箇所に関わります.

(1) class block_updated_blogs, function get_content()

            switch($layout) {
            case "columns":
                $text = '<table width=100% class="sideblock content block_updated_blogs">';
                $text .='<th>'.get_string('page').'</th><th>'.get_string('date').'</th><th>'.get_string('user').'</th>';
                foreach ($rows as $row){
                    $info=get_user_info_from_db('id',$row->userid);
// (3rdParty012): コースIDをパラメータとして渡す改良 (2009/07/13) (Updated_Blogs)
// (3rdParty012): <a href=の行を修正
                    $text.= '<tr>
                        <td align="left" class="block_updated_blogs_blogend_table">
                            <a href="'.$CFG->wwwroot.'/blog/index.php?postid='.$row->id.'&courseid='.$COURSE->id.'">'.$row->subject.'</a>
                        </td>
                        <td align="right" class="block_updated_blogs_blogend_table">'.

(2) class block_updated_blogs, function get_content()

            case "rows":
// (3rdParty008): 最低限のワーニングを表示しないようにする改善 (2009/04/30) (Updated_Blogs)
// (3rdParty008): ここから追加
                if (empty($text)) $text = '';
// (3rdParty008): ここまで追加
                $lastlastmodified = "";
                foreach ($rows as $row){
                    $info=get_user_info_from_db('id',$row->userid);
// (3rdParty009): 日付を言語パックで設定した形式で表示する改良 (2009/04/30) (Updated_Blogs)
// (3rdParty009): ここから修正
//                  $lastmodified = date("D, d M y" ,$row->lastmodified);
                    $lastmodified = userdate($row->lastmodified);
// (3rdParty009): ここまで修正
                    if($lastmodified != $lastlastmodified) {
                        $lastlastmodified = $lastmodified;
                        $text.= '<div class="block_updated_blogs block_updated_blogs_modified">'.
                                $lastmodified.
                            '</div>'."\n";
                    }
// (3rdParty012): <a href=の行を修正
                    $text .= '<div class="block_updated_blogs">
                            <a href="'.$CFG->wwwroot.'/blog/index.php?postid='.$row->id.'&courseid='.$COURSE->id.'">'.$row->subject.'</a>
                        </div>'."\n".'
                        <div class="block_updated_blogs blogend">'.
                            $this->get_user_info($info->username,20,true).
                        '</div>'."\n";

(3) function get_user_info()

    if (record_exists("user", 'username',$user)){
        $info=get_user_info_from_db('username',$user);
        $picture = print_user_picture($info->id, $course->id, $info->picture, $size, true,true);
        if ($puttext){
// (3rdParty010): 姓名を言語パックで指定した順序で表示する改良 (2009/04/30) (Updated_Blogs)
// (3rdParty010): ここから修正
//          $text = '<a href="'.$CFG->wwwroot.'/user/view.php?id='.$info->id.'">'.$info->firstname.' '.$info->lastname.'</a>';
// (3rdParty012): ここから修正
//
          $text = '<a href="'.$CFG->wwwroot.'/user/view.php?id='.$info->id.'">'.fullname($info).'</a>';
            $text = '<a href="'.$CFG->wwwroot.'/user/view.php?id='.$info->id.'&course='.$course->id.'">'.fullname($info).'</a>';
// (3rdParty012): ここまで修正
// (3rdParty010): ここまで修正
        } else {
            $text = '';
        }
        //        $text = print_r($info, true);
    }else{

Tatsuya Shirai への返信

Re: Block: Last blog entries (updated_blog)

- Tatsuya Shirai の投稿

 うーむ,標準のブログでも,「編集」と「削除」でコースIDを渡していませんね...ここまでサクサクとコースIDを渡して(つまりいつでも元のコースに戻れるようなショートカットがフッターに,ナビゲーションがトップに)表示されているのに,過去のブログを修正したり削除した途端に途切れてしまう.

Tatsuya Shirai への返信

Re: Block: Last blog entries (updated_blog)

- Tatsuya Shirai の投稿

(注意)この添付されているソースリストはバグがあり,正しく動作しません.現在,改善中です.完成しましたら改めてご報告します. → 完成しました(2009/07/20).


 機能拡張を行いました.

 現在,そのコースにログインしたことのある学生のブログのみを表示する機能が組み込まれています.さらに追加で,一人あたり最新の一件分のみをリスト表示するモードを追加しました.旧来のように全てのブログエントリを単に新しい順に表示することもできます.
 これはあるコースに属するメンバがある程度の人数より多く,しかも皆が積極的に書き込みを行い過ぎると(たとえば10個の)エントリのリストからアッと言う間に消え去ってしまうのを防ぐのが目的です.

 さらに,データベースの検索にメモリ使用量が増大する問題がありました.投稿日順にソーティングした全ブログの全フィールドを変数に読み込むコーディングになっています.つまりブログが10万件あれば10万件全てのデータをメモリに読み込みます.実際にはブログの本文はこのブロックで全く使用しません.したがってどうしても必要な情報(userid, id, subject, modified)のみをSELECTするように変更しました.大規模なサイトですと,これでもメモリ不足になる恐れがありますが,とりあえずここまでにしておきます.

 言語ファイルに2つの単語を追加しましたので,langフォルダ内の英語の言語ファイルもコピーした方が良いでしょう.もし単語のエントリが発見できなかった場合は日本語の単語を出力するようにプログラム内にハードコーディングしてありますので,コピーしなくても大丈夫ではありますが,念のために.

#なかなか本業に戻れない...

 さて,オリジナルのブロックに手を加えていたのですが,もう限界です.修正と追加だけでは原型を留めないため,修正箇所をオリジナルに合体させ,さらにオリジナルのコードの冗長な箇所をまとめ直しました.style.phpにも手をいれてあります.

Tatsuya Shirai への返信

Re: Block: Last blog entries (updated_blog)

- Tatsuya Shirai の投稿

 Using moodleに改良版をアップロードしたところ,二つの不具合が報告されました.一つは私のミス,もう一つはオリジナルのミスなのか仕様なのか微妙な問題.

 どちらもゲストログインしたユーザに対しての問題です.一つはフロントページにUpdated_blogsブロックを配置した場合に表示モード切替が働かない問題です.courseIDを1(=SITEID)でリンクさせていたのですが,ゲストの場合はmoodle/index.phpにリダイレクトされてしまうため,パラメータが正しく渡されていませんでした.
 もう一つは,世界中に公開される設定になっていないブログのエントリもリスト表示されてしまうという問題.元のUpdated_blogsブロックもそのようになっていますし,そのリストアップされたブログへのリンクをクリックするとブログが表示されます.ええと,どうなんでしょう.ゲストとは言ってもコースにログインしたのだからサイト公開のみのブログも表示して構わないという仕様なのでしょうか? スパマー対策? まぁ,利用者サイドからすれば「世界中から見えているジャン!」(しかもフロントページにブロックが配置されたらド派手に目立つ...)でビックリでしょうから,これは指摘のあったように表示しない仕様が利用者に優しいですね.

 という訳で,こちらが修正版です.

Tatsuya Shirai への返信

コースIDをきちんと渡して活用する

- Tatsuya Shirai の投稿

 オリジナルのMoodleではブログを書いたり,編集したりするたびにコースIDの情報が渡されないために戻り先のリンク(画面下)やナビゲーションバー(画面上)がHOMEに戻ってしまいます.コースからUpdated_blogsブロックなどでブログを閲覧し,新規エントリを追加するたびに元のコースに戻るのが非常に億劫です.

 きちんとコースIDを渡すように修正するととても気持ちよくblogを利用可能になります.この改良をこちらにまとめました.完璧ではありません.いくつかのめったに使わない機能に関しては対策を行っていません.日常的にブログを書いたり編集したり検索したり,タグを関心付けしたりタグでブログを検索したり,といった作業を行う際に頻繁に利用される箇所のみです.

 この改造とUpdated_blogsブロックを組み合わせれば,皆さんのサイトのblog使用率は確実にアップします! 保障します.

 修正箇所はMoodle1.9用のみです.時間が無いものでして...