by Mike Wilson.
I'm putting together a web service to pass student information and assignment feedback comments to another system. It works quite nicely when I just return general student information in my personal_tutor_portal_returns() function, but I want to output a multidimensional array with the feedback data one level down.
I can't seem to get this to work.
Am I right in thinking I need an external_multiple_structure with two external_single_structures within it one for student data and another for feedback data?
Has anyone got a good example of something similar to what I'm trying to do?
Thanks for any help, the finish line is in sight on this one
Moodle 3.3.1
public static function personal_tutor_portal_parameters() {
return new external_function_parameters(
array(
'email' => new external_value(PARAM_TEXT, 'Student email (lowercase)', VALUE_DEFAULT, 'something@blackhole.port.ac.uk'),
'hash' => new external_value(PARAM_TEXT, 'Salted hash of username', VALUE_DEFAULT, '')
)
);
}
public static function personal_tutor_portal($email = 'something@blackhole.port.ac.uk',$hash = '') {
global $USER, $DB;
$salt = 'YC*1!gduQ$jn^4';
//Parameter validation
$params = self::validate_parameters(self::personal_tutor_portal_parameters(),
array('email'=>$email,
'hash'=>$hash));
//do a hash check to ensure no messing with username
if(md5($email.$salt)!=$hash){
return "Sorry, the hash does not match.";
}
$user = $DB->get_record('user',array('email'=>$email));
$sql = "SELECT
greatest(ag.id) AS id,ag.assignment,ag.userid,ag.timecreated,ag.grader,u.firstname,u.lastname,ag.grade,greatest(afc.commenttext) AS commenttext,ag.timemodified,ass.name,ass.duedate,ass.markingworkflow,
c.id AS courseid,c.fullname,c.shortname,ass.teamsubmission,cm.id AS cmid,
auf.workflowstate,auf.id AS workflowstateid,m.name as modulename
FROM
{assign_grades} AS ag
LEFT OUTER JOIN {assignfeedback_comments} AS afc ON afc.assignment = ag.assignment AND afc.grade = ag.id
INNER JOIN {assign} AS ass ON ass.id = ag.assignment
INNER JOIN {user} AS u ON u.id = ag.grader
INNER JOIN {course} AS c ON ass.course = c.id
INNER JOIN {course_modules} AS cm ON cm.instance = ag.assignment AND cm.course = c.id
INNER JOIN {assign_user_flags} AS auf ON auf.assignment = ag.assignment
INNER JOIN {modules} as m ON cm.module = m.id
WHERE
ag.userid = $user->id AND
m.name = 'assign' AND
auf.id = 1
OR auf.id = 6
GROUP BY greatest(ag.id),ag.assignment,ag.userid,ag.grade,ag.grader,ag.timecreated,u.firstname,u.lastname,u.email,ag.grade,afc.commenttext,ag.timemodified,ass.name,ass.duedate,ass.markingworkflow,c.id,
c.fullname,c.shortname,ass.teamsubmission,cm.id,auf.workflowstate,auf.id,m.name
ORDER BY
c.fullname ASC,ag.timemodified DESC";
$feedbacks = $DB->get_records_sql($sql,array());
function academicyear($timestamp){
/* Return academic year from a unix timestamp */
$year = date('Y',$timestamp);
$month = date('m',$timestamp);
if ($month < 9){
$aca = strtotime('-1 year',$timestamp);
$aca = date('Y',$aca);
}
else $aca = $year;
$text = $aca;
return $text;
}
$portal = array(
'source' => 'Moodle',
'username' => $user->username,
'firstname' => $user->firstname,
'lastname' => $user->lastname,
'email' => $user->email
);
foreach($feedbacks as $feedback){
$academicyear = academicyear($feedback->timecreated);
$rawcomment = strip_tags($feedback->commenttext);
$marker = $feedback->firstname.' '.$feedback->lastname;
$feedbackdate = date('d.m.Y',$feedback->timemodified);
}
return $portal;
}
public static function personal_tutor_portal_returns() {
return new external_single_structure(
array(
'source' => new external_value(PARAM_TEXT, 'where data came from - moodle'),
'username' => new external_value(PARAM_TEXT, 'username of student'),
'firstname' => new external_value(PARAM_TEXT, 'first name of student'),
'lastname' => new external_value(PARAM_TEXT, 'last name of student'),
'email' => new external_value(PARAM_TEXT, 'email of student')
)
);
}