tiki-quiz_edit.php 6 KB
Newer Older
1
<?php
changi67's avatar
changi67 committed
2
// (c) Copyright 2002-2012 by authors of the Tiki Wiki CMS Groupware Project
changi67's avatar
changi67 committed
3
// 
4 5
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
changi67's avatar
changi67 committed
6
// $Id$
ggeller's avatar
ggeller committed
7

8
/*
changi67's avatar
changi67 committed
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
(The expire date must be rigid.  That is, papers will not be accepted after the expire
date, even if the quiz was started before the expire date.  Otherwise, in cases where
we have "show answers after expire date", a student who has completed the quiz could
give the answers to another student during the grace period.  So when the student
takes the quiz, the system must issue a warning to the student about the expire date
if the date is less the the session timeout time away.)
(Quiz results for students are always stored; quiz results for teachers
(defined here as anyone with tiki_p_admin_quizzes) are never stored.)

The data field is supposed to be xml representing things like the prolog, questions and
epilog for this quiz.  At present if you put
<?questions nQuestions=10 ?>
It is supposed to use 10 questions for this quiz from the tiki_quiz_questions table.
If you leave the data field blank, the default is to use all the questions from the table.
You can also set the same option under the Generl Options section.
ggeller's avatar
ggeller committed
24
*/
changi67's avatar
changi67 committed
25 26
require_once ('tiki-setup.php');
include_once ('lib/quizzes/quizlib.php');
27 28

$access->check_feature('feature_quizzes');
29 30 31
//Use 12- or 24-hour clock for $publishDate time selector based on admin and user preferences
include_once ('lib/userprefs/userprefslib.php');
$smarty->assign('use_24hr_clock', $userprefslib->get_user_clock_pref($user));
32

33
// quizId of 0 is used as a placeholder; There should NEVER be a row in the
34
//   tiki_quizzes table with an id of zero.
changi67's avatar
changi67 committed
35
if (!isset($_REQUEST["quizId"])) {
36
	$_REQUEST["quizId"] = 0;
37
}
38 39

$tikilib->get_perm_object($_REQUEST["quizId"], 'quiz');
40 41 42

$access->check_permission('tiki_p_admin_quizzes');

ggeller's avatar
ggeller committed
43 44 45
$cat_type = 'quiz';
$cat_objid = $_REQUEST["quizId"];
include_once ("categorize_list.php");
changi67's avatar
changi67 committed
46 47
if (isset($_REQUEST["preview"]) || isset($_REQUEST["xmlview"]) || isset($_REQUEST["textview"])) {
	echo "line: " . __LINE__ . "<br>";
48
	echo "Sorry, preview, xmlview and textview are not supported in this version.<br>";
ggeller's avatar
ggeller committed
49 50
	die;
}
51
$quiz = $quizlib->quiz_fetch($_REQUEST["quizId"]);
52 53 54

function fetchYNOption(&$quiz, $_REQUEST, $option)
{
changi67's avatar
changi67 committed
55
	if (isset($_REQUEST[$option]) && $_REQUEST[$option] == 'on') {
ggeller's avatar
ggeller committed
56 57 58 59 60
		$quiz[$option] = 'y';
	} else {
		$quiz[$option] = 'n';
	}
}
61

changi67's avatar
changi67 committed
62
// Load the data from the
63 64
function quiz_data_load()
{
65 66
	global $_REQUEST;
	$quiz_data = array();
67
	foreach ($_REQUEST as $key => $val) {
changi67's avatar
changi67 committed
68 69
		if (preg_match("/^quiz_/", $key)) {
			$k = preg_replace("/^quiz_([.]*)/", "\$1", $key);
70
			$quiz_data[$k] = $val;
ggeller's avatar
ggeller committed
71 72
		}
	}
changi67's avatar
changi67 committed
73
	if ($quiz_data["online"] == "online") {
74
		$quiz_data["online"] = "y";
changi67's avatar
changi67 committed
75
	} else if ($quiz_data["online"] == "offline") {
76
		$quiz_data["online"] = "n";
ggeller's avatar
ggeller committed
77
	}
78 79 80 81 82 83 84 85
	//Convert 12-hour clock hours to 24-hour scale to compute time
	if (!empty($_REQUEST['publish_Meridian'])) {
		$_REQUEST['publish_Hour'] = date('H', strtotime($_REQUEST['publish_Hour'] . ':00 ' . $_REQUEST['publish_Meridian']));
	}
	if (!empty($_REQUEST['expire_Meridian'])) {
		$_REQUEST['expire_Hour'] = date('H', strtotime($_REQUEST['expire_Hour'] . ':00 ' . $_REQUEST['expire_Meridian']));
	}
	
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
	$quiz_data["datePub"] = TikiLib::make_time(
					$quiz_data["publish_Hour"],
					$quiz_data["publish_Minute"],
					0,
					$quiz_data["publish_Month"],
					$quiz_data["publish_Day"],
					$quiz_data["publish_Year"]
	);
	$quiz_data["dateExp"] = TikiLib::make_time(
					$quiz_data["expire_Hour"],
					$quiz_data["expire_Minute"],
					0,
					$quiz_data["expire_Month"],
					$quiz_data["expire_Day"],
					$quiz_data["expire_Year"]
	);
102 103 104 105 106 107 108 109 110 111 112
	$fields = array('nQuestion'
								, 'shuffleAnswers'
								, 'shuffleQuestions'
								, 'multiSession'
								, 'additionalQuestions'
								, 'limitDisplay'
								, 'timeLimited'
								, 'canRepeat'
								, 'additionalQuestions'
								, 'forum'
								);
113
	foreach ($fields as $field) {
114
		fetchYNOption($quiz_data, $quiz_data, $field);
changi67's avatar
changi67 committed
115 116 117
		
	}
	return $quiz_data;
118
}
119

