2017-10-05 6 views
1

J'ai la requête suivante pour récupérer des conseillers académiques dans un plugin Moodle personnalisé.Pourquoi ma requête Moodle fonctionne-t-elle dans "Requêtes de base de données ad hoc" mais pas dans mon plugin?

Le rôle de conseiller académique est configuré tel que défini ici: https://docs.moodle.org/en/Parent_role

J'ai couru dans requêtes base de données ad hoc (et MySQL Workbench), et il fonctionne très bien dans les deux ceux-ci, mais pour une bizarre raison pour laquelle cela ne fonctionne pas dans mon plugin.

En 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)); 
} 

Dans ma page attendance_form.php, qui est inclus dans attendance.php (qui appelle 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')); 
    } 
} 

Répondre

2

La fonction prend un param 'userid', mais dans la requête, il essaie de faire correspondre cela à 'user.username'.

, vous avez besoin de mettre:

$userid = $USER->username; 

Si vous voulez travailler dans votre formulaire.

De plus, veuillez enlever le & de $ mform = & $ this -> _form - Moodle a cessé de supporter PHP 4 il y a longtemps!

+0

Merci beaucoup - je le passant $ user-> id il aurait dû être '' et user.id = –

0

Ainsi, le code correct est (avec) grâce à @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

Note mineure - si vous voulez que ceci soit compatible avec différents backends de base de données (important pour le core Moodle, probablement moins important pour votre site), vous devez utiliser des guillemets simples pour contenir des chaînes: role.shortname = ' academic_advisor ' – davosmith

+0

merci - à un moment donné, j'avais $ sql entre guillemets et la chaîne entre guillemets simples, et finit par l'échanger –