1) regular_error($http_path.'/', (array) NULL, 'curl_teletop_req() heeft zichzelf te vaak aangeroepen, kennelijk is er een BUG'); curl_setopt($ch, CURLOPT_URL, $teletop_server.$url); if ($postdata) { curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata); curl_setopt($ch, CURLOPT_POST, true); } else curl_setopt($ch, CURLOPT_HTTPGET, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $additional_headers); $ret = curl_exec($ch); curl_setopt($ch, CURLOPT_HTTPHEADER, (array) NULL); if (curl_errno($ch)) regular_error($http_path.'/', (array) NULL, 'Fout bij het laden van '. curl_getinfo($ch, CURLINFO_EFFECTIVE_URL).': '.curl_error($ch)); // indien we niet ingelogd zijn, of onvoldoende rechten hebben, hebben we een HTML document gehad met // een login formulier $content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); if (!strncasecmp($content_type, 'text/html', 9)) { $doc = new DOMDocument(); libxml_use_internal_errors(true); $doc->loadHTML($ret); $xpath = new DOMXPath($doc); $form = $xpath->query('//form')->item(0); if (!$form || $form->getAttribute('action') != '/names.nsf?Login') return $xpath; $errordiv = $xpath->query('//div[@class="errorLogin"]')->item(0); if ($errordiv) { $error_txt = htmlspecialchars($errordiv->nodeValue, ENT_QUOTES, 'UTF-8'); if (!preg_match('/sessie/', $error_txt) || !preg_match('/is verlopen/', $error_txt)) regular_error($http_path.'/', (array) NULL, 'Error accessing '.curl_getinfo($ch, CURLINFO_EFFECTIVE_URL).': '. $error_txt); } if (not_teletop_credentials()) regular_error($http_path.'/', (array) NULL, 'Geen TeleTOP® gebruikersnaam en/of '. 'wachtwoord beschikbaar, vul je informatie in bij TeleTOP® login informatie'); dom_form_set_input($form, $xpath, 'Username', $_SESSION['teletop_username'].'/Abvo'); dom_form_set_input($form, $xpath, 'UsernameInput', $_SESSION['teletop_username'].'/Abvo'); dom_form_set_input($form, $xpath, 'Password', $_SESSION['teletop_password']); if (strtoupper($form->getAttribute('method')) != 'POST') regular_error($http_path.'/', (array) NULL, 'Structuur van het TeleTOP® login formulier is gewijzigd.'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_URL, $teletop_server.$form->getAttribute('action')); curl_setopt($ch, CURLOPT_POSTFIELDS, dom_form($form, $xpath)); curl_setopt($ch, CURLOPT_HEADERFUNCTION, find_session_cookie); unset($_SESSION['teletop_session']); curl_exec($ch); curl_setopt($ch, CURLOPT_HEADERFUNCTION, null_callback); //curl_setopt($ch, CURLOPT_HEADERFUNCTION, NULL); if (curl_errno($ch)) regular_error($http_path.'/', (array) NULL, 'Fout bij het inloggen op TeleTOP®: '.curl_error($ch)); if (!$_SESSION['teletop_session']) regular_error($http_path.'/', (array) NULL, 'Inloggen bij TeleTOP® mislukt; gebruikersnaam en wachtwoord worden niet geaccepteerd, ga naar de TeleTOP® login informatiepagina om je gegevens goed in te stellen'); curl_setopt($ch, CURLOPT_COOKIE, 'DomAuthSessId='.$_SESSION['teletop_session']); // we zijn ingelogd, probeer opnieuw return curl_teletop_req($ch, $url, $postdata, $additional_headers, $recurse + 1); } else if (!strncasecmp($content_type, 'application/x-json', 18)) { // wegens een bug in de JSON encoder van TeleTOP moeten we hier de TAB alsnog escapen $clean = str_replace("\t", "\\t", $ret); $ret2 = json_decode($clean, true); if (!$ret2 && $_SESSION['ppl_id'] == 3490) { echo $clean; $err = json_last_error(); echo JSON_ERROR_CTRL_CHAR.' JSON_ERROR_CTRL_CHAR
'; echo JSON_ERROR_SYNTAX.' JSON_ERROR_SYNTAX
'; echo "error decoding JSON data from TeleTOP® ".json_last_error().'
'; $fp = fopen('/tmp/test.bla', 'w'); fwrite($fp, $ret); fclose($fp); } return $ret2; } return NULL; } function delete_from_teletop($notitie_id) { global $schooljaar_long, $http_path, $teletop_vaksite_prefix, $teletop_server; $result = mysql_query_safe("SELECT vaksite, vaksite_id, doc_id FROM notities2teletop JOIN vaksites USING (vaksite_id) WHERE notitie_id = '%s'", mysql_escape_safe($notitie_id)); if (!mysql_numrows($result)) return; // notitiestaat niet meer in TeleTOP $vaksite = $teletop_vaksite_prefix.mysql_result($result, 0, 'vaksite').'.nsf'; $doc_id = mysql_result($result, 0, 'doc_id'); $ch = curl_teletop_init(); curl_teletop_req($ch, $vaksite.'/a-DeleteDocuments?OpenAgent&id='.$doc_id.'&docType=rosterrow'); // assume success mysql_query_safe("DELETE FROM notities2teletop WHERE notitie_id = '%s'", mysql_escape_safe($notitie_id)); } function teletop_check_conflict($ch, $datum, $klas) { $json_data = curl_teletop_req($ch, '/tt/abvo/updates.nsf/a-SearchRosterRows?OpenAgent&rand='.rand(0,99999998), 'sa=1&dformat=mm/dd/yyyy&date='.$datum.'&ug='.$klas.'&', array('X-Requested-With: XMLHttpRequest')); if (!$json_data) $_SESSION['warningmsg'] = 'De server van TeleTOP® heeft ongeldige JSON data naar ons teruggestuurd, we hebben helaas niet kunnen constateren of er toetsconflicten waren.'; else { $bla = ''; foreach ($json_data['result']['rows'] as $value) $bla = $value['cn'].' '.$value['sa'].'
'; if ($bla != '') { $_SESSION['warningmsg'] = 'Voor deze klas zijn de volgende belastende activiteiten gepland. De nieuwe notitie is in TeleTOP® geplaatst, maar moet wellicht nog worden verplaatst.
'.$bla.'
'; } } } function change_in_teletop($grp2vak_id, $notitie_id, $week, $dag, $text, $sa = '') { global $schooljaar_long, $http_path, $teletop_vaksite_prefix, $teletop_server; $vaksite = $teletop_vaksite_prefix.sprint_singular("SELECT vaksite FROM grp2vak2vaksite JOIN vaksites USING (vaksite_id) WHERE grp2vak_id = '%s'", mysql_escape_safe($grp2vak_id)).'.nsf'; $vaksite_id = sprint_singular("SELECT vaksite_id FROM grp2vak2vaksite WHERE grp2vak_id = '%s'", mysql_escape_safe($grp2vak_id)); $doc_id = sprint_singular("SELECT doc_id FROM notities2teletop WHERE notitie_id = '%s'", mysql_escape_safe($notitie_id)); $ch = curl_teletop_init(); $xpath = curl_teletop_req($ch, $vaksite.'/id/'.$doc_id.'?EditDocument'); $form = $xpath->query('//form')->item(0); if (!$form || strcasecmp($form->getAttribute('method'), 'POST')) regular_error($http_path.'/', (array) NULL, 'Interface van TeleTOP® drastisch gewijzigd.'); if ($week < 30) $year = substr($schooljaar_long, 5); else $year = substr($schooljaar_long, 0, 4); $day_in_week = strtotime(sprintf("$year-01-04 + %d weeks", $week - 1)); $thismonday = $day_in_week - ((date('w', $day_in_week) + 6)%7)*24*60*60; $datum = date("m/d/Y", $thismonday + ($dag - 1)*24*60*60); //'09/03/2010'; $datum; // mm/dd/yy $klas = sprint_singular("SELECT naam FROM grp JOIN grp2vak USING (grp_id) WHERE grp2vak_id = '%s'", mysql_escape_safe($grp2vak_id)); // deze twee controls worden gedisabled in javascript, dus dat doen we hier ook maar dom_form_disable_inputs($form, $xpath, 'PublicationDate'); dom_form_disable_inputs($form, $xpath, 'PublicationDateOff'); // hier simuleren we userinput in het form //dom_form_check_checkbox($form, $xpath, 'TargetAudienceUserGroup', $klas); // hier simuleren we userinput in het form if (!($checkbox = $xpath->query('.//input[@name="TargetAudienceUserGroup" and @type="checkbox" and not(@disabled) and @value="'.$klas.'"]', $form)->item(0))) { // hebben we te maken met een cluster?, hopelijk wel dom_form_check_checkbox($form, $xpath, 'TargetAudience', $klas); // vink ook alle stamklassen aan, anders schijnen de leerlingen het niet te kunnen zien dom_form_check_checkboxen($form, $xpath, 'TargetAudienceUserGroup'); } else dom_form_check_checkbox($form, $xpath, 'TargetAudienceUserGroup', $klas); dom_form_set_input($form, $xpath, 'RosterRowDate', $datum); dom_form_set_input($form, $xpath, 'RosterRowWeek', $week); dom_form_set_textarea($form, $xpath, 'RosterRowItem2', $text); if ($sa) { dom_form_check_checkboxen($form, $xpath, 'RosterRowIsSpecialActivity'); dom_form_enable_selects($form, $xpath, 'RosterRowSpecialActivity'); dom_form_select_select_option($form, $xpath, 'RosterRowSpecialActivity', $sa); } else { dom_form_uncheck_checkboxen($form, $xpath, 'RosterRowIsSpecialActivity'); dom_form_disable_selects($form, $xpath, 'RosterRowSpecialActivity'); } if ($sa) teletop_check_conflict($ch, $datum, $klas); // submit form curl_teletop_req($ch, $form->getAttribute('action'), dom_form($form, $xpath)); } function add_to_teletop($grp2vak_id, $notitie_id, $week, $dag, $text, $sa = NULL) { global $schooljaar_long, $http_path, $teletop_vaksite_prefix, $teletop_server; $result = mysql_query_safe(<<query('//form')->item(0); if (!$form || strcasecmp($form->getAttribute('method'), 'POST')) regular_error($http_path.'/', (array) NULL, 'Interface van TeleTOP® drastisch gewijzigd.'); if ($week < 30) $year = substr($schooljaar_long, 5); else $year = substr($schooljaar_long, 0, 4); $day_in_week = strtotime(sprintf("$year-01-04 + %d weeks", $week - 1)); $thismonday = $day_in_week - ((date('w', $day_in_week) + 6)%7)*24*60*60; $datum = date("m/d/Y", $thismonday + ($dag - 1)*24*60*60); //'09/03/2010'; $datum; // mm/dd/jjjj // deze twee controls worden gedisabled in javascript, dus dat doen we hier ook maar dom_form_disable_inputs($form, $xpath, 'PublicationDate'); dom_form_disable_inputs($form, $xpath, 'PublicationDateOff'); // hier simuleren we userinput in het form if (!($checkbox = $xpath->query('.//input[@name="TargetAudienceUserGroup" and @type="checkbox" and not(@disabled) and @value="'.$info['klas'].'"]', $form)->item(0))) { // hebben we te maken met een cluster?, hopelijk wel dom_form_check_checkbox($form, $xpath, 'TargetAudience', $info['klas']); // vink ook alle stamklassen aan, anders schijnen de leerlingen het niet te kunnen zien dom_form_check_checkboxen($form, $xpath, 'TargetAudienceUserGroup'); } else dom_form_check_checkbox($form, $xpath, 'TargetAudienceUserGroup', $info['klas']); dom_form_set_input($form, $xpath, 'RosterRowDate', $datum); dom_form_set_input($form, $xpath, 'RosterRowWeek', $week); dom_form_set_textarea($form, $xpath, 'RosterRowItem2', $text); if ($sa) { dom_form_check_checkboxen($form, $xpath, 'RosterRowIsSpecialActivity'); dom_form_enable_selects($form, $xpath, 'RosterRowSpecialActivity'); dom_form_select_select_option($form, $xpath, 'RosterRowSpecialActivity', $sa); } // extract het rijnummer waarmee we straks de doc_id gaan terugvinden $roster_row_nr = $xpath->query('.//input[@name="RosterRowNr"]', $form)->item(0)->getAttribute('value'); // dit is het default nummer van TeleTOP® we kunnen ook werken met een gespecificeerde range // even kijken of er een range voor deze docent/vaksite is... $rownr = sprint_singular("SELECT cur FROM ppl2vaksiteprefs WHERE ppl_id = '{$_SESSION['ppl_id']}' AND vaksite_id = '%s'", mysql_escape_safe($info['vaksite_id'])); if ($rownr) { dom_form_set_input($form, $xpath, 'RosterRowNr', $rownr); $roster_row_nr = $rownr; mysql_query_safe("UPDATE ppl2vaksiteprefs SET cur = cur + incr WHERE ppl_id = '{$_SESSION['ppl_id']}' AND vaksite_id = '%s' AND cur + incr <= max", mysql_escape_safe($info['vaksite_id'])); } if ($sa) teletop_check_conflict($ch, $datum, $info['klas']); curl_teletop_req($ch, $form->getAttribute('action'), dom_form($form, $xpath)); $xpath = curl_teletop_req($ch, $vaksite.'/f-Roster?ReadForm'); $dingies = $xpath->query('//table[@id="view"]/tbody/tr[@id="'.$roster_row_nr.'"]/td[2]'); $items = $dingies->length; if (!$items) regular_error($http_path.'/', (array) NULL, 'Notitie geprobeerd in te voegen in TeleTOP® met regelnummer '.$roster_row_nr. ', de notitie is echter niet teruggevonden in TeleTOP®.'); // indien er meerdere regels zijn met dezelfde RosterRowNr, dan nemen we aan // dat de laatste regel degene is die we zojuist hebben toegevoegd $doc_id = preg_replace('/writeEditLink\(\'id\/(.*)\?EditDocument.*$/', '$1', $dingies->item($items - 1)->nodeValue); mysql_query_safe("INSERT INTO notities2teletop ( notitie_id, vaksite_id, doc_id, col ) VALUES ( '%s', '{$info['vaksite_id']}', '%s', 'col2' )", mysql_escape_safe($notitie_id), mysql_escape_safe($doc_id)); } ?>