高度な”フォーラムの検索”に”このフォーラム”の選択肢が欲しい

高度な”フォーラムの検索”に”このフォーラム”の選択肢が欲しい

- Tatsuya Shirai の投稿
返信数: 4

 フォーラム中のディスカッションを表示した状態で,画面の上の方にフォーラムを検索する”というフォームが現れます.このフォームに検索語を入力して検索を行うと,そのコース内の全てのフォーラムを対象として検索が行われます(これもどうかなぁと思う).特定のフォーラム内だけで検索を行うには,フォームに何も入力しないで”フォーラムの検索”をクリックすると表示される高度なフォーラムの検索画面で,”検索するフォーラム”のプルダウンリストから検索対象とするフォーラムを一つ選べばよい.

 この”検索するフォーラム”のリストの一番上に”すべてのフォーラム”という選択肢があります.その下にはそのコース内の全てのフォーラムが列記(これがアルファベット順などに並び替えられていないのもどうかなぁと思います)されます.いま自分が読んでいたフォーラムの名前を覚えていれば問題は無いのですが,もし覚えていたとしてもUsing Moodleのようにフォーラムの数が膨大な数の場合には探すのに手間取る.もし間違えて違うフォーラムを検索するのも怖いですね.

 そこでこの”検索するフォーラム”のリスト中に”すべてのフォーラム”同様,”このフォーラム”という選択肢が欲しいです.

 いまこの機能が実装されていないのは,高度なフォーラムの検索画面にフォーラムIDを引き渡していないことが原因だと思います.コースの表示から順に高度なフォーラムの検索画面までのURLの変化の例を示します.

  1. コースの表示(moodle/course/view.php?id=15):idはコースid
  2. フォーラムのディスカッショントピックの一覧の表示(moodle/mod/forum/view.php?id=364):idはフォーラムid?
  3. そのうちの一つのトピック(および返信)の表示(mod/forum/discuss.php?d=339):idはディスカッショントピックのid
  4. ”フォーラムの検索”を押して高度なフォーラムの検索画面を表示(mod/forum/search.php?search=&id=15):idはコースid
  5. 実際に検索を行う(mod/forum/search.php?id=15&words=Wiki&phrase=&notwords=&fullwords=&hfromday=1&hfrommonth=1&hfromyear=1&hfromhour=1&hfromminute=1&htoday=1&htomonth=1&htoyear=1&htohour=1&htominute=1&forumid=115&subject=&user=):idとforumidがある.idはコースidのようだが,forumidは2の数字と異なります.2のidはフォーラムのidではない?

コースidは1から2,3を経由して4に引き渡されているので,URLに含ませる方法とは別の方法で渡している($SESSION?)ようですので,フォーラムidも同様に引き渡されている可能性があります.4の段階でフォーラムidを得られれば,”このフォーラム”を”検索するフォーラム”に組み入れることができそうな気がします.

 全フォーラムを対象に検索を行うよりも,現在閲覧中のフォーラム内の検索を行う機会の方が圧倒的に多いのではないでしょうか?

 

Tatsuya Shirai への返信

Re: 高度な”フォーラムの検索”に”このフォーラム”の選択肢が欲しい

- Tatsuya Shirai の投稿

 mod/forum/search.phpのfunction forum_print_big_search_form($course)中,356行の

    echo '<tr>';
    echo '<td class="c0">'.get_string('searchwhichforums', 'forum').':</td>';
    echo '<td class="c1">';
    choose_from_menu(forum_menu_list($course), 'forumid', '', get_string('allforums', 'forum'), '');
    echo '</td>';
    echo '</tr>';

このchoose_from_menu()の3個目の引数にフォーラムIDを代入すれば,指定されたフォーラムIDがforum_menu_ist()の中に含まれるのであれば,それが選択された状態で”検索するフォーラム”のリストが表示されますね.「このフォーラムを検索」よりは手を入れる箇所が少なくても済みそうです.

forum_print_big_search_forum()の引数が$courseだけなので,これに$forumidを追加すれば大丈夫かな?

 

Tatsuya Shirai への返信

Re: 高度な”フォーラムの検索”に”このフォーラム”の選択肢が欲しい

