/** * Overwrites the parent method. This method combines messages with the same * content and prepares them for sending them as a mail with multiple * recepients instead of one mail for each recipient. * The actual sending task is done bulkSend(). * * @global object $user * * @param string $rec_user_id user_id of recipient * @param string $snd_user_id user_id of sender * @param string $message the message * @param string $subject subject for the message * @param string $message_id the message_id in the database */ function sendingEmail($rec_user_id, $snd_user_id, $message, $subject, $message_id) { global $user; $db4 = new DB_Seminar("SELECT user_id, Email FROM auth_user_md5 WHERE user_id = '{$rec_user_id}';"); $db4->next_record(); if ($to = $db4->f("Email")) { $rec_fullname = 'Sie'; setTempLanguage($db4->f("user_id")); if (empty($this->bulk_mail[md5($message)][getenv('LANG')])) { $title = "[Stud.IP - " . $GLOBALS['UNI_NAME_CLEAN'] . "] " . stripslashes(kill_format(str_replace(array("\r", "\n"), '', $subject))); if ($snd_user_id != "____%system%____") { $snd_fullname = get_fullname($snd_user_id); $db4->query("SELECT Email FROM auth_user_md5 WHERE user_id = '{$user->id}'"); $db4->next_record(); $reply_to = $db4->f("Email"); } $template = $GLOBALS['template_factory']->open('mail/text'); $template->set_attribute('message', kill_format(stripslashes($message))); $template->set_attribute('rec_fullname', $rec_fullname); $mailmessage = $template->render(); $template = $GLOBALS['template_factory']->open('mail/html'); $template->set_attribute('lang', getUserLanguagePath($rec_user_id)); $template->set_attribute('message', stripslashes($message)); $template->set_attribute('rec_fullname', $rec_fullname); $mailhtml = $template->render(); $this->bulk_mail[md5($message)][getenv('LANG')] = array('text' => $mailmessage, 'html' => $mailhtml, 'title' => $title, 'reply_to' => $reply_to, 'message_id' => $message_id, 'users' => array()); } $this->bulk_mail[md5($message)][getenv('LANG')]['users'][$db4->f('user_id')] = $to; restoreLanguage(); } }
function getResult($level_id = null) { global $_fullname_sql, $SEM_TYPE, $SEM_CLASS; $add_fields = ''; $add_query = ''; $sem_tree_query = ''; $limit_sql = ''; $orderby_field = $this->config->getValue('Main', 'resultorderby') ? $this->config->getValue('Main', 'resultorderby') : 'VeranstaltungsNummer'; if ($this->sem_browse_data['group_by'] == 1 || sizeof($this->config->getValue('SelectSubjectAreas', 'subjectareasselected')) && !($this->config->getValue('SelectSubjectAreas', 'selectallsubjectareas') || $this->sem_browse_data['start_item_id'] == 'root')) { if ($this->config->getValue('Main', 'mode') == 'show_sem_range' && $this->sem_browse_data['start_item_id'] != 'root') { $allowed_ranges = array(); if (is_null($level_id)) { if (!is_object($this->sem_tree)) { $this->sem_tree = TreeAbstract::GetInstance('StudipSemTree'); } if ($kids = $this->sem_tree->getKidsKids($this->sem_browse_data['start_item_id'])) { $allowed_ranges = $kids; } $allowed_ranges[] = $this->sem_browse_data['start_item_id']; } else { $allowed_ranges[] = $level_id; } if ($this->config->getValue('SelectSubjectAreas', 'selectallsubjectareas')) { $sem_tree_query = " AND sem_tree_id IN('" . join("','", $allowed_ranges) . "') "; } elseif (is_array($this->config->getValue('SelectSubjectAreas', 'subjectareasselected'))) { if ($this->config->getValue('SelectSubjectAreas', 'reverseselection')) { $allowed_ranges = array_diff($allowed_ranges, $this->config->getValue('SelectSubjectAreas', 'subjectareasselected')); } else { $allowed_ranges = array_intersect($allowed_ranges, $this->config->getValue('SelectSubjectAreas', 'subjectareasselected')); } $sem_tree_query = " AND sem_tree_id IN('" . join("','", $allowed_ranges) . "') "; } else { return array(array(), array()); } } $add_fields = 'seminar_sem_tree.sem_tree_id AS bereich,'; $add_query = "LEFT JOIN seminar_sem_tree ON (seminare.Seminar_id = seminar_sem_tree.seminar_id)"; } else { if ($this->config->getValue('Main', 'maxnumberofhits')) { $limit_sql = ' ORDER BY sem_number DESC, ' . $orderby_field . ' ASC LIMIT ' . ($this->module_params['start'] ? intval($this->module_params['start']) : '0') . ',' . $this->config->getValue('Main', 'maxnumberofhits'); } } if ($this->sem_browse_data['group_by'] == 4) { $add_fields = 'Institute.Name AS Institut,Institute.Institut_id,'; $add_query = 'LEFT JOIN seminar_inst ON (seminare.Seminar_id = seminar_inst.Seminar_id) LEFT JOIN Institute ON (Institute.Institut_id = seminar_inst.institut_id)'; } // show only selected SemTypes $selected_semtypes = $this->config->getValue('ReplaceTextSemType', 'visibility'); $sem_types_array = array(); if (count($selected_semtypes)) { for ($i = 0; $i < count($selected_semtypes); $i++) { if ($selected_semtypes[$i] == '1') { $sem_types_array[] = $i + 1; } } $sem_types_query = "AND seminare.status IN ('" . implode("','", $sem_types_array) . "')"; } else { $sem_types_query = ''; } // participated institutes (or show only courses located at this faculty) /* $sem_inst_query = ''; if (!$this->config->getValue('Main', 'allseminars')) { $tree = TreeAbstract::GetInstance('StudipRangeTree'); $kidskids = $tree->getKidsKids($this->sem_browse_data['start_item_id']); $institute_ids = array($tree->tree_data[$this->sem_browse_data['start_item_id']]['studip_object_id']); foreach ($kidskids as $kid) { $institute_ids[] = $tree->tree_data[$kid]['studip_object_id']; } $sem_inst_query = " AND seminare.Institut_id IN ('" . join("','", $institute_ids) . "')"; } */ if (!($nameformat = $this->config->getValue('Main', 'nameformat'))) { $nameformat = 'full_rev'; } $dbv = DbView::getView('sem_tree'); $query = "SELECT seminare.Seminar_id, VeranstaltungsNummer, seminare.status, seminare.Untertitel, seminare.Ort, seminare.art, seminare.Beschreibung, seminare.ects, IF(seminare.visible=0,CONCAT(seminare.Name, ' " . _("(versteckt)") . "'), seminare.Name) AS Name,\n {$add_fields}" . $_fullname_sql[$nameformat] . " AS fullname, auth_user_md5.username, title_front, title_rear, Vorname, Nachname,\n " . $dbv->sem_number_sql . " AS sem_number, " . $dbv->sem_number_end_sql . " AS sem_number_end, seminar_user.position AS position FROM seminare\n LEFT JOIN seminar_user ON (seminare.Seminar_id=seminar_user.Seminar_id AND seminar_user.status='dozent')\n LEFT JOIN auth_user_md5 USING (user_id)\n LEFT JOIN user_info USING (user_id)\n {$add_query}\n WHERE seminare.Seminar_id IN('" . join("','", array_keys($this->sem_browse_data['search_result'])) . "') {$sem_types_query} {$sem_inst_query} {$sem_tree_query} {$limit_sql}"; $db = new DB_Seminar($query); if (!$db->num_rows()) { return array(array(), array()); } $snap = new DbSnapshot($db); $group_field = $this->group_by_fields[$this->sem_browse_data['group_by']]['group_field']; $data_fields[0] = 'Seminar_id'; if ($this->group_by_fields[$this->sem_browse_data['group_by']]['unique_field']) { $data_fields[1] = $this->group_by_fields[$this->sem_browse_data['group_by']]['unique_field']; } $group_by_data = $snap->getGroupedResult($group_field, $data_fields); $sem_data = $snap->getGroupedResult('Seminar_id'); if ($this->sem_browse_data['group_by'] == 0) { $semester = SemesterData::GetSemesterArray(); $group_by_duration = $snap->getGroupedResult('sem_number_end', array('sem_number', 'Seminar_id')); foreach ($group_by_duration as $sem_number_end => $detail) { if ($sem_number_end != -1 && ($detail['sem_number'][$sem_number_end] && count($detail['sem_number']) == 1)) { continue; } else { foreach ($detail['Seminar_id'] as $seminar_id => $foo) { $start_sem = key($sem_data[$seminar_id]['sem_number']); if ($sem_number_end == -1) { $sem_number_end = count($semester) - 1; } for ($i = $start_sem; $i <= $sem_number_end; ++$i) { if ($this->sem_number === false || is_array($this->sem_number) && in_array($i, $this->sem_number)) { if ($group_by_data[$i] && !$tmp_group_by_data[$i]) { foreach ($group_by_data[$i]['Seminar_id'] as $id => $bar) { $tmp_group_by_data[$i]['Seminar_id'][$id] = true; } } $tmp_group_by_data[$i]['Seminar_id'][$seminar_id] = true; } } } } } if (is_array($tmp_group_by_data)) { if ($this->sem_number !== false) { unset($group_by_data); } foreach ($tmp_group_by_data as $start_sem => $detail) { $group_by_data[$start_sem] = $detail; } } } //release memory unset($snap); unset($tmp_group_by_data); foreach ($group_by_data as $group_field => $sem_ids) { foreach ($sem_ids['Seminar_id'] as $seminar_id => $foo) { if ($orderby_field) { $name = strtolower(key($sem_data[$seminar_id][$orderby_field])); } else { $name = strtolower(key($sem_data[$seminar_id]["VeranstaltungsNummer"])); } $name = str_replace(array('ä', 'ö', 'ü'), array('ae', 'oe', 'ue'), $name); $group_by_data[$group_field]['Seminar_id'][$seminar_id] = $name; } uasort($group_by_data[$group_field]['Seminar_id'], 'strnatcmp'); } switch ($this->sem_browse_data['group_by']) { case 0: krsort($group_by_data, SORT_NUMERIC); break; case 1: uksort($group_by_data, create_function('$a,$b', '$the_tree = TreeAbstract::GetInstance("StudipSemTree", false); $the_tree->buildIndex(); return (int)($the_tree->tree_data[$a]["index"] - $the_tree->tree_data[$b]["index"]); ')); break; case 3: uksort($group_by_data, create_function('$a,$b', 'global $SEM_CLASS,$SEM_TYPE; return strnatcasecmp($SEM_TYPE[$a]["name"]." (". $SEM_CLASS[$SEM_TYPE[$a]["class"]]["name"].")", $SEM_TYPE[$b]["name"]." (". $SEM_CLASS[$SEM_TYPE[$b]["class"]]["name"].")");')); break; default: uksort($group_by_data, 'strnatcasecmp'); break; } return array($group_by_data, $sem_data); }
function set_highscore($score = 0) { $db = new DB_Seminar("INSERT INTO murmeln_highscore (score,user_id,name) VALUES (\n\t\t\t\t\t\t\t{$score}, '" . $GLOBALS['user']->id . "','" . mysql_escape_string(get_fullname()) . "')"); return $db->affected_rows(); }
private function getContentListCharacters () { $selected_item_ids = $this->config->getValue('SelectInstitutes', 'institutesselected'); // at least one institute has to be selected in the configuration if (!is_array($selected_item_ids)) { return array(); } $content = array(); // at least one institute has to be selected in the configuration if (!is_array($selected_item_ids)) { return array(); } $db = new DB_Seminar(); $dbv = DbView::getView('sem_tree'); if ($this->config->getValue('Main', 'onlylecturers')) { $current_semester = get_sem_num(time()); $query = sprintf("SELECT COUNT(DISTINCT aum.user_id) as count_user, " . "UPPER(LEFT(TRIM(aum.Nachname),1)) AS initiale " . "FROM user_inst ui " . "LEFT JOIN seminar_user su ON ui.user_id = su.user_id " . "LEFT JOIN seminare s ON su.Seminar_id = s.Seminar_id " . "LEFT JOIN auth_user_md5 aum ON su.user_id = aum.user_id " . "WHERE su.status = 'dozent' AND s.visible = 1 " . "AND ((%s) = %s OR ((%s) <= %s AND ((%s) >= %s OR (%s) = -1))) " . "AND TRIM(aum.Nachname) != '' " . "AND ui.Institut_id IN ('%s') " . "AND ui.externdefault = 1 " . "AND " . get_ext_vis_query() . "GROUP BY initiale", $dbv->sem_number_sql, $current_semester, $dbv->sem_number_sql, $current_semester, $dbv->sem_number_end_sql, $current_semester, $dbv->sem_number_end_sql, implode("','", $selected_item_ids)); } else { $query = sprintf("SELECT COUNT(DISTINCT ui.user_id) as count_user, " . "UPPER(LEFT(TRIM(aum.Nachname),1)) AS initiale " . "FROM user_inst ui " . "LEFT JOIN auth_user_md5 aum USING (user_id) " . "WHERE ui.inst_perms IN ('%s') " . "AND ui.Institut_id IN ('%s') " . "AND ui.externdefault = 1 " . "AND TRIM(aum.Nachname) != '' " . "GROUP BY initiale", implode("','", $this->config->getValue('Main', 'instperms')), implode("','", $selected_item_ids)); } $db->query($query); while ($db->next_record()) { $content['LIST_CHARACTERS']['CHARACTER'][] = array( 'CHARACTER_USER' => ExternModule::ExtHtmlReady($db->f('initiale')), 'CHARACTER_COUNT_USER' => ExternModule::ExtHtmlReady($db->f('count_user')), 'URL_LIST_PERSONS' => $this->getLinkToModule('LinkInternListCharacters', array('initiale' => $db->f('initiale')))); } return $content; }
function convert_data( $logfile_handle, $secret_password){ // data conversion code: // we need enough memory ini_set( "memory_limit", "256M"); // set URL of subroutine file // (needed because of PHP memory problems, if the conversion would be done in one step) $CONVERSION_SUBROUTINE_URL = $GLOBALS["ABSOLUTE_URI_STUDIP"] ."raumzeit_conversion_subroutine.php"; // define step size (number of rows) for subroutine proccessing $STEP_SIZE= 300; // include business logic require_once('lib/classes/Seminar.class.php'); require_once('lib/resources/lib/VeranstaltungResourcesAssign.class.php'); // lets go... fwrite($logfile_handle, "(". date("Y-m-d H:i:s T") .") Starting conversion of imported seminar dates.\n"); // STEP 1: // convert the title of dates (="content") to real themes // converts all dates, that don't have content=='' fwrite($logfile_handle, "(". date("Y-m-d H:i:s T") .") Step 1: Converting the title of dates to real themes:\n"); // create database connectors $db = new DB_Seminar(); $db2 = new DB_Seminar(); // get all dates (=termine) with content!='' $db->query("SELECT termine.* FROM seminare LEFT JOIN termine ON (seminare.Seminar_id = termine.range_id) WHERE (content != '' OR description != '')"); $counter = 0; // create new theme for each date while ($db->next_record()) { $counter++; $new_issue_id = md5(uniqid("Issue")); $db2->query("INSERT INTO themen_termine (issue_id, termin_id) VALUES ('$new_issue_id', '".$db->f('termin_id')."')"); $db2->query("INSERT INTO themen (issue_id, seminar_id, author_id, title, description, mkdate, chdate) VALUES ('$new_issue_id', '".$db->f('range_id')."', '".$db->f('author_id')."', '".mysql_escape_string($db->f('content'))."', '".mysql_escape_string($db->f('description'))."', '".$db->f('mkdate')."', '".$db->f('chdate')."')"); $db2->query("UPDATE termine SET content = '', description = '' WHERE termin_id = '".$db->f('termin_id')."'"); $db2->query("UPDATE folder SET range_id = '$new_issue_id' WHERE range_id = '".$db->f('termin_id')."'"); if($db->f('topic_id')){ $db2->query("UPDATE px_topics SET topic_id = '$new_issue_id' WHERE topic_id = '".$db->f('topic_id')."'"); $db2->query("UPDATE px_topics SET root_id = '$new_issue_id' WHERE root_id = '".$db->f('topic_id')."'"); $db2->query("UPDATE px_topics SET parent_id = '$new_issue_id' WHERE parent_id = '".$db->f('topic_id')."'"); } fwrite($logfile_handle, "(". date("Y-m-d H:i:s T") .") converting termin_id='".$db->f('termin_id')."', added theme_id='".$new_issue_id."'\n"); flush(); } fwrite($logfile_handle, "(". date("Y-m-d H:i:s T") .") Finished Step 1. Converted $counter dates.\n"); // END OF STEP 1 // STEP 2: // create single dates for all regular dates (turnus_data in metadata_dates) fwrite($logfile_handle, "(". date("Y-m-d H:i:s T") .") Step 2: Creating single dates for all regular dates:\n"); // reset counter $counter = 0; // set number of record to start with $start_at = 0; do { // call the conversion subroutine with number of rows that should get processed $subroutine_url = $CONVERSION_SUBROUTINE_URL ."?step_size=".$STEP_SIZE."&start_at=".$start_at."&secret=".$secret_password; // curl: // create cURL-Handle $ch = curl_init(); // set url and other option curl_setopt($ch, CURLOPT_URL, $subroutine_url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); // make the call to the url $response = curl_exec ($ch); // close cURL-Handle und gebe die Systemresourcen frei curl_close($ch); // file_get_contents (fopen wrappers) // removed file_get_contents access, in favor of curl because file_get_contents could not access the desired URL with // every data we had for testing; it was not possible to reproduce this error e.g. by calling file_get_contents // directly from the shell // // open URL via fopen = "call" subroutine // $response = file_get_contents( $subroutine_url ); // success ? if( $response == FALSE ){ $this->write( get_class($this)." - Error while executing subroutine. Can't open URL. Stopping.\n"); fwrite($logfile_handle, "Error while executing subroutine. Can't open URL '$subroutine_url'. Stopping.\n"); throw new Exception("Error while executing subroutine."); } // some not quite nice error handling: if( substr($response,0,5) == "ERROR" ){ // write output to logfile $this->write( get_class($this)." - Error while executing subroutine. Please see logfile for details. Stopping.\n"); fwrite( $logfile_handle, $response); fwrite($logfile_handle, "Error while executing subroutine. Stopping.\n"); throw new Exception("Error while executing subroutine.". $response); } // get last line (holds the number of converted rows) $begin_of_last_line = strrpos( $response, "\n")+1; $numberOfConvertedRows = substr($response, $begin_of_last_line, strlen($response)-$begin_of_last_line); // check, if $numberOfConvertedRows is really a number if( !is_numeric($numberOfConvertedRows) ){ $this->write( get_class($this)." - Error while executing subroutine. Please see logfile for details. Stopping.\n"); // write output to logfile fwrite( $logfile_handle, $response."\n"); fwrite($logfile_handle, "Error while executing subroutine. Invalid number of converted lines found. Stopping.\n"); throw new Exception("Error while executing subroutine.\n ". $response); } // cutoff last line $response = substr($response, 0, $begin_of_last_line); // write output to logfile fwrite( $logfile_handle, $response); // count total amount of converted seminars $counter += $numberOfConvertedRows; // step to next record package $start_at += $STEP_SIZE; } while( $numberOfConvertedRows != 0); fwrite($logfile_handle, "(". date("Y-m-d H:i:s T") .") Finished Step 2. Converted $counter seminars.\n"); fwrite($logfile_handle, "(". date("Y-m-d H:i:s T") .") Conversion finished."); $this->write( get_class($this).": Converted $counter seminars."); }