Copyright (C) 2005-2008 James Grant This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ ?> selectNameType -> complete | |-> selectConference -> enterName -> complete */ $wizard_steps = array( 'start' => array( 'title' => i18n('Add a Conference'), 'builder' => 'build_start_step', 'handler' => 'handle_start_step', 'fields' => array( 'method' ), 'actions' => array( 'cancel' => i18n('Cancel'), 'next' => i18n('Next'), ) ), 'selectNameType' => array( 'title' => i18n('Conference Name and Type'), 'builder' => 'build_select_nametype_step', 'handler' => 'handle_select_nametype_step', 'fields' => array( 'name', 'type' ), 'actions' => array( 'cancel' => i18n('Cancel'), 'next' => i18n('Next'), 'back' => i18n('Back'), ) ), 'selectConference' => array( 'title' => i18n('Select a Conference'), 'builder' => 'build_select_conference_step', 'handler' => 'handle_select_conference_step', 'fields' => array( 'mastercopy', 'endExisting', 'rollDates' ), 'actions' => array( 'cancel' => i18n('Cancel'), 'next' => i18n('Next'), 'back' => i18n('Back'), ) ), 'enterName' => array( 'title' => i18n('Conference Name'), 'builder' => 'build_enter_name_step', 'handler' => 'handle_enter_name_step', 'fields' => array( 'name' ), 'actions' => array( 'cancel' => i18n('Cancel'), 'next' => i18n('Next'), 'back' => i18n('Back'), ) ), 'complete' => array( 'title' => i18n('Confirmation'), 'builder' => 'build_complete_step', 'handler' => 'handle_complete_step', 'fields' => array(), 'actions' => array( 'cancel' => i18n('Cancel'), 'ok' => i18n('OK'), 'back' => i18n('Back'), ) ), 'error' => array( 'title' => i18n('Error'), 'builder' => null, 'handler' => 'wizard_close', 'fields' => array(), 'actions' => array('close' => i18n('Close')) ) ); // check for a step submitted by the wizard if(array_key_exists('formAction', $_POST)){ if(array_key_exists('formStep', $_POST)){ $stepName = $_POST['formStep']; $wizard_steps[$stepName]['handler'](); } exit(); } // check for an action by the normal method if(array_key_exists('action', $_GET)){ switch($_GET['action']){ case 'loadTable': draw_conferences_list(); break; case 'new': // present them with a wizard in which to create a new conference $_SESSION['conference_wizard'] = array(); wizard_draw_step('start'); break; case 'edit': // give them an editor in which to modify an existing conference $cid = intval($_POST['id']); if($cid){ $conf = mysql_fetch_assoc(mysql_query("SELECT * FROM conferences WHERE id = $cid")); if(is_array($conf)){ echo ""; echo ""; echo ""; echo ""; echo "
" . i18n('Name') . ":
" . i18n('Conference Type') . ":"; echo ""; echo "
" . i18n('Status') . ":"; $statuses = array('pending','running','ended'); echo ""; echo "
"; } } break; case 'save': // save the new conference data for the conference that's being edited $confId = intval($_POST['id']); if(!$confId) { error_("invalid conference id"); } else { // verify that the specified conference already exists $countRecord = mysql_fetch_assoc(mysql_query("SELECT COUNT(*) as tally FROM conferences WHERE id = $confId")); $tally = $countRecord['tally']; if($tally == 1){ // ok, it's a valid conference id. Let's go ahead and update the data for it $confType = mysql_real_escape_string($_POST['confType']); $confName = mysql_real_escape_string($_POST['confName']); $confStatus = mysql_real_escape_string($_POST['confStatus']); mysql_query("UPDATE conferences SET type='$confType', name='$confName', status='$confStatus' WHERE id='$confId'"); $errMsg = mysql_error(); if($errMsg != null){ error_("SQL error: $errMsg"); }else{ happy_("Conference updated successfully"); } }else{ error_("nonexistant conference id"); } } break; case 'delete': // delete the specified conference $confId = intval($_POST['id']); if(!$confId){ error_("invalid conference id"); }else{ mysql_query("UPDATE conferences set status='deleted' WHERE id = $confId"); $errMsg = mysql_error(); if($errMsg != null){ error_("SQL error: $errMsg"); }else{ happy_("Conference updated successfully"); } } break; } exit; } send_header("Conferences Setup", array('Committee Main' => 'committee_main.php', 'System Setup' => '/super/index.php') ,"configuration" ); ?> Add a conference

