<? /* * This file is part of the 'Science Fair In A Box' project * SFIAB Website: http://www.sfiab.ca * * Copyright (C) 2005-2006 Sci-Tech Ontario Inc <info@scitechontario.org> * Copyright (C) 2005-2006 James Grant <james@lightbox.org> * * 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. */ // This file was modified Jan of 2014 by Richard Sin // Project type has been added and can be toggled by configuration. // Feedback box also has been added for flagging purposes ?> <? require_once ('../common.inc.php'); require_once ('../user.inc.php'); require_once ('../register_participants.inc.php'); $auth_type = user_auth_required(array('fair', 'committee'), 'admin'); $registrations_id = intval($_GET['id']); $action = $_GET['action']; /* Extra restrictions for auth_type = fair */ if ($auth_type == 'fair') { $fairs_id = $_SESSION['fairs_id']; if ($registrations_id == -1 && ($action == 'registration_load' || $action == 'registration_save')) { /* we can't check the project it hasn't been created. */ } else { /* Make sure they have permission to laod this student, check the master copy of the fairs_id in the project */ $q = $pdo->prepare('SELECT * FROM projects WHERE registrations_id=? AND year=? AND fairs_id=?'); $q->execute([$registrations_id, $config['FAIRYEAR'], $fairs_id]); if ($q->rowCount() != 1) { echo 'permission denied.'; exit; } /* Ok, they have permission */ } } switch ($action) { case 'project_load': project_load(); break; case 'project_regenerate_number': /* Save first */ project_save(); /* Now generate */ $q = $pdo->prepare('SELECT id FROM projects WHERE registrations_id=? AND year=?'); $q->execute([$registrations_id, $config['FAIRYEAR']]); $i = $q->fetch(PDO::FETCH_ASSOC); $id = $i['id']; $stmt = $pdo->prepare("UPDATE projects SET projectnumber=NULL,projectsort=NULL, projectnumber_seq='0',projectsort_seq='0' WHERE id=?"); $stmt->execute([$id]); show_pdo_errors_if_any($pdo); list($pn, $ps, $pns, $pss) = generateProjectNumber($registrations_id); // print("Generated Project Number [$pn]"); $stmt = $pdo->prepare('UPDATE projects SET projectnumber=?,projectsort=?, projectnumber_seq=?,projectsort_seq=? WHERE id=?'); $stmt->execute([$pn, $ps, $pns, $pss, $id]); happy_("Generated and Saved Project Number: $pn"); break; case 'project_save': project_save(); break; default: break; } exit; function project_save() { global $registrations_id, $config, $pdo; // first, lets make sure this project really does belong to them $q = $pdo->prepare('SELECT * FROM projects WHERE registrations_id=? AND year=?'); $q->execute([$registrations_id, $config['FAIRYEAR']]); $projectinfo = $q->fetch(PDO::FETCH_OBJ); if (!$projectinfo) { echo error(i18n('Invalid project to update')); } $summarywords = preg_split('/[\s,]+/', $_POST['summary']); $summarywordcount = count($summarywords); if ($summarywordcount > $config['participant_project_summary_wordmax']) $summarycountok = 0; else $summarycountok = 1; // check if it is flagged then update it if (empty($_POST['feedback'])) { $stmt = $pdo->prepare('UPDATE projects SET ' . "flagged='0'" . 'WHERE id=?'); $stmt->execute([intval($_POST['id'])]); } else { $stmt = $pdo->prepare('UPDATE projects SET ' . "flagged='1'" . 'WHERE id=?'); $stmt->execute([intval($_POST['id'])]); } show_pdo_errors_if_any($pdo); happy_('Flagging process successfully updated'); if ($config['participant_project_title_charmax'] && strlen(stripslashes($_POST['title'])) > $config['participant_project_title_charmax']) { // 0 for no limit, eg 255 database field limit $title = substr(stripslashes($_POST['title']), 0, $config['participant_project_title_charmax']); error_('Project title truncated to %1 characters', array($config['participant_project_title_charmax'])); } else $title = stripslashes($_POST['title']); $stmt = $pdo->prepare( 'UPDATE projects SET title = :title, projectdivisions_id = :projectdivisions_id, projecttype = :projecttype, language = :language, req_table = :req_table, req_electricity = :req_electricity, req_special = :req_special, human_participants = :human_participants, animal_participants = :animal_participants, summary = :summary, summarycountok = :summarycountok, feedback = :feedback, projectsort = :projectsort WHERE id = :id' ); $stmt->bindValue(':title', $_POST['title']); $stmt->bindValue(':projectdivisions_id', intval($_POST['projectdivisions_id'])); $stmt->bindValue(':projecttype', $_POST['projecttype']); $stmt->bindValue(':language', $_POST['language']); $stmt->bindValue(':req_table', $_POST['req_table']); $stmt->bindValue(':req_electricity', $_POST['req_electricity']); $stmt->bindValue(':req_special', $_POST['req_special']); $stmt->bindValue(':human_participants', $_POST['human_participants']); $stmt->bindValue(':animal_participants', $_POST['animal_participants']); $stmt->bindValue(':summary', $_POST['summary']); $stmt->bindValue(':summarycountok', $summarycountok); $stmt->bindValue(':feedback', $_POST['feedback']); $stmt->bindValue(':projectsort', $_POST['projectsort']); $stmt->bindValue(':id', intval($_POST['id'])); $stmt->execute(); show_pdo_errors_if_any($pdo); happy_('Project information successfully updated'); // check if they changed the project number if ($_POST['projectnumber'] != $projectinfo->projectnumber) { // check if the new one is available $q = $pdo->prepare("SELECT * FROM projects WHERE year=? AND projectnumber=?"); $q->execute([$config['FAIRYEAR'], $_POST['projectnumber']]); if ($q->rowCount()) { error_('Could not change project number. %1 is already in use', array($_POST['projectnumber'])); } else { $stmt = $pdo->prepare('UPDATE projects SET projectnumber=? WHERE id=?'); $stmt->execute([$_POST['projectnumber'], $_POST['id']]); happy_('Project number successfully changed to %1', array($_POST['projectnumber'])); } } } function project_load() { global $registrations_id, $config, $pdo; // $projectcategories_id=null; // now lets find out their MAX grade, so we can pre-set the Age Category $q = $pdo->prepare('SELECT MAX(grade) AS maxgrade FROM students WHERE registrations_id=?'); $q->execute([$registrations_id]); $gradeinfo = $q->fetch(PDO::FETCH_OBJ); // now lets grab all the age categories, so we can choose one based on the max grade $q = $pdo->prepare('SELECT * FROM projectcategories WHERE year=? ORDER BY id'); $q->execute([$config['FAIRYEAR']]); while ($r = $q->fetch(PDO::FETCH_OBJ)) { // save these in an array, just incase we need them later (FIXME: remove this array if we dont need it) $agecategories[$r->id]['category'] = $r->category; $agecategories[$r->id]['mingrade'] = $r->mingrade; $agecategories[$r->id]['maxgrade'] = $r->maxgrade; if ($gradeinfo->maxgrade >= $r->mingrade && $gradeinfo->maxgrade <= $r->maxgrade) $projectcategories_id = $r->id; } // now select their project info $q = $pdo->prepare('SELECT * FROM projects WHERE registrations_id=? AND year=?'); // check if it exists, if we didnt find any record, lets insert one $q->execute([$registrations_id, $config['FAIRYEAR']]); $projectinfo = $q->fetch(PDO::FETCH_OBJ); if (!$projectinfo) { $stmt = $pdo->prepare('INSERT INTO projects (registrations_id,projectcategories_id,year) VALUES (?,?,?)'); // and then pull it back out $stmt->execute([$registrations_id, $projectcategories_id, $config['FAIRYEAR']]); $q = $pdo->prepare('SELECT * FROM projects WHERE registrations_id=? AND year=?'); $q->execute([$registrations_id, $config['FAIRYEAR']]); $projectinfo = $q->fetch(PDO::FETCH_OBJ); } // make sure that if they changed their grade on the student page, we update their projectcategories_id accordingly if ($projectcategories_id && $projectinfo->projectcategories_id != $projectcategories_id) { echo notice(i18n('Age category changed, updating to %1', array($agecategories[$projectcategories_id]['category']))); $stmt = $pdo->prepare('UPDATE projects SET projectcategories_id=? WHERE id=?'); $stmt->execute([$projectcategories_id, $projectinfo->id]); } // output the current status ?> <script language="javascript" type="text/javascript"> function countwords() { var wordmax=<?= $config['participant_project_summary_wordmax']; ?>; var summaryobj=document.getElementById('summary'); var wordcountobj=document.getElementById('wordcount'); var wordcountmessageobj=document.getElementById('wordcountmessage'); var wordarray=summaryobj.value.replace(/\s+/g," ").split(" "); var wordcount=wordarray.length; if(wordcount>wordmax) wordcountmessageobj.className="incomplete"; else wordcountmessageobj.className="complete"; wordcountobj.innerHTML=wordcount; } </script> <? if (!$projectinfo) { echo error(i18n('Invalid project to edit')); exit; } ?> <form id="project_form"> <input type="hidden" name="id" value="<?= $projectinfo->id ?>"> <table> <tr> <td><?= i18n('Project Title') ?>: </td> <td><input type="text" name="title" size="50" value="<?= htmlspecialchars($projectinfo->title) ?>" /><?= REQUIREDFIELD ?> <? if ($config['participant_project_title_charmax']) echo i18n('(Max %1 characters)', array($config['participant_project_title_charmax'])); ?> </td> </tr><tr> <td><?= i18n('Project Number') ?>: </td> <td><input type="text" name="projectnumber" size="10" value="<?= $projectinfo->projectnumber ?>" /> <input type="button" id="project_regenerate_number" value="<?= i18n('Re-Generate Project Number') ?>" /> </td> </tr><tr> <td><?= i18n('Project Sort') ?>: </td> <td><input type="text" name="projectsort" size="10" value="<?= $projectinfo->projectsort ?>" /></td></tr> <? if ($config['project_type'] == 'yes') { $q = $pdo->prepare('SELECT * FROM projecttypes ORDER BY type'); $q->execute(); echo '<tr><td>' . i18n('Project Type') . ': </td><td>'; echo "<select name=\"projecttype\">\n"; echo '<option value="">' . i18n('Select a project type') . "</option>\n"; // FIXME: need to fix the loading glitch while ($r = $q->fetch(PDO::FETCH_OBJ)) { if ($r->type == $projectinfo->projecttype) { $sel = 'selected="selected"'; } else { $sel = ''; } echo "<option $sel value=\"$r->type\">" . htmlspecialchars(i18n($r->type)) . "</option>\n"; } echo '</select>' . REQUIREDFIELD . '</td></tr>'; } ?> <tr> <td><?= i18n('Age Category') ?>: </td> <td><?= i18n($agecategories[$projectcategories_id]['category']) ?> (<?= i18n('Grades %1-%2', array($agecategories[$projectcategories_id]['mingrade'], $agecategories[$projectcategories_id]['maxgrade'])) ?>)</td> </tr><tr> <td><?= i18n('Division') ?>: </td> <td> <? // ###### Feature Specific - filtering divisions by category if ($config['filterdivisionbycategory'] == 'yes') { $q = $pdo->prepare('SELECT projectdivisions.* FROM projectdivisions,projectcategoriesdivisions_link WHERE projectdivisions.id=projectdivisions_id AND projectcategories_id=? AND projectdivisions.year=? AND projectcategoriesdivisions_link.year=? ORDER BY division'); $q->execute([$projectcategories_id, $config['FAIRYEAR'], $config['FAIRYEAR']]); show_pdo_errors_if_any($pdo); } else { $q = $pdo->prepare('SELECT * FROM projectdivisions WHERE year=? ORDER BY division'); $q->execute([$config['FAIRYEAR']]); } echo '<select name="projectdivisions_id">'; echo '<option value="">' . i18n('Select a division') . "</option>\n"; while ($r = $q->fetch(PDO::FETCH_OBJ)) { if ($r->id == $projectinfo->projectdivisions_id) $sel = 'selected="selected"'; else $sel = ''; echo "<option $sel value=\"$r->id\">" . htmlspecialchars(i18n($r->division)) . "</option>\n"; } echo '</select>' . REQUIREDFIELD; if ($config['usedivisionselector'] == 'yes') { ?> <script language="javascript" type="text/javascript"> function openDivSelWindow() { divselwin=window.open('register_participants_project_divisionselector.php','divsel','width=500,height=220,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no') if(divselwin.opener==null) divselwin.opener=self; return false; } </script> <? } echo '<br />'; echo i18n('WARNING! If you change the division you must manually change the project number too! It will NOT be assigned a new number automatically'); echo '</td></tr>'; echo '<tr><td>' . i18n('Language') . ': </td><td>'; echo "<select name=\"language\">\n"; if ($projectinfo->language) $currentlang = $projectinfo->language; else $currentlang = $_SESSION['lang']; foreach ($config['languages'] AS $key => $val) { if ($currentlang == $key) $selected = 'selected="selected"'; else $selected = ''; echo "<option $selected value=\"$key\">$val</option>"; } echo '</select>' . REQUIREDFIELD; echo '</td></tr>'; echo '<tr><td>' . i18n('Requirements') . ': </td><td>'; echo '<table>'; if ($config['participant_project_table'] == 'no') { // if we arent asking them if they want a table or not, then we set it to 'yes' assuming everyone will get a table echo ' <input type="hidden" name="req_table" value="yes" />'; } else { echo '<tr>'; echo ' <td>' . i18n('Table') . REQUIREDFIELD . '</td>'; if ($projectinfo->req_table == 'yes') $check = 'checked="checked"'; else $check = ''; echo " <td><input $check type=\"radio\" name=\"req_table\" value=\"yes\" />Yes</td>"; echo ' <td width="20"> </td>'; if ($projectinfo->req_table == 'no') $check = 'checked="checked"'; else $check = ''; echo " <td><input $check type=\"radio\" name=\"req_table\" value=\"no\" />No</td>"; echo '</tr>'; } if ($config['participant_project_electricity'] == 'no') { // if we arent asking them if they want electricity or not, then we set it to 'yes' assuming everyone will get electricity echo ' <input type="hidden" name="req_electricity" value="yes" />'; } else { echo '<tr>'; echo ' <td>' . i18n('Electricity') . REQUIREDFIELD . '</td>'; if ($projectinfo->req_electricity == 'yes') $check = 'checked="checked"'; else $check = ''; echo " <td><input $check type=\"radio\" name=\"req_electricity\" value=\"yes\" />Yes</td>"; echo ' <td width="20"> </td>'; if ($projectinfo->req_electricity == 'no') $check = 'checked="checked"'; else $check = ''; echo " <td><input $check type=\"radio\" name=\"req_electricity\" value=\"no\" />No</td>"; echo '</tr>'; } echo '<tr>'; echo ' <td>' . i18n('Special') . '</td>'; echo " <td colspan=\"3\"><input type=\"text\" name=\"req_special\" value=\"$projectinfo->req_special\" /></td>"; echo '</tr>'; echo '</table>'; if ($config['ethics_questions'] == 'yes') // If we have set ethics questions to yes then ask the ethics questions! { echo '<tr><td>' . i18n('Ethics Questions') . ':</td><td>'; echo '<table>'; echo '<tr>'; echo ' <td>' . i18n('My project involves human participants') . REQUIREDFIELD . '</td>'; if ($projectinfo->human_participants == 'yes') $check = 'checked="checked"'; else $check = ''; echo " <td><input $check type=\"radio\" name=\"human_participants\" value=\"yes\" />Yes</td>"; echo ' <td width="20"> </td>'; if ($projectinfo->human_participants == 'no') $check = 'checked="checked"'; else $check = ''; echo " <td><input $check type=\"radio\" name=\"human_participants\" value=\"no\" />No</td>"; echo '</tr>'; echo '<tr>'; echo ' <td>' . i18n('My project involves animals') . REQUIREDFIELD . '</td>'; if ($projectinfo->animal_participants == 'yes') $check = 'checked="checked"'; else $check = ''; echo " <td><input $check type=\"radio\" name=\"animal_participants\" value=\"yes\" />Yes</td>"; echo ' <td width="20"> </td>'; if ($projectinfo->animal_participants == 'no') $check = 'checked="checked"'; else $check = ''; echo " <td><input $check type=\"radio\" name=\"animal_participants\" value=\"no\" />No</td>"; echo '</tr>'; echo '</table>'; } echo '</td></tr>'; echo '<tr><td>' . i18n('Summary') . ': </td><td><textarea onchange=\'countwords()\' onkeypress=\'countwords()\' cols="60" rows="12" id="summary" name="summary">' . htmlspecialchars($projectinfo->summary, ENT_NOQUOTES, 'ISO8859-1') . '</textarea>' . REQUIREDFIELD . '<br />'; $summarywords = preg_split('/[\s,]+/', $projectinfo->summary); $summarywordcount = count($summarywords); if ($summarywordcount > $config['participant_project_summary_wordmax']) echo '<div id="wordcountmessage" class="incomplete">'; else echo '<div id="wordcountmessage" class="complete">'; echo "<span id=\"wordcount\">$summarywordcount</span>/"; echo i18n('%1 words maximum', array($config['participant_project_summary_wordmax'])); echo '</div>'; echo '<tr><td>' . i18n('Feedback') . ': </td><td><textarea cols="60" rows="4" id="feedback" name="feedback">' . htmlspecialchars($projectinfo->feedback) . '</textarea><br />'; ?> </td></tr> </table> <input type="button" id="project_save" value="<?= i18n('Save Project Information') ?>" /> </form> <? } ?>