tiki-quiz_edit.php 6.07 KB
Newer Older
1
<?php
changi67's avatar
changi67 committed
2
// (c) Copyright 2002-2012 by authors of the Tiki Wiki CMS Groupware Project
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 55 56 57
/**
 * @param $quiz
 * @param $_REQUEST
 * @param $option
 */
58 59
function fetchYNOption(&$quiz, $_REQUEST, $option)
{
changi67's avatar
changi67 committed
60
	if (isset($_REQUEST[$option]) && $_REQUEST[$option] == 'on') {
ggeller's avatar
ggeller committed
61 62 63 64 65
		$quiz[$option] = 'y';
	} else {
		$quiz[$option] = 'n';
	}
}
66

changi67's avatar
changi67 committed
67
// Load the data from the
68 69 70
/**
 * @return array
 */
71 72
function quiz_data_load()
{
73 74
	global $_REQUEST;
	$quiz_data = array();
75
	foreach ($_REQUEST as $key => $val) {
changi67's avatar
changi67 committed
76 77
		if (preg_match("/^quiz_/", $key)) {
			$k = preg_replace("/^quiz_([.]*)/", "\$1", $key);
78
			$quiz_data[$k] = $val;
ggeller's avatar
ggeller committed
79 80
		}
	}
changi67's avatar
changi67 committed
81
	if ($quiz_data["online"] == "online") {
82
		$quiz_data["online"] = "y";
changi67's avatar
changi67 committed
83
	} else if ($quiz_data["online"] == "offline") {
84
		$quiz_data["online"] = "n";
ggeller's avatar
ggeller committed
85
	}
86 87 88 89 90 91 92
	//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']));
	}
93

94
	$quiz_data["datePub"] = TikiLib::make_time(
95 96 97 98 99 100
		$quiz_data["publish_Hour"],
		$quiz_data["publish_Minute"],
		0,
		$quiz_data["publish_Month"],
		$quiz_data["publish_Day"],
		$quiz_data["publish_Year"]
101 102
	);
	$quiz_data["dateExp"] = TikiLib::make_time(
103 104 105 106 107 108
		$quiz_data["expire_Hour"],
		$quiz_data["expire_Minute"],
		0,
		$quiz_data["expire_Month"],
		$quiz_data["expire_Day"],
		$quiz_data["expire_Year"]
109
	);
110 111 112 113 114 115 116 117 118 119 120
	$fields = array('nQuestion'
								, 'shuffleAnswers'
								, 'shuffleQuestions'
								, 'multiSession'
								, 'additionalQuestions'
								, 'limitDisplay'
								, 'timeLimited'
								, 'canRepeat'
								, 'additionalQuestions'
								, 'forum'
								);
121
	foreach ($fields as $field) {
122
		fetchYNOption($quiz_data, $quiz_data, $field);
123

changi67's avatar
changi67 committed
124 125
	}
	return $quiz_data;
126
}
127

128 129 130 131 132 133 134
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
135
	if ($quiz->id == 0 || ($quizNew != $quiz)) {
136 137
		$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
138 139

	}
changi67's avatar
changi67 committed
140 141
	die;
	echo "line: " . __LINE__ . "<br>";
142 143
	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
144
	if ($cat_objid != 0) {
145 146 147 148 149
		$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
150
	die;
151
}
152

ggeller's avatar
ggeller committed
153
$smarty->assign('quiz', $quiz);
154

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

ggeller's avatar
ggeller committed
192
$tpl = array();
193
setup_options($tpl);
ggeller's avatar
ggeller committed
194
$smarty->assign('tpl', $tpl);
195
ask_ticket('edit-quiz-question');
196

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