120 121 122 123 124 125 126
if (isset($_REQUEST["save"])) {
	check_ticket('edit-quiz-question');
	$quiz_data = quiz_data_load();
	$quizNew = new Quiz;
	$quizNew->data_load($quiz_data);
	// if the id is 0, use just save the new data
	// otherwise we compare the data to what was there before.
changi67's avatar
changi67 committed
127
	if ($quiz->id == 0 || ($quizNew != $quiz)) {
128 129
		$quizlib->quiz_store($quizNew);
		// tell user changes were stored (new quiz stored with id of x or quiz x modified), return to list of admin quizzes
changi67's avatar
changi67 committed
130
		
131
	} 
changi67's avatar
changi67 committed
132 133
	die;
	echo "line: " . __LINE__ . "<br>";
134 135
	echo "Sorry, this is only a prototype at present.<br>";
	// Fixme, this doesn't work for a brand-new quiz because the quizId is zero!
changi67's avatar
changi67 committed
136
	if ($cat_objid != 0) {
137 138 139 140 141
		$cat_href = "tiki-quiz.php?quizId=" . $cat_objid;
		$cat_name = $_REQUEST["name"];
		$cat_desc = substr($_REQUEST["description"], 0, 200);
		include_once ("categorize.php");
	}
ggeller's avatar
ggeller committed
142
	die;
143
}
144

ggeller's avatar
ggeller committed
145
$smarty->assign('quiz', $quiz);
146 147 148

function setup_options(&$tpl)
{
149 150
	global $tikilib;
	global $user;
changi67's avatar
changi67 committed
151
	$tpl['online_choices'] = array('online' => 'Online', 'offline' => 'Offline');
152 153 154 155
	$optionsGrading = array();
	$optionsGrading[] = "machine";
	$optionsGrading[] = "peer review";
	$optionsGrading[] = "teacher";
ggeller's avatar
ggeller committed
156
	$tpl['optionsGrading'] = $optionsGrading;
157 158 159 160
	$optionsShowScore = array();
	$optionsShowScore[] = "immediately";
	$optionsShowScore[] = "after expire date";
	$optionsShowScore[] = "never";
ggeller's avatar
ggeller committed
161
	$tpl['optionsShowScore'] = $optionsShowScore;
162
	// FIXME - This needs to be limited to the session timeout in php.ini
163
	$mins = array();
164
	for ($i = 1; $i <= 20; $i++) {
165 166
		$mins[] = $i;
	}
167
	$tpl['mins'] = $mins;
168 169
	$repetitions = array();
	$qpp = array();
changi67's avatar
changi67 committed
170
	for ($i = 1; $i <= 10; $i++) {
171 172 173 174
		$qpp[] = $i;
		$repetitions[] = $i;
	}
	$repetitions[] = "unlimited";
175 176
	$qpp[] = "unlimited";
	$tpl['repetitions'] = $repetitions;
ggeller's avatar
ggeller committed
177
	$tpl['qpp'] = $qpp;
178
	$tpl['siteTimeZone'] = $prefs['display_timezone'];
179
}
180

ggeller's avatar
ggeller committed
181
$tpl = array();
182
setup_options($tpl);
ggeller's avatar
ggeller committed
183
$smarty->assign('tpl', $tpl);
184
ask_ticket('edit-quiz-question');
185

186
$smarty->assign('mid', 'tiki-quiz_edit.tpl');
187
$smarty->display("tiki.tpl");