- return null;
- }
- } else { // else returns the root converted to array in any case
- $a = array('title' => $this->title,
- 'description' => $this->description,
- 'end' => $this->end,
- 'mode' => $this->mode,
- 'promos' => $this->promos,
- 'valid' => $this->valid,
- 'type' => 'root');
- if ($this->id != -1) {
- $a['id'] = $this->id;
- }
- if ($this->isEnded()) { // if the survey is ended, then adds here the number of votes
- $sql = 'SELECT COUNT(id)
- FROM survey_votes
- WHERE survey_id={?};';
- $tot = XDB::query($sql, $this->id);
- $a['votes'] = $tot->fetchOneCell();
- }
- if ($i == 'all' && count($this->questions) > 0) { // if the whole survey is requested, then returns all the questions converted to array
- $qArr = array();
- for ($k = 0; $k < count($this->questions); $k++) {
- $q = $this->questions[$k]->toArray();
- $q['id'] = $k;
- if ($this->isEnded()) { // if the survey is ended, then adds here the results of this question
- $q['result'] = $this->questions[$k]->getResultArray($this->id, $k);
- }
- $qArr[$k] = $q;
- }
- $a['questions'] = $qArr;
- }
- return $a;
- }
- }
- // }}}
-
- // {{{ function toCSV() : builds a CSV file containing all the results of the survey
- public function toCSV($sep = ',', $enc = '"', $asep='|')
- {
- $nbq = count($this->questions);
- //require_once dirname(__FILE__) . '/../../classes/varstream.php';
- VarStream::init();
- global $csv_output;
- $csv_output = '';
- $csv = fopen('var://csv_output', 'w');
- $line = ($this->isMode(self::MODE_XIDENT))? array('id', 'Nom', 'Prenom', 'Promo') : array('id');
- $qids = array();
- for ($qid = 0; $qid < $nbq; $qid++) {
- $qids[$qid] = count($line); // stores the first id of a question (in case of questions with subquestions)
- array_splice($line, count($line), 0, $this->questions[$qid]->getCSVColumns()); // the first line contains the questions
- }
- $nbf = count($line);
- $users = array();
- if ($this->isMode(self::MODE_XIDENT)) { // if the mode is non anonymous
- $sql = 'SELECT v.id AS vid, a.nom, a.prenom, a.promo
- FROM survey_votes AS v
- INNER JOIN auth_user_md5 AS a
- ON a.user_id=v.user_id
- WHERE v.survey_id={?}
- ORDER BY vid ASC;';
- $res = XDB::iterator($sql, $this->id); // retrieves all users data
- for ($u = $res->next(); $u != null; $u = $res->next()) {
- $users[$u['vid']] = array('nom' => $u['nom'], 'prenom' => $u['prenom'], 'promo' => $u['promo']);
- }
- }
- $sql = 'SELECT v.id AS vid, a.question_id AS qid, a.answer AS answer
- FROM survey_votes AS v
- LEFT JOIN survey_answers AS a
- ON a.vote_id=v.id
- WHERE v.survey_id={?}
- ORDER BY vid ASC, qid ASC, answer ASC;';
- $res = XDB::iterator($sql, $this->id); // retrieves all answers from database
- $cur = $res->next();
- $vid = -1;
- $vid_ = 0;
- while ($cur != null) {
- if ($vid != $cur['vid']) { // if the vote id changes, then starts a new line
- fputcsv($csv, $line, $sep, $enc); // stores the former line into $csv_output
- $vid = $cur['vid'];
- $line = array_fill(0, $nbf, ''); // creates an array full of empty string
- $line[0] = $vid_; // the first field is a 'clean' vote id (not the one stored in database)
- if ($this->isMode(self::MODE_XIDENT)) { // if the mode is non anonymous
- if (array_key_exists($vid, $users) && is_array($users[$vid])) { // and if the user data can be found
- $line[1] = $users[$vid]['nom']; // adds the user data (in the first fields of the line)
- $line[2] = $users[$vid]['prenom'];
- $line[3] = $users[$vid]['promo'];
- }
- }
- $vid_++;
- }
- $ans = $this->questions[$cur['qid']]->formatAnswer($cur['answer']); // formats the current answer
- if (!is_null($ans)) {
- if (is_array($ans)) {
- $fid = $qids[$cur['qid']] + $ans['id']; // computes the field id
- $a = $ans['answer'];
- } else {
- $fid = $qids[$cur['qid']];
- $a = $ans;