ユーザーの検索に都道府県も含めたい

ユーザーの検索に都道府県も含めたい

- Tatsuya Shirai の投稿
返信数: 2

 ユーザー一覧の表示やロールの割り当て画面の検索機能で、都道府県を検索対象にできないでしょうか。

 都道府県(City)の欄をユーザの所属に読み替えて運用しています。学生の場合は学科と入学年度(これはユーザアカウント名でも識別できるので問題なし)、教員の場合は所属学科、その他の人の場合はそれぞれの役割(事務職員、など)。

 都道府県によるソートはできるのですが。。。

 見てみた感じでは、ユーザ一覧の表示ではlib/datalib.php中の、 

function get_users_listing($sort='lastaccess', $dir='ASC', $page=0, $recordsperpage=0,
                           $search='', $firstinitial='', $lastinitial='', $remotewhere='') {

    global $CFG;

    $LIKE      = sql_ilike();
    $fullname  = sql_fullname();

    $select = "deleted <> '1'";

    if (!empty($search)) {
        $search = trim($search);
        $select .= " AND ($fullname $LIKE '%$search%' OR email $LIKE '%$search%') ";
    }

    if ($firstinitial) {
        $select .= ' AND firstname '. $LIKE .' \''. $firstinitial .'%\' ';
    }

    if ($lastinitial) {
        $select .= ' AND lastname '. $LIKE .' \''. $lastinitial .'%\' ';
    }

    $select .= $remotewhere;

    if ($sort) {
        $sort = ' ORDER BY '. $sort .' '. $dir;
    }

/// warning: will return UNCONFIRMED USERS
    return get_records_sql("SELECT id, username, email, firstname, lastname, city, country, lastaccess, confirmed, mnethostid
                              FROM {$CFG->prefix}user
                             WHERE $select $sort", $page, $recordsperpage);

}

を呼んでいるようです。青文字で示したあたりだと思うのですが、$searchに検索文字列が入力されていて、$selectの中の$fullnameと$emailを検索対象としているように見えますので、ここに追加すれば良いのかな?


 紫色の行のところを見よう見真似で以下のように変更したら、ユーザー一覧の表示では、検索ができるようになりました。

        $select .= " AND ($fullname $LIKE '%$search%' OR email $LIKE '%$search%' OR city $LIKE '%$search%') "; 

赤い部分の追加しただけなのですが。。。SQLについて(も?)初心者ですので、これで安全なのかどうか判断が付きません。なお、この改良を施してもロール割り当て画面での検索では都道府県でのサーチはできませんねぇ。ソースの共通化はされていないようで、admin/role/assign.php内にもっとベタベタと関数をあまり使わずに記述されています。

Tatsuya Shirai への返信

Re: ユーザーの検索に都道府県も含めたい

- Tatsuya Shirai の投稿

 ロール割り当て画面の検索も、よく調べてみたら、全く上と同じ仕組みでした。

admin/roles/assign.phpの243行目近辺、

    if ($roleid) {        /// prints a form to swap roles

    /// Get all existing participants in this context.
        // Why is this not done with get_users???

        if (!$contextusers = get_role_users($roleid, $context, false, 'u.id, u.firstname, u.lastname, u.email, r.hidden')) {
            $contextusers = array();
        }

        $select  = "username <> 'guest' AND deleted = 0 AND confirmed = 1";

        $usercount = count_records_select('user', $select) - count($contextusers);

        $searchtext = trim($searchtext);

        if ($searchtext !== '') {   // Search for a subset of remaining users
            $LIKE      = sql_ilike();
            $FULLNAME  = sql_fullname();

//          $selectsql = " AND ($FULLNAME $LIKE '%$searchtext%' OR email $LIKE '%$searchtext%') ";
            $selectsql = " AND ($FULLNAME $LIKE '%$searchtext%' OR email $LIKE '%$searchtext%' OR city $LIKE '%$searchtext%') ";
            $select  .= $selectsql;
        } else {
            $selectsql = "";
        }


 自己完結してしまいましたが。。。このような改善で危険が無いのか少し不安です。特にdmlib.phpの方は他の関数からも呼ばれている箇所かも知れませんので。。。

 うん、地味だけれど、もしこれで問題がないならば、コースへの学生の割り当てや教職員の割り当てがグッと楽になりますね。

Tatsuya Shirai への返信

Re: ユーザーの検索に都道府県も含めたい

- Tatsuya Shirai の投稿

 こんな改善を行うよりも、ユーザープロフィールに”所属”を追加して欲しい(+検索可)を要望するべきでしょうか。

 あるいはかなり大掛かりになりますが、Hayakawaさんが要望しているように、

http://moodle.org/mod/forum/discuss.php?d=87755

ユーザープロフィールフィールドもテキストファイルでアップロードできるように拡張し、さらにユーザープロフィールの項目の中のどれとどれを検索対象とするかをチェックボックスなどで選べるように拡張して貰えるように要望するか?