+ // {{{ 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;
+ }
+ if ($line[$fid] != '') { // if this field already contains something
+ $line[$fid] .= $asep; // then adds a separator before adding the new answer
+ }
+ $line[$fid] .= $a; // adds the current answer to the correct field
+ }
+ $cur = $res->next(); // gets next answer
+ }
+ fputcsv($csv, $line, $sep, $enc); // stores the last line into $csv_output
+ return $csv_output;
+ }
+ // }}}
+