2 /***************************************************************************
3 * Copyright (C) 2003-2011 Polytechnique.org *
4 * http://opensource.polytechnique.org/ *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the Free Software *
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
20 ***************************************************************************/
22 interface SurveyQuestionContainer
24 public function addQuestion(SurveyQuestion
$question, $pos = null
);
25 public function newQuestion($type, $pos = null
);
26 public function reassignQuestionIds();
29 class SurveyQuestion
extends PlDBTableEntry
32 protected $parentQuestion;
34 public function __construct(Survey
$survey)
36 parent
::__construct('survey_questions');
37 $this->registerFieldFormatter('parameters', 'JSonFieldFormatter');
38 $this->survey
= $survey;
41 public function typedInstance()
43 $instance = self
::instanceForType($this->survey
, $this->type
);
44 $instance->copy($this);
48 public static function instanceForType(Survey
$survey, $type)
50 $file = dirname(__FILE__
) . '/' . $type . '.inc.php';
51 if (!file_exists($file)) {
52 throw new Exception("Unknown question type \"$type\"");
55 $class = 'SurveyQuestion' . $type;
56 return new $class($survey);
59 public function voteTemplate()
61 return 'survey/question.' . $this->type
. '.tpl';
64 public function editTemplate()
66 return 'survey/edit.' . $this->type
. '.tpl';
69 protected function buildAnswer(SurveyAnswer
$answer, PlDict
$answers)
71 Platal
::assert(false
, "This should not happen");
74 public function vote(SurveyVote
$vote, PlDict
$answers)
76 if ($this->flags
->hasFlag('noanswer')) {
77 if ($answers->has($this->qid
)) {
78 throw new Exception("Des réponses ont été données à une question n'en attendant pas");
82 $answer = $vote->getAnswer($this);
83 if (is_null($answer)) {
86 if (!$this->buildAnswer($answer, $answers)) {
89 if ($this->flags
->hasFlag('mandatory') && is_null($answer->answer
)) {
90 $answer->inError
= 'Tu dois répondre à cette question';
95 public function export()
97 $export = parent
::export();
98 if (isset($export['parameters'])) {
99 foreach ($export['parameters'] as $key=>$value) {
100 $export[$key] = $value;
102 unset($export['parameters']);
109 class SurveyQuestionGroup
extends SurveyQuestion
implements SurveyQuestionContainer
111 public $children = array();
113 public function __construct(Survey
$survey)
115 parent
::__construct($survey);
118 public function addQuestion(SurveyQuestion
$question, $pos = null
)
120 $question->parentQuestion
= $this;
122 $this->children
[] = $question;
124 array_splice($this->children
, $pos, 0, $question);
128 public function newQuestion($type, $pos = null
)
130 $question = SurveyQuestion
::instanceForType($this->survey
, $type);
131 $this->addQuestion($question, $pos);
135 public function reassignQuestionIds()
137 $id = $this->qid +
1;
138 foreach ($this->children
as $question) {
139 $question->qid
= $id;
140 if ($question instanceof SurveyQuestionContainer
) {
141 $id = $question->reassignQuestionIds();
149 protected function postSave()
151 foreach ($this->children
as $question) {
152 $question->sid
= $this->sid
;
153 $question->parent
= $this->qid
;
158 public function export()
160 $export = parent
::export();
161 $export['children'] = array();
162 foreach ($this->children
as $child) {
163 $export['children'][] = $child->export();
168 public function vote(SurveyVote
$vote, PlDict
$answers)
170 $a = parent
::vote($vote, $answers);
171 foreach ($this->children
as $child) {
172 $child->vote($vote, $answers);
177 public function child($qid)
180 foreach ($this->children
as $question) {
181 if ($qid == $question->qid
) {
183 } else if ($qid < $question->qid
) {
184 Platal
::assert($prev instanceof SurveyQuestionGroup
);
185 return $prev->child($qid);
189 Platal
::assert($prev instanceof SurveyQuestionGroup
);
190 return $prev->child($qid);
194 // vim:set et sw=4 sts=4 ts=4 foldmethod=marker enc=utf-8: