デバッグ中の作業メモ

提出された課題の一覧表示のソーティングにユーザー名を追加したい

 
Picture of 達也 白井
提出された課題の一覧表示のソーティングにユーザー名を追加したい
by 達也 白井 - Monday, 28 April 2014, 9:43 AM (ID:19528)
 

 本校ではユーザー名に学籍番号を割り当てている.したがってソーティングするならばこれが良い.

 現状ではユーザー画像(アイコン)でソーティングできるという謎機能はともかく,ユーザー名が表示されない.
 セキュリティ上,ユーザー名もパスワード同様に秘匿したい(ユーザーによって変更可能としている場合においては)という気持ちも分からなくは無いが….

 同様の機能改良は(Shirai005)にてユーザー登録の管理の場面では実装済み.この画面にアクセスできるのはサイト管理者であり,当然,ユーザー名も表示する権限があるのでその点は問題ではない.

 とりあえず過去の改良点を…あれ?番号が分からない.

Picture of 達也 白井
Re: 提出された課題の一覧表示のソーティングにユーザー名を追加したい
by 達也 白井 - Monday, 28 April 2014, 9:47 AM (ID:19529)
 

Moodle1.9のmod/assign/view.phpを見て見よう.あ,Moodle1.9ではmod/assignment/view.phpですね.

実際には課題の種類ごとに読み込むクラスファイルが異なるのか.面倒だからgrepを掛けてリストを取得して見よう.

うーん? Moodle1.9では評定におけるアカウント名によるソーティングは実装しなかった? あるいは設定で追加可能なのかな?

 

 

Picture of 達也 白井
Re: 提出された課題の一覧表示のソーティングにユーザー名を追加したい
by 達也 白井 - Monday, 28 April 2014, 12:34 PM (ID:19530)
 

mod/assign/view.phpで,action='grading'の際に呼ばれるのは,mod/assign/locallib.phpのclass assignのfunction view_grading_page()である.

mod/assign/gradeform.phpが読み込まれる.課題の種類には依らないみたいだ.だが,このgradingform.phpの中にはテーブルを表示する機能は無い.

そしてそこからview_grading_table()とview_footer()が呼ばれる.あ,これらはmod/assign/locallib.phpの$thisに含まれるらしい.

 

Picture of 達也 白井
Re: 提出された課題の一覧表示のソーティングにユーザー名を追加したい
by 達也 白井 - Monday, 28 April 2014, 5:59 PM (ID:19531)
 

mod/assign/locallib.phpのfunction view_grading_table()では,useridを$USER->idに読み込むSQL文が記述されている.$gradingoptionsformparamsで.

このSQLはmod_assign_grading_options_form()クラスをコンストラクトし,その結果を$gradingoptionsformにインスタンスはコピーされる.

この検索結果はassign_form()をnewする際に渡される.

class assign_formはmod/assign/renderable.phpに存在する.

これはclass renderableから派生する.

mod/assign/renderer.phpの中を調べて見た.どうやらテーブルの表示はfunction render_assign_grading_table()の中から呼ばれるflexible_table()が本体?

Picture of 達也 白井
Re: 提出された課題の一覧表示のソーティングにユーザー名を追加したい
by 達也 白井 - Monday, 28 April 2014, 6:38 PM (ID:19532)
 

レンダリングはfunction flexible_table()の中の$table->out()で行われる.

つまり$tableの中にデータが既に入っている.これを生成しているところまで遡る必要がある.

function flexible_table()はfunction render_assign_grading_table()から呼ばれるが,その前に既にassign_grading_table $tableは引数で渡されている.

これを呼ぶのは誰か? rederer.phpの中には無い.いや,mod/assignの中に無い.あらら,これは繋がらない.

Picture of 達也 白井
Re: 提出された課題の一覧表示のソーティングにユーザー名を追加したい
by 達也 白井 - Monday, 28 April 2014, 8:10 PM (ID:19533)
 

繋がった?

mod/assign/gradingtable.phpでデータの取得は行われている.

class assign_grading_table のコンストラクタで問題なし.
なお,Emailアドレスは$extrafieldsで指定されている.どこで指定しているのかは分からない.ということはusernameもここに追加すれば?と思ったが,どこでこのパラメータを設定しているのか分からない.

$columns[]に'username'を追加すれば表示されるが,それにはSQLの$fieldsに'u.username'を追加しないとダメ.
ただ,それだって,

        $fields = user_picture::fields('u', $extrauserfields) . ', ';
にてuserテーブルから読み出すこともできる.となると,やはりMoodleのどこかで選択が可能だと考えるのが筋だろう.ソースを改造しないでも済むのだろうか?

実際には,mod/assign/gradingtable.phpに以下の一行を追加するだけで良い.

        $params = array();
        $params['assignmentid1'] = (int)$this->assignment->get_instance()->id;
        $params['assignmentid2'] = (int)$this->assignment->get_instance()->id;
        $params['assignmentid3'] = (int)$this->assignment->get_instance()->id;
        $params['assignmentid4'] = (int)$this->assignment->get_instance()->id;
        $params['assignmentid5'] = (int)$this->assignment->get_instance()->id;

        $extrauserfields = get_extra_user_fields($this->assignment->get_context());
// (Shirai): ここから追加
        $extrauserfields[] = 'username';
// (Shirai): ここまで追加

        $fields = user_picture::fields('u', $extrauserfields) . ', ';
だが,ソースを変更しないでも良いのならば,それに越したことは無い.デフォルトでemailが$extrauserfieldsには入っている.

https://moodle.org/mod/forum/discuss.php?d=43863#p1123312