Backport
[platal.git] / modules / survey / survey.inc.php
index f1f8fe5..02ccef6 100644 (file)
@@ -37,12 +37,11 @@ class Survey
         return ($long)? self::$longModes : self::$shortModes;
     }
 
-    private static $types = array('text'     => 'texte court',
-                                  'textarea' => 'texte long',
-                                  'num'      => 'numérique',
-                                  'radio'    => 'radio',
-                                  'checkbox' => 'checkbox',
-                                  'personal' => 'informations personnelles');
+    private static $types = array('text'     => 'Texte court',
+                                  'textarea' => 'Texte long',
+                                  'num'      => 'Numérique',
+                                  'radio'    => 'Choix multiples (une rĂ©ponse)',
+                                  'checkbox' => 'Choix multiples (plusieurs rĂ©ponses)');
 
     public static function getTypes()
     {
@@ -77,13 +76,9 @@ class Survey
     {
         $this->title       = $args['title'];
         $this->description = $args['description'];
-        if (preg_match('#^\d{2}/\d{2}/\d{4}$#', $args['end'])) {
-            $this->end = preg_replace('#^(\d{2})/(\d{2})/(\d{4})$#', '\3-\2-\1', $args['end']);
-        } else {
-            $this->end = (preg_match('#^\d{4}-\d{2}-\d{2}$#', $args['end']))? $args['end'] : '#';
-        }
-        $this->mode    = $args['mode'];
-        if ($args['mode'] == 0) {
+        $this->end         = $args['end'];
+        $this->mode    = (isset($args['mode']))? $args['mode'] : self::MODE_ALL;
+        if ($this->mode == self::MODE_ALL) {
             $args['promos'] = '';
         }
         $this->promos  = ($args['promos'] == '' || preg_match('#^(\d{4}-?|(\d{4})?-\d{4})(,(\d{4}-?|(\d{4})?-\d{4}))*$#', $args['promos']))? $args['promos'] : '#';
@@ -101,7 +96,7 @@ class Survey
         if ($this->promos == '') {
             return true;
         }
-        $promos = explode('|', $this->promos);
+        $promos = explode(',', $this->promos);
         foreach ($promos as $p) {
             if ((preg_match('#^\d{4}$#', $p) && $p == $promo) ||
                 (preg_match('#^\d{4}-$#', $p) && intval(substr($p, 0, 4)) <= $promo) ||
@@ -266,6 +261,7 @@ class Survey
     // {{{ questions manipulation functions
     public function addQuestion($i, $c)
     {
+        $i = intval($i);
         if ($this->valid || $i > count($this->questions)) {
             return false;
         } else {
@@ -276,6 +272,7 @@ class Survey
 
     public function delQuestion($i)
     {
+        $i = intval($i);
         if ($this->valid || !array_key_exists($i, $this->questions)) {
             return false;
         } else {
@@ -302,7 +299,6 @@ class Survey
 
     // {{{ function checkSyntax() : checks syntax of the questions (currently the root only) before storing the survey in database
     private static $errorMessages = array(
-        "dateformat"  => "la date de fin de sondage est mal formatt&#233;e : elle doit respecter la syntaxe dd/mm/aaaa",
         "datepassed"  => "la date de fin de sondage est d&#233;j&#224; d&#233;pass&#233;e : vous devez pr&#233;ciser une date future",
         "promoformat" => "les restrictions &#224; certaines promotions sont mal formatt&#233;es"
     );
@@ -310,14 +306,10 @@ class Survey
     public function checkSyntax()
     {
         $rArr = array();
-        if (!preg_match('#^\d{4}-\d{2}-\d{2}$#', $this->end)) {
-            $rArr[] = array('question' => 'root', 'error' => self::$errorMessages["dateformat"]);
-        } else {
-            // checks that the end date given is not already passed
-            // (unless the survey has already been validated : an admin can have a validated survey expired)
-            if (!$this->valid && $this->isEnded()) {
-                $rArr[] = array('question' => 'root', 'error' => self::$errorMessages["datepassed"]);
-            }
+        // checks that the end date given is not already passed
+        // (unless the survey has already been validated : an admin can have a validated survey expired)
+        if (!$this->valid && $this->isEnded()) {
+            $rArr[] = array('question' => 'root', 'error' => self::$errorMessages["datepassed"]);
         }
         if ($this->promos != '' && !preg_match('#^(\d{4}-?|(\d{4})?-\d{4})(,(\d{4}-?|(\d{4})?-\d{4}))*$#', $this->promos)) {
             $rArr[] = array('question' => 'root', 'error' => self::$errorMessages["promoformat"]);
@@ -331,17 +323,13 @@ class Survey
     public static function retrieveList($type, $tpl = true)
     {
         switch ($type) {
-        case 'w':
-        case 'waiting' :
-            $where = 'valid=0';
-            break;
         case 'c':
         case 'current':
-            $where = 'valid=1 AND end > NOW()';
+            $where = 'end > NOW()';
             break;
         case 'o':
         case 'old':
-            $where = 'valid=1 AND end <= NOW()';
+            $where = 'end <= NOW()';
             break;
         default:
             return null;
@@ -360,7 +348,7 @@ class Survey
     // {{{ static function retrieveSurvey() : gets a survey in database (and unserialize the survey object structure)
     public static function retrieveSurvey($sid)
     {
-        $sql = 'SELECT questions, title, description, end, mode, promos, valid
+        $sql = 'SELECT questions, title, description, end, mode, promos
                   FROM survey_surveys
                  WHERE id={?}';
         $res = XDB::query($sql, $sid);
@@ -368,7 +356,7 @@ class Survey
         if (is_null($data) || !is_array($data)) {
             return null;
         }
-        $survey = new Survey($data, $sid, (boolean) $data['valid'], unserialize($data['questions']));
+        $survey = new Survey($data, $sid, true, unserialize($data['questions']));
         return $survey;
     }
     // }}}
@@ -376,7 +364,7 @@ class Survey
     // {{{ static function retrieveSurveyInfo() : gets information about a survey (title, description, end date, restrictions) but does not unserialize the survey object structure
     public static function retrieveSurveyInfo($sid)
     {
-        $sql = 'SELECT title, description, end, mode, promos, valid
+        $sql = 'SELECT title, description, end, mode, promos
                   FROM survey_surveys
                  WHERE id={?}';
         $res = XDB::query($sql, $sid);
@@ -384,47 +372,54 @@ class Survey
     }
     // }}}
 
+    // {{{ static function retrieveSurveyReq() : gets a survey request to validate
+    public static function retrieveSurveyReq($id)
+    {
+        require_once 'validations.inc.php';
+        $surveyreq = Validate::get_request_by_id($id);
+        if ($surveyreq == null) {
+            return null;
+        }
+        $data = array('title'       => $surveyreq->title,
+                      'description' => $surveyreq->description,
+                      'end'         => $surveyreq->end,
+                      'mode'        => $surveyreq->mode,
+                      'promos'      => $surveyreq->promos);
+        $survey = new Survey($data, $id, false, $surveyreq->questions);
+        return $survey;
+    }
+    // }}}
+
     // {{{ function proposeSurvey() : stores a proposition of survey in database (before validation)
     public function proposeSurvey()
     {
-        $sql = 'INSERT INTO survey_surveys
-                        SET questions={?},
-                            title={?},
-                            description={?},
-                            author_id={?},
-                            end={?},
-                            mode={?},
-                            promos={?},
-                            valid=0;';
-        return XDB::execute($sql, serialize($this->questions), $this->title, $this->description, S::v('uid'), $this->end, $this->mode, $this->promos);
+        require_once 'validations.inc.php';
+        $surveyreq = new SurveyReq($this->title, $this->description, $this->end, $this->mode, $this->promos, $this->questions, S::v('uid'));
+        return $surveyreq->submit();
     }
     // }}}
 
     // {{{ function updateSurvey() : updates a survey in database (before validation)
     public function updateSurvey()
     {
-        if ($this->id == -1) {
-            return false;
+        if ($this->valid) {
+            $sql = 'UPDATE survey_surveys
+                       SET questions={?},
+                           title={?},
+                           description={?},
+                           end={?},
+                           mode={?},
+                           promos={?}
+                     WHERE id={?};';
+            return XDB::execute($sql, serialize($this->questions), $this->title, $this->description, $this->end, $this->mode, $this->promos, $this->id);
+        } else {
+            require_once 'validations.inc.php';
+            $surveyreq = Validate::get_request_by_id($this->id);
+            if ($surveyreq == null) {
+                return false;
+            }
+            return $surveyreq->updateReq($this->title, $this->description, $this->end, $this->mode, $this->promos, $this->questions);
         }
-        $sql = 'UPDATE survey_surveys
-                   SET questions={?},
-                       title={?},
-                       description={?},
-                       end={?},
-                       mode={?},
-                       promos={?}
-                 WHERE id={?};';
-        return XDB::execute($sql, serialize($this->questions), $this->title, $this->description, $this->end, $this->mode, $this->promos, $this->id);
-    }
-    // }}}
-
-    // {{{ static function validateSurvey() : validates a survey
-    public static function validateSurvey($sid)
-    {
-        $sql = 'UPDATE survey_surveys
-                   SET valid=1
-                 WHERE id={?};';
-        return XDB::execute($sql, $sid);
     }
     // }}}
 
@@ -542,7 +537,7 @@ abstract class SurveyQuestion
 }
 // }}}
 
-// {{{ abstract class SurveySimple and its derived classes : "opended" questions
+// {{{ abstract class SurveySimple and its derived classes : "open" questions
 // {{{ abstract class SurveySimple extends SurveyQuestion
 abstract class SurveySimple extends SurveyQuestion
 {
@@ -609,14 +604,18 @@ abstract class SurveyList extends SurveyQuestion
     public function update($args)
     {
         parent::update($args);
-        $this->choices = explode('|', $args['options']);
+        $this->choices = array();
+        foreach ($args['options'] as $val) {
+            if (trim($val)) {
+                $this->choices[] = $val;
+            }
+        }
     }
 
     public function toArray()
     {
         $rArr = parent::toArray();
         $rArr['choices'] = $this->choices;
-        $rArr['options'] = implode('|', $this->choices);
         return $rArr;
     }
 
@@ -684,45 +683,5 @@ class SurveyCheckbox extends SurveyList
 // }}}
 // }}}
 
-// {{{ class SurveyPersonal extends SurveyQuestion : allows easy and verified access to user's personal data (promotion, name...)
-// actually this type of question should be suppressed (non anonymous surveys are possible with survey modes)
-// and anyway it is not finished (checkAnswer implementation) : currently it does not store anything when a user votes
-class SurveyPersonal extends SurveyQuestion
-{
-    private $perm;
-
-    public function update($args)
-    {
-        $args['question'] = "Informations personnelles";
-        parent::update($args);
-        $this->perm['promo'] = isset($args['promo'])? 1 : 0;
-        $this->perm['name'] = isset($args['name'])? 1 : 0;
-    }
-
-    public function checkAnswer($ans)
-    {
-        if (intval($ans) == 1) {
-            // requete mysql qvb
-            return null;
-        } else {
-            return null;
-        }
-    }
-
-    protected function getQuestionType()
-    {
-        return "personal";
-    }
-
-    public function toArray()
-    {
-        $a = parent::toArray();
-        $a['promo'] = $this->perm['promo'];
-        $a['name']  = $this->perm['name'];
-        return $a;
-    }
-}
-// }}}
-
 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
 ?>