PLEASE NOTE: I’m looking further into why this may be happening after a very useful chat with Questionmark’s Richard Ham so watch this space…
If you’re using QuestionMark Perception’s GetScheduleListByParticipant method through their QMWISe API and the Questionmark Basic LTI Community Connector (I don’t know about the LTI Connector for Questionmark OnDemand) then this is a quick heads up about a problem that I’ve just encountered in v5.4. We use this method to work out whether students are currently scheduled for a given assessment through a (rather inelegant) check of whether the AssessmentID they are trying to access is the same as the AssessmentID of one of the assessments they are scheduled for and, if that schedule is time-limited, whether it is currently open.
The problem is that, for reasons that are probably die to the way that PHP deals with a SOAP return , GetScheduleListByParticipant returns a different object structure depending on whether the one or more schedules are returned. For one schedule (with print_r()):
stdClass Object ( [Schedule] => stdClass Object ( [Schedule_ID] => 111111111 [Assessment_ID] => 1111111111111111 [Participant_ID] => 0 [Group_ID] => 111111111 [Schedule_Name] => Quiz 1 [Restrict_Times] => 1 [Restrict_Attempts] => [Max_Attempts] => 0 [Monitored] => 0 [Schedule_Starts] => 2013-12-03T00:00:00 [Schedule_Stops] => 2013-12-04T00:00:00 ) )
Whereas with more than one schedule:
stdClass Object ( [Schedule] => Array ( [0] => stdClass Object ( [Schedule_ID] => 1111111 [Assessment_ID] => 1111111111111111 [Participant_ID] => 0 [Group_ID] => 111111111 [Schedule_Name] => Quiz 1 [Restrict_Times] => [Restrict_Attempts] => [Max_Attempts] => 0 [Monitored] => 0 [Schedule_Starts] => 0001-01-01T00:00:00 [Schedule_Stops] => 0001-01-01T00:00:00 ) [1] => stdClass Object ( [Schedule_ID] => 2222222 [Assessment_ID] => 2222222222222222 [Participant_ID] => 0 [Group_ID] => 222222222 [Schedule_Name] => Quiz 2 [Restrict_Times] => 1 [Restrict_Attempts] => [Max_Attempts] => 0 [Monitored] => 0 [Schedule_Starts] => 2013-12-03T00:00:00 [Schedule_Stops] => 2013-12-04T00:00:00 ) [n] => and so on...
The real problem with is when you compare desired AssessmentID with scheduled AssessmentID in a for loop:
$schedules = get_schedule_list_by_participant($participant_id)) //method which calls GetScheduleListByParticipant foreach($schedules->Schedule){ ... //check each schedule }
It works fine until you come across a student with only one schedule, at which point it breaks as it tries to iterate through the properties of the only schedule returned. Until we can work out something else, the simplest solution is to check the number of schedules returned before deciding how to evaluate them:
if(count($schedules->Schedule)>1){ foreach($schedules->Schedule as $schedule){ ... //check each schedule } } elseif(count($schedules->Schedule)==1){ ... //check this schedule }
Haven’t checked whether behaviour is the same with the other QMWISe methods but I wouldn’t be surprised….