- Tatsuya Shirai の投稿

 2回目以降の検索では,先の検索時に選択したフォーラムIDが引き渡されるので,うまく行きましたが,最初の検索時にはforumidが渡されていないため,”すべてのフォーラム”が選ばれた状態のままですね.初めてmod/forum/search.phpを呼ぶときにもフォーラムIDを引き渡す必要がありますねぇ.

Tatsuya Shirai への返信

Re: 高度な”フォーラムの検索”に”このフォーラム”の選択肢が欲しい

- Tatsuya Shirai の投稿

 一応,試験的には成功しました.

 ただ,この一つの小さな改善のために,

  • mod/forum/search.php
  • mod/forum/discussion.php
  • mod/forum/lib.php

の3箇所を修正しなくてはいけない上に,”search.phpの1回目の呼び出し時だけ特別なパラメータ引渡しを行う”という美しくない手を使っている点が気に掛かります.

 今回手を入れた関数は数箇所から呼ばれる関数ですので,もしかしたら副作用があるかも知れません.もう少しだけチェックしてから公開します.

Tatsuya Shirai への返信

Re: 高度な”フォーラムの検索”に”このフォーラム”の選択肢が欲しい

- Tatsuya Shirai の投稿

 修正するファイルを2つに減らしました.今のところ,副作用は確認されていません.

(A) mod/forum/search.php
(A-1) 20行近辺

    $user    = trim(optional_param('user', '', PARAM_NOTAGS));    // Names to search for
    $userid  = trim(optional_param('userid', 0, PARAM_INT));      // UserID to search for
    $forumid = trim(optional_param('forumid', 0, PARAM_INT));      // ForumID to search for
    $subject = trim(optional_param('subject', '', PARAM_NOTAGS)); // Subject
    $phrase  = trim(optional_param('phrase', '', PARAM_NOTAGS));  // Phrase
    $words   = trim(optional_param('words', '', PARAM_NOTAGS));   // Words
    $fullwords = trim(optional_param('fullwords', '', PARAM_NOTAGS)); // Whole words
    $notwords = trim(optional_param('notwords', '', PARAM_NOTAGS));   // Words we don't want
    $defaultforumid = trim(optional_param('frmid', 0, PARAM_INT)); // (ADD)

    $timefromrestrict = optional_param('timefromrestrict', 0, PARAM_INT); // Use starting date
    $fromday = optional_param('fromday', 0, PARAM_INT);      // Starting date

(A-2) function forum_print_big_search_form(): 358行近辺

     echo '<tr>';
    echo '<td class="c0">'.get_string('searchwhichforums', 'forum').':</td>';
    echo '<td class="c1">';
// 以下,コメントアウト
//
  choose_from_menu(forum_menu_list($course), 'forumid', '', get_string('allforums', 'forum'), '');
// 追加(ここから)
    global $defaultforumid, $forumid;
    if (($defaultforumid > 0) && ($forumid <= 0)) $forumid = $defaultforumid;
    choose_from_menu(forum_menu_list($course), 'forumid', $forumid, get_string('allforums', 'forum'), '');
// 追加(ここまで)
    echo '</td>';
    echo '</tr>';

(B) mod/forum/lib.php
function forum_search_form() : 2721行近辺

function forum_search_form($course, $search='') {
    global $CFG;
    global $forum; // (ADD)

    $output  = '<div class="forumsearch">';
    $output .= '<form action="'.$CFG->wwwroot.'/mod/forum/search.php" style="display:inline">';
    $output .= '<fieldset class="invisiblefieldset">';
    $output .= helpbutton('search', get_string('search'), 'moodle', true, false, '', true);
    $output .= '<input name="search" type="text" size="18" value="'.$search.'" alt="search" />';
    $output .= '<input value="'.get_string('searchforums', 'forum').'" type="submit" />';
    $output .= '<input name="id" type="hidden" value="'.$course->id.'" />';
    if ($forum->id != '') $output .= '<input name="frmid" type="hidden" value="'.$forum->id.'" />'; // (ADD)
    $output .= '</fieldset>';
    $output .= '</form>';
    $output .= '</div>';

    return $output;
}