2017-10-05 5 views
1

私はカスタムMoodleプラグインの学術顧問を取得するために以下のクエリを持っています。ここで定義されているようMoodleのクエリは「Ad Hocデータベースクエリ」では動作しますが、プラグインでは動作しません。なぜですか?

学術顧問の役割が設定されている:https://docs.moodle.org/en/Parent_role

私はでそれを実行したアドホックデータベースは(とMySQL Workbenchで)を照会し、それはそれらの両方で正常に動作しますが、いくつかの奇妙なためそれは私のプラグインで動作しない理由。

db_update.php:(db_update.phpを呼び出す)attendance.phpに含まれている私のattendance_form.phpページでは、

function get_academic_advisees($userid) { 
    global $DB; 

    $sql = 'SELECT child.username, child.firstname, child.lastname 
      FROM {user} user 
      JOIN {role_assignments} ra ON ra.userid = user.id 
      JOIN {role} role ON role.id = ra.roleid 
      JOIN {context} ctx ON ctx.id = ra.contextid 
      AND ctx.contextlevel = 30 
      JOIN {user} child ON child.id = ctx.instanceid 
      WHERE role.shortname = "academic_adviser" 
      and user.username = ?'; 

    return $DB->get_records_sql($sql, array($userid)); 
} 

require_once("{$CFG->libdir}/formslib.php"); 

class attendance_form extends moodleform { 

    function definition() { 
     $mform =& $this->_form; 

     $mform->addElement('html', '<h2>' . get_string('attendance', 'local_attendance') . '</h2>'); 
     $mform->addElement('html', '<p>This report allows you to retrieve attendance data for your academic advisees.</p>'); 

     //$mform->addElement('text', 'student_number', get_string('student_number', 'local_attendance')); 
     global $USER; 
     $userid = $USER->id; 
     $myAdvisees = array(); 
     $adviseeArray = array(); 
     $myAdvisees = get_academic_advisees($userid); 
     foreach($myAdvisees as $myAdvisee) { 
      $key = $myAdvisee->username; 
      $value = $myAdvisee->firstname . $myAdvisee->lastname . '(' . $myAdvisee->username . ')'; 
      $adviseeArray[$key] = $value; 
     } 

     $mform->addElement('select', 'student_number', get_string('student_number', 'local_attendance'), $adviseeArray); 

     $this->add_action_buttons(true, get_string('save', 'local_attendance')); 
    } 
} 

答えて

2

機能はPARAM 'ユーザーID' をとり、クエリでは、これを 'user.username'と照合しようとします。

だから、あなたは配置する必要があります:

$userid = $USER->username; 

をあなたはそれがあなたの形で仕事をしたい場合。

また、$ mform = & $ this-> _ formから&を削除してください.Moodleはずっと前からPHP 4をサポートしていませんでした。

+0

はありがとうございました - それがされて 'とuser.id =している必要がありますので、私はそれ$ USER-> IDを渡しました'? –

0

だから、正しいコードは(@davosmithのおかげで)です:

function get_academic_advisees($userid) { 
    global $DB; 

    $sql = 'SELECT child.username, child.firstname, child.lastname 
      FROM {user} user 
      JOIN {role_assignments} ra ON ra.userid = user.id 
      JOIN {role} role ON role.id = ra.roleid 
      JOIN {context} ctx ON ctx.id = ra.contextid 
      AND ctx.contextlevel = 30 
      JOIN {user} child ON child.id = ctx.instanceid 
      WHERE role.shortname = "academic_adviser" 
      and user.id = ?'; 

    return $DB->get_records_sql($sql, array($userid)); 
} 
+1

マイナーノート - 別のデータベースバックエンド(コアMoodleにとっては重要ではないかもしれませんが、おそらくあなたのサイトでは重要ではない)と互換性を持たせたい場合は、一重引用符を使用して文字列を含める必要があります。 role.shortname = ' academic_advisor ' – davosmith

+0

ありがとうございました - ある時点で私は二重引用符で囲まれた$ sqlと一重引用符で囲まれた文字列を持ち、 –

関連する問題