Quantcast
Channel: Web services
Viewing all articles
Browse latest Browse all 2363

Returning multidimensional arrays in web services

$
0
0

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 smile

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')
                )
        );

}

Viewing all articles
Browse latest Browse all 2363

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>