2017-10-05 124 views
1

我有以下查詢來檢索自定義Moodle插件中的學術顧問。爲什麼我的Moodle查詢在「Ad hoc數據庫查詢」中工作,但不在我的插件中?

這裏定義的學術顧問的角色配置:https://docs.moodle.org/en/Parent_role

我在特設數據庫運行查詢(和MySQL工作臺),並在這兩個的工作正常,但對於一些奇怪的因爲它在我的插件中不起作用。

db_update.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)); 
} 

在我attendance_form.php頁,其中包括在attendance.php(它調用db_update.php):

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用雙引號括起來,並用單引號將字符串括起來,最後交換了它 –

相關問題