"; echo "" . i18n("Conferences") . ""; $query = mysql_query("SELECT * FROM `conferences` WHERE status <> 'deleted'"); $rowNumbr = 0; while($row = mysql_fetch_assoc($query)){ echo ''; echo "{$row['name']}{$row['type']}{$row['status']}"; echo "\"""; if($row['status'] == 'running'){ echo ""; // can't delete a running conference }else{ echo "\"""; } echo ""; } echo ""; } /************** Wizard handling functions *************/ // draw an individual step in the wizard function wizard_draw_step($step, $message = null){ global $wizard_steps; if(array_key_exists($step, $wizard_steps)){ // tell the client what fields we expect to have sent back echo ""; if($message != null){ // used for error messages (eg. empty field) echo "
" . $message . "
"; } // draw the actual content of this step echo "
"; if(function_exists($wizard_steps[$step]['builder'])){ $wizard_steps[$step]['builder'](); } echo "
"; echo ""; } } // close the wizard function wizard_close(){ unset($_SESSION['conference_wizard']); echo " "; } /************** Functions for drawing and processing individual wizard steps ************/ function build_start_step(){ echo '

' . i18n("This wizard will help you set up a new conference.") . '

'; // find out if any conferences already exist $tally = mysql_result(mysql_query("SELECT COUNT(*) FROM conferences"), 0); if($tally == 0){ // no conferences, so just let them continue echo '

' . i18n("Click next to continue") . '

'; echo ''; }else{ $copy_selected = ''; $create_selected = 'checked'; if(array_key_exists('method', $_SESSION['conference_wizard'])){ if($_SESSION['conference_wizard']['method'] == 'copy'){ $copy_selected = 'checked'; $create_selected = ''; } }else{ } echo '

' . i18n("What would you like to do?") . '

'; echo '
'; echo ' ' . i18n('Create a new conference') . '
'; echo ' ' . i18n('Copy an existing conference') . '
'; echo '
'; } } function handle_start_step(){ if($_POST['formAction'] == 'cancel'){ wizard_close(); }else{ $_SESSION['conference_wizard']['method'] = $_POST['method']; switch($_POST['method']){ case 'create': wizard_draw_step('selectNameType'); break; case 'copy': wizard_draw_step('selectConference'); break; default: wizard_close(); $save = false; } } } function build_select_nametype_step(){ global $conference_types; echo "

" . i18n("Please enter the name and type of this conference.") . "

"; echo '
'; echo ""; echo ""; $val = ''; if(array_key_exists('name', $_SESSION['conference_wizard'])){ $val = ' VALUE="' . $_SESSION['conference_wizard']['name'] . '" '; } echo ""; echo ""; echo ""; echo ""; echo "
" . i18n("Conference Name") . "
" . i18n("Conference Type") . "
"; echo "
"; } function handle_select_nametype_step(){ if($_POST['formAction'] == 'cancel'){ wizard_close(); }else{ $_SESSION['conference_wizard']['type'] = $_POST['type']; $_SESSION['conference_wizard']['name'] = $_POST['name']; if($_POST['formAction'] == 'back'){ wizard_draw_step('start'); }else{ if($_POST['name'] == ''){ wizard_draw_step('selectNameType', i18n('A name for the conference is required')); }else{ wizard_draw_step('complete'); // handle_complete_step(); } } } } function build_select_conference_step(){ // get our default/entered values $selectedID = -1; $endchecked = ''; $rollchecked = ' checked '; if(array_key_exists('mastercopy', $_SESSION['conference_wizard'])){ $selectedID = $_SESSION['conference_wizard']['mastercopy']; if($_SESSION['conference_wizard']['endExisting'] == 'yes'){ $endchecked = ' checked '; } if($_SESSION['conference_wizard']['rollDates'] == 'no'){ $rollchecked = ''; } } echo "

" . i18n("Please select the conference that you wish to copy.") . "

"; echo '
'; echo ""; echo ""; echo "
"; echo ""; echo "
"; echo ""; echo "" . i18n("End this conference after copying it") . "
"; echo ""; echo "" . i18n("Increment dates by a year") . "
"; echo '
'; } function handle_select_conference_step(){ if($_POST['formAction'] == 'cancel'){ wizard_close(); }else{ $_SESSION['conference_wizard']['mastercopy'] = $_POST['mastercopy']; $_SESSION['conference_wizard']['endExisting'] = $_POST['endExisting']; $_SESSION['conference_wizard']['rollDates'] = $_POST['rollDates']; if($_POST['formAction'] == 'back'){ wizard_draw_step('start'); }else{ wizard_draw_step('enterName'); } } } function build_enter_name_step(){ echo "

" . i18n("Please enter a name for this conference") . "

"; $val = ''; if(array_key_exists('name', $_SESSION['conference_wizard'])){ // get the value previously answered $val = ' VALUE="' . $_SESSION['conference_wizard']['name'] . '" '; }else if(array_key_exists('mastercopy', $_SESSION['conference_wizard'])){ // get the name of the conference we're copying $query = "SELECT name FROM conferences WHERE id = {$_SESSION['conference_wizard']['mastercopy']}"; $result = mysql_fetch_assoc(mysql_query($query)); $val = ' VALUE="' . $result['name'] . '" '; } echo "
"; } function handle_enter_name_step(){ if($_POST['formAction'] == 'cancel'){ wizard_close(); }else{ $_SESSION['conference_wizard']['name'] = $_POST['name']; if($_POST['formAction'] == 'back'){ wizard_draw_step('selectConference'); }else{ if($_POST['name'] == ''){ wizard_draw_step('enterName', i18n('A name for the conference is required')); }else{ wizard_draw_step('complete'); } // handle_complete_step(); } } } function build_complete_step(){ echo "

"; echo i18n("All of the required information has been gathered. Click "OK" to complete the process."); echo "

"; } function handle_complete_step(){ // print_r($_SESSION); if($_POST['formAction'] == 'cancel'){ wizard_close(); }else if($_POST['formAction'] == 'back'){ if($_SESSION['conference_wizard']['method'] == 'copy'){ wizard_draw_step('enterName'); }else{ wizard_draw_step('selectNameType'); } }else{ switch($_SESSION['conference_wizard']['method']){ case 'create': $result = create_conference($_SESSION['conference_wizard']); if(is_numeric($result)){ wizard_close(); }else{ wizard_draw_step('error', $result); } break; case 'copy': if(copy_conference($_SESSION['conference_wizard'])){ wizard_close(); } break; } } } // returns the id of the created conference if successful, error message otherwise function create_conference($params){ $cname = mysql_real_escape_string($params['name']); $ctype = $params['type']; mysql_query("INSERT INTO conferences (oid, name, type, status) VALUES (1, '" . $cname . "', '$ctype', 'pending')"); //if its created brand spanking new, we set the copyoriginal and copyparent to be the same as the id $conferences_id=mysql_insert_id(); mysql_query("UPDATE conferences SET copyoriginal='$conferences_id', copyparent='$conferences_id' WHERE id='$conferences_id'"); $errorMessage = mysql_error(); if($errorMessage){ return "SQL Error:
$errorMessage"; } //copy over the award_types defaults $q=mysql_query("SELECT * FROM award_types WHERE conferences_id='-1'"); while($r=mysql_fetch_object($q)) { mysql_query("INSERT INTO award_types (id,type,`order`, conferences_id) VALUES ('$r->id','$r->type','$r->order','".$conferences_id."')"); } // add this administrator's admin user account for the new conference $u = user_create($_SESSION['accounts_id'], $conferences_id); $q = mysql_query("SELECT id FROM roles WHERE `type` IN('admin', 'config')"); while($row = mysql_fetch_assoc($q)){ mysql_query(" INSERT INTO user_roles (accounts_id, users_id, roles_id, active, complete) VALUES({$_SESSION['accounts_id']}, {$u['id']}, {$row['id']}, 'yes', 'yes') "); } user_add_role($u, 'admin'); user_add_role($u, 'config'); return $conferences_id; } // copy users of the specified roles from conference oldConfId to conference newConfId // roles can be passed as a single comma delimited string, or as an array of strings // return 'ok' on success, error message otherwise function conferences_copy_users($oldConfId, $newConfId, $roles){ if(!is_array($roles)){ // they must have been passed as a string $roles = explode(',', $roles); foreach($roles as $idx => $val){ $roles[$idx] = trim($val); } } $query = mysql_query(" SELECT * FROM users WHERE users.id IN( SELECT DISTINCT(users.id) FROM users JOIN user_roles ON user_roles.users_id = users.id JOIN roles on roles.id = user_roles.roles_id WHERE roles.`type` IN ('" . implode("','", $roles) . "') AND users.conferences_id = $oldConfId ) "); $keys = ''; while(mysql_error() == '' && $row = mysql_fetch_assoc($query)){ // first we copy the user $oldId = $row['id']; unset($row['id']); if($keys == ''){ $keyList = array_keys($row); $keys = "`" . implode("`,`", $keyList) . "`"; } $row['conferences_id'] = $newConfId; $values = "'" . implode("','", $row) . "'"; mysql_query("INSERT INTO users ($keys) VALUES ($values)"); $uid = mysql_insert_id(); $aid = $row['accounts_id']; // now copy their applicable roles $q2 = mysql_query(" SELECT roles_id, active, complete FROM user_roles JOIN roles ON roles.id = user_roles.roles_id WHERE roles.`type` IN('" . implode("','", $roles) . "') AND user_roles.users_id = $oldId "); while(mysql_error() == '' && $row2 = mysql_fetch_assoc($q2)){ mysql_query(" INSERT INTO user_roles(`accounts_id`, `users_id`, `roles_id`, `active`, `complete`) VALUES($aid, $uid, {$row2['roles_id']}, '{$row2['active']}', '{$row2['complete']}') "); } } if(mysql_error() != '') return "SQL error :
" . mysql_error(); return 'ok'; } // copy a conference - returns true on success, false otherwise. Gives the wizard an error message one occurs function copy_conference($params){ /* $params: { mastercopy => id of conf to copy endExisting => end it after copying rollDates => increment the dates by a year name => the new name }*/ global $config; // start a list of all tables that have been updated $completedTables = array(); // we'll start by creating the new conference $oldConfId = $params['mastercopy']; $oldConf = mysql_fetch_assoc(mysql_query("SELECT * FROM conferences WHERE id = {$oldConfId}")); mysql_query("INSERT INTO conferences (oid, name, type, status, copyoriginal, copyparent) VALUES (1, '" . mysql_real_escape_string($params['name']) . "', '{$oldConf['type']}', 'pending','{$oldConf['copyoriginal']}','{$oldConf['id']}')"); if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error on line #' . (__LINE__ - 1) . ':
' . mysql_error()); return false; } $newConfId = mysql_insert_id(); // then copy the configuration variables config_update_variables($newConfId, $oldConfId); // now the dates if($params['rollDates'] == 'yes'){ $q=mysql_query("SELECT DATE_ADD(date,INTERVAL 365 DAY) AS newdate, name, description FROM dates WHERE conferences_id = $oldConfId"); }else{ $q=mysql_query("SELECT date AS newdate, name, description FROM dates WHERE conferences_id = $oldConfId"); } while(mysql_error() == '' && $r = mysql_fetch_object($q)) mysql_query("INSERT INTO dates (date,name,description,conferences_id) VALUES ( '".mysql_real_escape_string($r->newdate)."', '".mysql_real_escape_string($r->name)."', '".mysql_real_escape_string($r->description)."', '".mysql_real_escape_string($newConfId)."')"); $completedTables[] = 'dates'; if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ':
' . mysql_error()); rollback($newConfId, $completedTables); return false; } // page text $q = mysql_query("SELECT * FROM pagetext WHERE conferences_id = $oldConfId"); while(mysql_error() == '' && $r=mysql_fetch_object($q)) mysql_query("INSERT INTO pagetext (textname,textdescription,text,lastupdate,conferences_id,lang) VALUES ( '".mysql_real_escape_string($r->textname)."', '".mysql_real_escape_string($r->textdescription)."', '".mysql_real_escape_string($r->text)."', '".mysql_real_escape_string($r->lastupdate)."', '".mysql_real_escape_string($newConfId)."', '".mysql_real_escape_string($r->lang)."')"); $completedTables[] = 'pagetext'; if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ':
' . mysql_error()); rollback($newConfId, $completedTables); return false; } // project categories $q = mysql_query("SELECT * FROM projectcategories WHERE conferences_id = $oldConfId"); while(mysql_error() == '' && $r=mysql_fetch_object($q)) mysql_query("INSERT INTO projectcategories (id,category,category_shortform,mingrade,maxgrade,conferences_id) VALUES ( '".mysql_real_escape_string($r->id)."', '".mysql_real_escape_string($r->category)."', '".mysql_real_escape_string($r->category_shortform)."', '".mysql_real_escape_string($r->mingrade)."', '".mysql_real_escape_string($r->maxgrade)."', '".mysql_real_escape_string($newConfId)."')"); $completedTables[] = 'projectcategories'; if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ':
' . mysql_error()); rollback($newConfId, $completedTables); return false; } // project divisions $q=mysql_query("SELECT * FROM projectdivisions WHERE conferences_id=$oldConfId"); while(mysql_error() == '' && $r=mysql_fetch_object($q)) mysql_query("INSERT INTO projectdivisions (id,division,division_shortform,cwsfdivisionid,conferences_id) VALUES ( '".mysql_real_escape_string($r->id)."', '".mysql_real_escape_string($r->division)."', '".mysql_real_escape_string($r->division_shortform)."', '".mysql_real_escape_string($r->cwsfdivisionid)."', '".mysql_real_escape_string($newConfId)."')"); $completedTables[] = 'projectdivisions'; if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ':
' . mysql_error()); rollback($newConfId, $completedTables); return false; } // project subdivisions $q=mysql_query("SELECT * FROM projectsubdivisions WHERE conferences_id=$oldConfId"); while(mysql_error() == '' && $r=mysql_fetch_object($q)) mysql_query("INSERT INTO projectsubdivisions (id,projectdivisions_id,subdivision,conferences_id) VALUES ( '".mysql_real_escape_string($r->id)."', '".mysql_real_escape_string($r->projectsubdivisions_id)."', '".mysql_real_escape_string($r->subdivision)."', '".mysql_real_escape_string($newConfId)."')"); $completedTables[] = 'projectsubdivisions'; if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ':
' . mysql_error()); rollback($newConfId, $completedTables); return false; } // safety questions $q=mysql_query("SELECT * FROM safetyquestions WHERE conferences_id=$oldConfId"); while(mysql_error() == '' && $r=mysql_fetch_object($q)) mysql_query("INSERT INTO safetyquestions (question,type,required,ord,conferences_id) VALUES ( '".mysql_real_escape_string($r->question)."', '".mysql_real_escape_string($r->type)."', '".mysql_real_escape_string($r->required)."', '".mysql_real_escape_string($r->ord)."', '".mysql_real_escape_string($newConfId)."')"); $completedTables[] = 'safetyquestions'; if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ':
' . mysql_error()); rollback($newConfId, $completedTables); return false; } // awards $q=mysql_query("SELECT * FROM award_awards WHERE conferences_id=$oldConfId"); $errorMessage = mysql_error(); while($errorMessage == '' && $r=mysql_fetch_object($q)) { /* Roll the one award */ $errorMessage .= roll($oldConfId, $newConfId, 'award_awards', "id='{$r->id}'"); $award_awards_id=mysql_insert_id(); $errorMessage .= roll($oldConfId, $newConfId, 'award_awards_projectcategories', "award_awards_id='{$r->id}'", array('award_awards_id' => $award_awards_id)); $errorMessage .= roll($oldConfId, $newConfId, 'award_awards_projectdivisions', "award_awards_id='{$r->id}'", array('award_awards_id' => $award_awards_id)); $errorMessage .= roll($oldConfId, $newConfId, 'award_prizes', "award_awards_id='{$r->id}'", array('award_awards_id' => $award_awards_id)); } $completedTables[] = 'award_awards'; $completedTables[] = 'award_awards_projectcategories'; $completedTables[] = 'award_awards_projectdivisions'; $completedTables[] = 'award_prizes'; if($errorMessage != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ':
' . $errorMessage); rollback($newConfId, $completedTables); return false; } // award types $q=mysql_query("SELECT * FROM award_types WHERE conferences_id = $oldConfId"); while(mysql_error() == '' && $r=mysql_fetch_object($q)) mysql_query("INSERT INTO award_types (id,type,`order`,conferences_id) VALUES ( '".mysql_real_escape_string($r->id)."', '".mysql_real_escape_string($r->type)."', '".mysql_real_escape_string($r->order)."', '".mysql_real_escape_string($newConfId)."')"); $completedTables[] = 'award_types'; if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ':
' . mysql_error()); rollback($newConfId, $completedTables); return false; } // schools $q=mysql_query("SELECT * FROM schools WHERE conferences_id=$oldConfId"); while(mysql_error() == '' && $r=mysql_fetch_object($q)) { $puid = ($r->principal_uid == null) ? 'NULL' : ("'".intval($r->principal_uid)."'"); $shuid = ($r->sciencehead_uid == null) ? 'NULL' : ("'".intval($r->sciencehead_uid)."'"); mysql_query("INSERT INTO schools (school,schoollang,schoollevel,board,district,phone,fax,address,city,province_code,postalcode,principal_uid,schoolemail,sciencehead_uid,accesscode,lastlogin,junior,intermediate,senior,registration_password,projectlimit,projectlimitper,conferences_id) VALUES ( '".mysql_real_escape_string($r->school)."', '".mysql_real_escape_string($r->schoollang)."', '".mysql_real_escape_string($r->schoollevel)."', '".mysql_real_escape_string($r->board)."', '".mysql_real_escape_string($r->district)."', '".mysql_real_escape_string($r->phone)."', '".mysql_real_escape_string($r->fax)."', '".mysql_real_escape_string($r->address)."', '".mysql_real_escape_string($r->city)."', '".mysql_real_escape_string($r->province_code)."', '".mysql_real_escape_string($r->postalcode)."',$puid, '".mysql_real_escape_string($r->schoolemail)."',$shuid, '".mysql_real_escape_string($r->accesscode)."', NULL, '".mysql_real_escape_string($r->junior)."', '".mysql_real_escape_string($r->intermediate)."', '".mysql_real_escape_string($r->senior)."', '".mysql_real_escape_string($r->registration_password)."', '".mysql_real_escape_string($r->projectlimit)."', '".mysql_real_escape_string($r->projectlimitper)."', '".mysql_real_escape_string($newConfId)."')"); } $completedTables[] = 'schools'; if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ':
' . mysql_error()); rollback($newConfId, $completedTables); return false; } // questions $q = mysql_query("SELECT * FROM questions WHERE conferences_id = $oldConfId"); while(mysql_error() == '' && $r=mysql_fetch_object($q)) mysql_query("INSERT INTO questions (id,conferences_id,section,db_heading,question,type,required,ord) VALUES ( '', '$newConfId', '".mysql_real_escape_string($r->section)."', '".mysql_real_escape_string($r->db_heading)."', '".mysql_real_escape_string($r->question)."', '".mysql_real_escape_string($r->type)."', '".mysql_real_escape_string($r->required)."', '".mysql_real_escape_string($r->ord)."')"); $completedTables[] = 'questions'; if(mysql_error() != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ':
' . mysql_error()); rollback($newConfId, $completedTables); return false; } // regfee items $errorMessage = roll($oldConfId, $newConfId, 'regfee_items'); $completedTables[] = 'regfee_items'; if($errorMessage != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ':
' . $errorMessage); rollback($newConfId, $completedTables); return false; } // volunteer positions $errorMessage = roll($oldConfId, $newConfId, 'volunteer_positions'); $completedTables[] = 'volunteer_positions'; if($errorMessage != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ':
' . $errorMessage); rollback($newConfId, $completedTables); return false; } // timeslots and rounds $q = mysql_query("SELECT * FROM judges_timeslots WHERE conferences_id='$oldConfId' AND round_id='0'"); $errorMessage = mysql_error(); while($errorMessage == '' && $r=mysql_fetch_assoc($q)) { if($params['rollDates'] == 'yes'){ $queryText = "INSERT INTO judges_timeslots (`conferences_id`,`round_id`,`type`,`date`,`starttime`,`endtime`,`name`) VALUES ('$newConfId','0','{$r['type']}',DATE_ADD('{$r['date']}', INTERVAL 1 YEAR), '{$r['starttime']}','{$r['endtime']}','{$r['name']}')"; }else{ $queryText = "INSERT INTO judges_timeslots (`conferences_id`,`round_id`,`type`,`date`,`starttime`,`endtime`,`name`) VALUES ('$newConfId','0','{$r['type']}','{$r['date']}', '{$r['starttime']}','{$r['endtime']}','{$r['name']}')"; } mysql_query($queryText); $errorMessage .= mysql_error(); $round_id = mysql_insert_id(); $qq = mysql_query("SELECT * FROM judges_timeslots WHERE round_id='{$r['id']}'"); if($params['rollDates'] == 'yes'){ while(($rr=mysql_fetch_assoc($qq)) && $errorMessage == ''){ $queryText = "INSERT INTO judges_timeslots (`conferences_id`,`round_id`,`type`,`date`,`starttime`,`endtime`) VALUES ('$newConfId','$round_id','timeslot',DATE_ADD('{$rr['date']}', INTERVAL 1 YEAR), '{$rr['starttime']}','{$rr['endtime']}')"; mysql_query($queryText); $errorMessage .= mysql_error(); } }else{ while(($rr=mysql_fetch_assoc($qq)) && $errorMessage == ''){ $queryText = "INSERT INTO judges_timeslots (`conferences_id`,`round_id`,`type`,`date`,`starttime`,`endtime`) VALUES ('$newConfId','$round_id','timeslot','{$rr['date']}', '{$rr['starttime']}','{$rr['endtime']}')"; mysql_query($queryText); $errorMessage .= mysql_error(); } } } $completedTables[] = 'judges_timeslots'; if($errorMessage != ''){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ':
' . $errorMessage); rollback($newConfId, $completedTables); return false; } // admin, config, and committee users $errorMessage = conferences_copy_users($oldConfId, $newConfId, array('admin', 'config', 'committee')); $completedTables[] = 'users'; $completedTables[] = 'user_roles'; if($errorMessage != 'ok'){ wizard_draw_step('error', 'SQL error before line #' . __LINE__ . ':
' . $errorMessage); rollback($newConfId, $completedTables); return false; } // copy the logo files over as well $imgPath = $_SERVER['DOCUMENT_ROOT'] . $config['SFIABDIRECTORY'] . "/data"; $listing = scandir($imgPath); $digits = strlen($oldConfId); foreach($listing as $fname){ if(preg_match("/^$oldConfId-logo/", $fname)){ $newName = $newConfId . substr($fname, $digits); shell_exec("cp $imgPath/$fname $imgPath/$newName"); } } // WHEW! If we've made it this far, the conference has successfully been copied // end the previous conference if applicable if($params['endexisting'] == true){ // let's go ahead and end the conference that we just copied mysql_query("UPDATE conferences SET status = 'ended' WHERE id = '$oldConfId'"); if(mysql_error() != ''){ wizard_draw_step('error', i18n("The conference was copied successfully, but not successfully ended. You will need to end the original conference manually.") . "
SQL error:
" . mysql_error()); return false; } } return true; } // undo all of the conference rolling over that was done by copy_conference. This only gets called if an error occurs // while copying to the new conference. In that case, all of the newly added data relevant to the conference is deleted, // as well as the conference itself function rollback($conferences_id, $tables){ foreach($tables as $table){ mysql_query("DELETE FROM `$table` WHERE `conferences_id` = $conferences_id"); } mysql_query("DELETE FROM conferences WHERE id = $conferences_id"); } // return empty string on success, error message otherwise function roll($oldConfId, $newConfId, $table, $where='', $replace=array()){ /* Field Type Null Key Default Extra * id int(10) unsigned NO PRI NULL auto_increment * sponsors_id int(10) unsigned NO MUL 0 * award_source_fairs_id int(10) unsigned YES NULL */ $errMessage = ''; /* Get field list for this table */ $q = mysql_query("SHOW COLUMNS IN `$table`"); while(($c = mysql_fetch_assoc($q))) { $col[$c['Field']] = $c; } /* Record fields we care about */ $fields = array(); $keys = array_keys($col); foreach($keys as $k) { /* Skip id field */ if($col[$k]['Extra'] == 'auto_increment') continue; /* Skip year field */ if($k == 'year') continue; /* Skip conferences_id field */ if($k == 'conferences_id') continue; $fields[] = $k; } if($where == '') $where='1'; /* Get data */ $q=mysql_query("SELECT * FROM $table WHERE conferences_id='$oldConfId' AND $where"); if(mysql_error() != '') $errMessage .= mysql_error() . "
"; $names = '`' . implode('`,`', $fields) . '`'; /* Process data */ while($r=mysql_fetch_assoc($q)) { $vals = ''; foreach($fields as $f) { if(array_key_exists($f, $replace)) $vals .= ",'".mysql_real_escape_string($replace[$f])."'"; else if($col[$f]['Null'] == 'YES' && $r[$f] == NULL) $vals .= ',NULL'; else $vals .= ",'".mysql_real_escape_string($r[$f])."'"; } mysql_query("INSERT INTO `$table` (`conferences_id`, $names) VALUES ('$newConfId'$vals)"); if(mysql_error() != '') $errMessage .= mysql_error() . "
"; echo mysql_error(); } return $errMessage; }