/** * Function responsible to process any change in email template. * @return */ function update($iSurveyId) { $clang = $this->getController()->lang; if (hasSurveyPermission($iSurveyId, 'surveylocale', 'update')) { $languagelist = Survey::model()->findByPk($iSurveyId)->additionalLanguages; $languagelist[] = Survey::model()->findByPk($iSurveyId)->language; array_filter($languagelist); foreach ($languagelist as $langname) { $attributes = array('surveyls_email_invite_subj' => $_POST['email_invite_subj_' . $langname], 'surveyls_email_invite' => $_POST['email_invite_' . $langname], 'surveyls_email_remind_subj' => $_POST['email_remind_subj_' . $langname], 'surveyls_email_remind' => $_POST['email_remind_' . $langname], 'surveyls_email_register_subj' => $_POST['email_register_subj_' . $langname], 'surveyls_email_register' => $_POST['email_register_' . $langname], 'surveyls_email_confirm_subj' => $_POST['email_confirm_subj_' . $langname], 'surveyls_email_confirm' => $_POST['email_confirm_' . $langname], 'email_admin_notification_subj' => $_POST['email_admin_notification_subj_' . $langname], 'email_admin_notification' => $_POST['email_admin_notification_' . $langname], 'email_admin_responses_subj' => $_POST['email_admin_responses_subj_' . $langname], 'email_admin_responses' => $_POST['email_admin_responses_' . $langname]); $usquery = Surveys_languagesettings::model()->updateAll($attributes, 'surveyls_survey_id = :ssid AND surveyls_language = :sl', array(':ssid' => $iSurveyId, ':sl' => $langname)); } Yii::app()->session['flashmessage'] = $clang->gT("Email templates successfully saved."); } $this->getController()->redirect($this->getController()->createUrl('admin/survey/view/surveyid/' . $iSurveyId)); }
/** * Import survey from an TSV file template that does not require or allow assigning of GID or QID values. * NOTE: This currently only supports import of one language * @global type $connect * @global type $dbprefix * @global type $clang * @global type $timeadjust * @param type $sFullFilepath * @return type * * @author TMSWhite */ function TSVImportSurvey($sFullFilepath) { $clang = Yii::app()->lang; $insertdata = array(); $results = array(); $results['error'] = false; $baselang = 'en'; // TODO set proper default $encoding = ''; $handle = fopen($sFullFilepath, 'r'); $bom = fread($handle, 2); rewind($handle); // Excel tends to save CSV as UTF-16, which PHP does not properly detect if ($bom === chr(0xff) . chr(0xfe) || $bom === chr(0xfe) . chr(0xff)) { // UTF16 Byte Order Mark present $encoding = 'UTF-16'; } else { $file_sample = fread($handle, 1000) + 'e'; //read first 1000 bytes // + e is a workaround for mb_string bug rewind($handle); $encoding = mb_detect_encoding($file_sample, 'UTF-8, UTF-7, ASCII, EUC-JP,SJIS, eucJP-win, SJIS-win, JIS, ISO-2022-JP'); } if ($encoding && $encoding != 'UTF-8') { stream_filter_append($handle, 'convert.iconv.' . $encoding . '/UTF-8'); } $file = stream_get_contents($handle); fclose($handle); // fix Excel non-breaking space $file = str_replace("0xC20xA0", ' ', $file); $filelines = explode("\n", $file); $row = array_shift($filelines); $headers = explode("\t", $row); $rowheaders = array(); foreach ($headers as $header) { $rowheaders[] = trim($header); } // remove BOM from the first header cell, if needed $rowheaders[0] = preg_replace("/^\\W+/", "", $rowheaders[0]); if (preg_match('/class$/', $rowheaders[0])) { $rowheaders[0] = 'class'; // second attempt to remove BOM } $adata = array(); foreach ($filelines as $rowline) { $rowarray = array(); $row = explode("\t", $rowline); for ($i = 0; $i < count($rowheaders); ++$i) { $val = isset($row[$i]) ? $row[$i] : ''; // if Excel was used, it surrounds strings with quotes and doubles internal double quotes. Fix that. if (preg_match('/^".*"$/', $val)) { $val = str_replace('""', '"', substr($val, 1, -1)); } $rowarray[$rowheaders[$i]] = $val; } $adata[] = $rowarray; } $results['defaultvalues'] = 0; $results['answers'] = 0; $results['surveys'] = 0; $results['languages'] = 0; $results['questions'] = 0; $results['subquestions'] = 0; $results['question_attributes'] = 0; $results['groups'] = 0; $results['importwarnings'] = array(); // these aren't used here, but are needed to avoid errors in post-import display $results['assessments'] = 0; $results['quota'] = 0; $results['quotamembers'] = 0; $results['quotals'] = 0; // collect information about survey and its language settings $surveyinfo = array(); $surveyls = array(); foreach ($adata as $row) { switch ($row['class']) { case 'S': if (isset($row['text']) && $row['name'] != 'datecreated') { $surveyinfo[$row['name']] = $row['text']; } break; case 'SL': if (!isset($surveyls[$row['language']])) { $surveyls[$row['language']] = array(); } if (isset($row['text'])) { $surveyls[$row['language']][$row['name']] = $row['text']; } break; } } $iOldSID = 1; if (isset($surveyinfo['sid'])) { $iOldSID = (int) $surveyinfo['sid']; } // Create the survey entry $surveyinfo['startdate'] = NULL; $surveyinfo['active'] = 'N'; // unset($surveyinfo['datecreated']); switchMSSQLIdentityInsert('surveys', true); $iNewSID = Survey::model()->insertNewSurvey($surveyinfo); //or safeDie($clang->gT("Error").": Failed to insert survey<br />"); if ($iNewSID == false) { $results['error'] = Survey::model()->getErrors(); $results['bFailed'] = true; return $results; } $surveyinfo['sid'] = $iNewSID; $results['surveys']++; switchMSSQLIdentityInsert('surveys', false); $results['newsid'] = $iNewSID; $gid = 0; $gseq = 0; // group_order $qid = 0; $qseq = 0; // question_order $qtype = 'T'; $aseq = 0; // answer sortorder // set the language for the survey $_title = 'Missing Title'; foreach ($surveyls as $_lang => $insertdata) { $insertdata['surveyls_survey_id'] = $iNewSID; $insertdata['surveyls_language'] = $_lang; if (isset($insertdata['surveyls_title'])) { $_title = $insertdata['surveyls_title']; } else { $insertdata['surveyls_title'] = $_title; } $result = Surveys_languagesettings::model()->insertNewSurvey($insertdata); // if (!$result) { $results['error'][] = $clang->gT("Error") . " : " . $clang->gT("Failed to insert survey language"); break; } $results['languages']++; } $ginfo = array(); $qinfo = array(); $sqinfo = array(); if (isset($surveyinfo['language'])) { $baselang = $surveyinfo['language']; // the base language } $rownumber = 1; foreach ($adata as $row) { $rownumber += 1; switch ($row['class']) { case 'G': // insert group $insertdata = array(); $insertdata['sid'] = $iNewSID; $gname = isset($row['name']) ? $row['name'] : 'G' . $gseq; $insertdata['group_name'] = $gname; $insertdata['grelevance'] = isset($row['relevance']) ? $row['relevance'] : ''; $insertdata['description'] = isset($row['text']) ? $row['text'] : ''; $insertdata['language'] = isset($row['language']) ? $row['language'] : $baselang; // For multi numeric survey : same title if (isset($ginfo[$gname])) { $gseq = $ginfo[$gname]['group_order']; $gid = $ginfo[$gname]['gid']; $insertdata['gid'] = $gid; $insertdata['group_order'] = $gseq; } else { $insertdata['group_order'] = $gseq; } $newgid = Groups::model()->insertRecords($insertdata); if (!$newgid) { $results['error'][] = $clang->gT("Error") . " : " . $clang->gT("Failed to insert group") . ". " . $clang->gT("Text file row number ") . $rownumber . " (" . $gname . ")"; break; } if (!isset($ginfo[$gname])) { $results['groups']++; $gid = $newgid; // save this for later $ginfo[$gname]['gid'] = $gid; $ginfo[$gname]['group_order'] = $gseq++; } $qseq = 0; // reset the question_order break; case 'Q': // insert question $insertdata = array(); $insertdata['sid'] = $iNewSID; $qtype = isset($row['type/scale']) ? $row['type/scale'] : 'T'; $qname = isset($row['name']) ? $row['name'] : 'Q' . $qseq; $insertdata['gid'] = $gid; $insertdata['type'] = $qtype; $insertdata['title'] = $qname; $insertdata['question'] = isset($row['text']) ? $row['text'] : ''; $insertdata['relevance'] = isset($row['relevance']) ? $row['relevance'] : ''; $insertdata['preg'] = isset($row['validation']) ? $row['validation'] : ''; $insertdata['help'] = isset($row['help']) ? $row['help'] : ''; $insertdata['language'] = isset($row['language']) ? $row['language'] : $baselang; $insertdata['mandatory'] = isset($row['mandatory']) ? $row['mandatory'] : ''; $insertdata['other'] = isset($row['other']) ? $row['other'] : 'N'; $insertdata['same_default'] = isset($row['same_default']) ? $row['same_default'] : 0; $insertdata['parent_qid'] = 0; // For multi numeric survey : same name, add the gid to have same name on different gid. Bad for EM. $fullqname = "G{$gid}_" . $qname; if (isset($qinfo[$fullqname])) { $qseq = $qinfo[$fullqname]['question_order']; $qid = $qinfo[$fullqname]['qid']; $insertdata['qid'] = $qid; $insertdata['question_order'] = $qseq; } else { $insertdata['question_order'] = $qseq; } // Insert question and keep the qid for multi language survey $result = Questions::model()->insertRecords($insertdata); if (!$result) { $results['error'][] = $clang->gT("Error") . " : " . $clang->gT("Could not insert question") . ". " . $clang->gT("Text file row number ") . $rownumber . " (" . $qname . ")"; break; } $newqid = $result; if (!isset($qinfo[$fullqname])) { $results['questions']++; $qid = $newqid; // save this for later $qinfo[$fullqname]['qid'] = $qid; $qinfo[$fullqname]['question_order'] = $qseq++; } $aseq = 0; //reset the answer sortorder $sqseq = 0; //reset the sub question sortorder // insert question attributes foreach ($row as $key => $val) { switch ($key) { case 'class': case 'type/scale': case 'name': case 'text': case 'validation': case 'relevance': case 'help': case 'language': case 'mandatory': case 'other': case 'same_default': case 'default': break; default: if ($key != '' && $val != '') { $insertdata = array(); $insertdata['qid'] = $qid; $insertdata['language'] = isset($row['language']) ? $row['language'] : $baselang; $insertdata['attribute'] = $key; $insertdata['value'] = $val; $result = Question_attributes::model()->insertRecords($insertdata); // if (!$result) { $results['importwarnings'][] = $clang->gT("Warning") . " : " . $clang->gT("Failed to insert question attribute") . ". " . $clang->gT("Text file row number ") . $rownumber . " ({$key})"; break; } $results['question_attributes']++; } break; } } // insert default value if (isset($row['default'])) { $insertdata = array(); $insertdata['qid'] = $qid; $insertdata['language'] = isset($row['language']) ? $row['language'] : $baselang; $insertdata['defaultvalue'] = $row['default']; $result = Defaultvalues::model()->insertRecords($insertdata); if (!$result) { $results['importwarnings'][] = $clang->gT("Warning") . " : " . $clang->gT("Failed to insert default value") . ". " . $clang->gT("Text file row number ") . $rownumber; break; } $results['defaultvalues']++; } break; case 'SQ': $sqname = isset($row['name']) ? $row['name'] : 'SQ' . $sqseq; if ($qtype == 'O' || $qtype == '|') { // these are fake rows to show naming of comment and filecount fields } elseif ($sqname == 'other' && ($qtype == '!' || $qtype == 'L')) { // only want to set default value for 'other' in these cases - not a real SQ row // TODO - this isn't working if (isset($row['default'])) { $insertdata = array(); $insertdata['qid'] = $qid; $insertdata['specialtype'] = 'other'; $insertdata['language'] = isset($row['language']) ? $row['language'] : $baselang; $insertdata['defaultvalue'] = $row['default']; $result = Defaultvalues::model()->insertRecords($insertdata); if (!$result) { $results['importwarnings'][] = $clang->gT("Warning") . " : " . $clang->gT("Failed to insert default value") . ". " . $clang->gT("Text file row number ") . $rownumber; break; } $results['defaultvalues']++; } } else { $insertdata = array(); $scale_id = isset($row['type/scale']) ? $row['type/scale'] : 0; $insertdata['sid'] = $iNewSID; $insertdata['gid'] = $gid; $insertdata['parent_qid'] = $qid; $insertdata['type'] = $qtype; $insertdata['title'] = $sqname; $insertdata['question'] = isset($row['text']) ? $row['text'] : ''; $insertdata['relevance'] = isset($row['relevance']) ? $row['relevance'] : ''; $insertdata['preg'] = isset($row['validation']) ? $row['validation'] : ''; $insertdata['help'] = isset($row['help']) ? $row['help'] : ''; $insertdata['language'] = isset($row['language']) ? $row['language'] : $baselang; $insertdata['mandatory'] = isset($row['mandatory']) ? $row['mandatory'] : ''; $insertdata['scale_id'] = $scale_id; // For multi nueric language, qid is needed, why not gid. name is not unique. $fullsqname = "G{$gid}Q{$qid}_{$sqname}"; if (isset($sqinfo[$fullsqname])) { $qseq = $sqinfo[$fullsqname]['question_order']; $sqid = $sqinfo[$fullsqname]['sqid']; $insertdata['question_order'] = $qseq; $insertdata['qid'] = $sqid; } else { $insertdata['question_order'] = $qseq; } // Insert sub question and keep the sqid for multi language survey $newsqid = Questions::model()->insertRecords($insertdata); if (!$newsqid) { $results['error'][] = $clang->gT("Error") . " : " . $clang->gT("Could not insert sub question") . ". " . $clang->gT("Text file row number ") . $rownumber . " (" . $qname . ")"; break; } if (!isset($sqinfo[$fullsqname])) { $sqinfo[$fullsqname]['question_order'] = $qseq++; $sqid = $newsqid; // save this for later $sqinfo[$fullsqname]['sqid'] = $sqid; $results['subquestions']++; } // insert default value if (isset($row['default'])) { $insertdata = array(); $insertdata['qid'] = $qid; $insertdata['sqid'] = $sqid; $insertdata['scale_id'] = $scale_id; $insertdata['language'] = isset($row['language']) ? $row['language'] : $baselang; $insertdata['defaultvalue'] = $row['default']; $result = Defaultvalues::model()->insertRecords($insertdata); if (!$result) { $results['importwarnings'][] = $clang->gT("Warning") . " : " . $clang->gT("Failed to insert default value") . ". " . $clang->gT("Text file row number ") . $rownumber; break; } $results['defaultvalues']++; } } break; case 'A': $insertdata = array(); $insertdata['qid'] = $qid; $insertdata['code'] = isset($row['name']) ? $row['name'] : 'A' . $aseq; $insertdata['answer'] = isset($row['text']) ? $row['text'] : ''; $insertdata['scale_id'] = isset($row['type/scale']) ? $row['type/scale'] : 0; $insertdata['language'] = isset($row['language']) ? $row['language'] : $baselang; $insertdata['assessment_value'] = isset($row['relevance']) ? $row['relevance'] : ''; $insertdata['sortorder'] = ++$aseq; $result = Answers::model()->insertRecords($insertdata); // or safeDie("Error: Failed to insert answer<br />"); if (!$result) { $results['error'][] = $clang->gT("Error") . " : " . $clang->gT("Could not insert answer") . ". " . $clang->gT("Text file row number ") . $rownumber; } $results['answers']++; break; } } // Delete the survey if error found if (is_array($results['error'])) { $result = Survey::model()->deleteSurvey($iNewSID); } return $results; }
/** * RPC Routine to set survey language properties. * * @access public * @param string $sSessionKey Auth credentials * @param integer $iSurveyID - ID of the survey * @param array|struct $aSurveyLocaleData - An array with the particular fieldnames as keys and their values to set on that particular survey * @param string $sLanguage - Optional - Language to update - if not give the base language of the particular survey is used * @return array Status=>OK, when save successful otherwise error text. */ public function set_language_properties($sSessionKey, $iSurveyID, $aSurveyLocaleData, $sLanguage = NULL) { Yii::app()->loadHelper("surveytranslator"); if ($this->_checkSessionKey($sSessionKey)) { $oSurvey = Survey::model()->findByPk($iSurveyID); if (is_null($oSurvey)) { return array('status' => 'Error: Invalid survey ID'); } if (is_null($sLanguage)) { $sLanguage = $oSurvey->language; } if (!array_key_exists($sLanguage, getLanguageDataRestricted())) { return array('status' => 'Error: Invalid language'); } if (hasSurveyPermission($iSurveyID, 'surveylocale', 'update')) { // Remove fields that may not be modified unset($aSurveyLocaleData['surveyls_language']); unset($aSurveyLocaleData['surveyls_survey_id']); // Remove invalid fields $aDestinationFields = array_flip(Surveys_languagesettings::model()->tableSchema->columnNames); $aSurveyLocaleData = array_intersect_key($aSurveyLocaleData, $aDestinationFields); $oSurveyLocale = Surveys_languagesettings::model()->findByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $sLanguage)); $aLangAttributes = $oSurveyLocale->getAttributes(); $aResult = array(); if (empty($aSurveyLocaleData)) { return array('status' => 'No valid Data'); } foreach ($aSurveyLocaleData as $sFieldName => $sValue) { $oSurveyLocale->{$sFieldName} = $sValue; try { // save the change to database - Every single change alone - to allow for validation to work $bSaveResult = $oSurveyLocale->save(); $aResult[$sFieldName] = $bSaveResult; //unset failed values if (!$bSaveResult) { $oSurveyLocale->{$sFieldName} = $aLangAttributes[$sFieldName]; } } catch (Exception $e) { $oSurveyLocale->{$sFieldName} = $aLangAttributes[$sFieldName]; } } return $aResult; } else { return array('status' => 'No permission'); } } else { return array('status' => 'Invalid Session key'); } }
/** * This function replaces the old insertans tags with new ones across a survey * * @param string $newsid Old SID * @param string $oldsid New SID * @param mixed $fieldnames Array array('oldfieldname'=>'newfieldname') */ function translateInsertansTags($newsid, $oldsid, $fieldnames) { uksort($fieldnames, create_function('$a,$b', 'return strlen($a) < strlen($b);')); Yii::app()->loadHelper('database'); $newsid = sanitize_int($newsid); $oldsid = sanitize_int($oldsid); # translate 'surveyls_urldescription' and 'surveyls_url' INSERTANS tags in surveyls $sql = "SELECT surveyls_survey_id, surveyls_language, surveyls_urldescription, surveyls_url from {{surveys_languagesettings}}\n WHERE surveyls_survey_id=" . $newsid . " AND (surveyls_urldescription LIKE '%{$oldsid}X%' OR surveyls_url LIKE '%{$oldsid}X%')"; $result = dbExecuteAssoc($sql) or show_error("Can't read groups table in transInsertAns "); // Checked //while ($qentry = $res->FetchRow()) foreach ($result->readAll() as $qentry) { $urldescription = $qentry['surveyls_urldescription']; $endurl = $qentry['surveyls_url']; $language = $qentry['surveyls_language']; foreach ($fieldnames as $sOldFieldname => $sNewFieldname) { $pattern = $sOldFieldname; $replacement = $sNewFieldname; $urldescription = preg_replace('/' . $pattern . '/', $replacement, $urldescription); $endurl = preg_replace('/' . $pattern . '/', $replacement, $endurl); } if (strcmp($urldescription, $qentry['surveyls_urldescription']) != 0 || strcmp($endurl, $qentry['surveyls_url']) != 0) { // Update Field $data = array('surveyls_urldescription' => $urldescription, 'surveyls_url' => $endurl); $where = array('surveyls_survey_id' => $newsid, 'surveyls_language' => $language); Surveys_languagesettings::update($data, $where); } // Enf if modified } // end while qentry # translate 'quotals_urldescrip' and 'quotals_url' INSERTANS tags in quota_languagesettings $sql = "SELECT quotals_id, quotals_urldescrip, quotals_url from {{quota_languagesettings}} qls, {{quota}} q\n WHERE sid=" . $newsid . " AND q.id=qls.quotals_quota_id AND (quotals_urldescrip LIKE '%{$oldsid}X%' OR quotals_url LIKE '%{$oldsid}X%')"; $result = dbExecuteAssoc($sql) or safeDie("Can't read quota table in transInsertAns"); // Checked foreach ($result->readAll() as $qentry) { $urldescription = $qentry['quotals_urldescrip']; $endurl = $qentry['quotals_url']; foreach ($fieldnames as $sOldFieldname => $sNewFieldname) { $pattern = $sOldFieldname; $replacement = $sNewFieldname; $urldescription = preg_replace('/' . $pattern . '/', $replacement, $urldescription); $endurl = preg_replace('/' . $pattern . '/', $replacement, $endurl); } if (strcmp($urldescription, $qentry['quotals_urldescrip']) != 0 || strcmp($endurl, $qentry['quotals_url']) != 0) { // Update Field $sqlupdate = "UPDATE {{quota_languagesettings}} SET quotals_urldescrip='" . $urldescription . "', quotals_url='" . $endurl . "' WHERE quotals_id={$qentry['quotals_id']}"; $updateres = dbExecuteAssoc($sqlupdate) or safeDie("Couldn't update INSERTANS in quota_languagesettings<br />{$sqlupdate}<br />"); //Checked } // Enf if modified } // end while qentry # translate 'description' INSERTANS tags in groups $sql = "SELECT gid, language, group_name, description from {{groups}}\n WHERE sid=" . $newsid . " AND description LIKE '%{$oldsid}X%' OR group_name LIKE '%{$oldsid}X%'"; $res = dbExecuteAssoc($sql) or show_error("Can't read groups table in transInsertAns"); // Checked //while ($qentry = $res->FetchRow()) foreach ($res->readAll() as $qentry) { $gpname = $qentry['group_name']; $description = $qentry['description']; $gid = $qentry['gid']; $language = $qentry['language']; foreach ($fieldnames as $sOldFieldname => $sNewFieldname) { $pattern = $sOldFieldname; $replacement = $sNewFieldname; $gpname = preg_replace('/' . $pattern . '/', $replacement, $gpname); $description = preg_replace('/' . $pattern . '/', $replacement, $description); } if (strcmp($description, $qentry['description']) != 0 || strcmp($gpname, $qentry['group_name']) != 0) { // Update Fields $data = array('description' => $description, 'group_name' => $gpname); $where = array('gid' => $gid, 'language' => $language); Groups::model()->update($data, $where); } // Enf if modified } // end while qentry # translate 'question' and 'help' INSERTANS tags in questions $sql = "SELECT qid, language, question, help from {{questions}}\n WHERE sid=" . $newsid . " AND (question LIKE '%{$oldsid}X%' OR help LIKE '%{$oldsid}X%')"; $result = dbExecuteAssoc($sql) or die("Can't read question table in transInsertAns "); // Checked //while ($qentry = $res->FetchRow()) $aResultData = $result->readAll(); foreach ($aResultData as $qentry) { $question = $qentry['question']; $help = $qentry['help']; $qid = $qentry['qid']; $language = $qentry['language']; foreach ($fieldnames as $sOldFieldname => $sNewFieldname) { $pattern = $sOldFieldname; $replacement = $sNewFieldname; $question = preg_replace('/' . $pattern . '/', $replacement, $question); $help = preg_replace('/' . $pattern . '/', $replacement, $help); } if (strcmp($question, $qentry['question']) != 0 || strcmp($help, $qentry['help']) != 0) { // Update Field $data = array('question' => $question, 'help' => $help); $where = array('qid' => $qid, 'language' => $language); Questions::model()->updateByPk($where, $data); } // Enf if modified } // end while qentry # translate 'answer' INSERTANS tags in answers $result = Answers::model()->oldNewInsertansTags($newsid, $oldsid); //while ($qentry = $res->FetchRow()) foreach ($result as $qentry) { $answer = $qentry['answer']; $code = $qentry['code']; $qid = $qentry['qid']; $language = $qentry['language']; foreach ($fieldnames as $sOldFieldname => $sNewFieldname) { $pattern = $sOldFieldname; $replacement = $sNewFieldname; $answer = preg_replace('/' . $pattern . '/', $replacement, $answer); } if (strcmp($answer, $qentry['answer']) != 0) { // Update Field $data = array('answer' => $answer, 'qid' => $qid); $where = array('code' => $code, 'language' => $language); Answers::model()->update($data, $where); } // Enf if modified } // end while qentry }
/** * Deletes a survey and all its data * * @access public * @param int $iSurveyID * @param bool @recursive * @return void */ public function deleteSurvey($iSurveyID, $recursive = true) { Survey::model()->deleteByPk($iSurveyID); if ($recursive == true) { if (tableExists("{{survey_" . intval($iSurveyID) . "}}")) { Yii::app()->db->createCommand()->dropTable("{{survey_" . intval($iSurveyID) . "}}"); } if (tableExists("{{survey_" . intval($iSurveyID) . "_timings}}")) { Yii::app()->db->createCommand()->dropTable("{{survey_" . intval($iSurveyID) . "_timings}}"); } if (tableExists("{{tokens_" . intval($iSurveyID) . "}}")) { Yii::app()->db->createCommand()->dropTable("{{tokens_" . intval($iSurveyID) . "}}"); } $oResult = Questions::model()->findAllByAttributes(array('sid' => $iSurveyID)); foreach ($oResult as $aRow) { Answers::model()->deleteAllByAttributes(array('qid' => $aRow['qid'])); Conditions::model()->deleteAllByAttributes(array('qid' => $aRow['qid'])); Question_attributes::model()->deleteAllByAttributes(array('qid' => $aRow['qid'])); Defaultvalues::model()->deleteAllByAttributes(array('qid' => $aRow['qid'])); } Questions::model()->deleteAllByAttributes(array('sid' => $iSurveyID)); Assessment::model()->deleteAllByAttributes(array('sid' => $iSurveyID)); Groups::model()->deleteAllByAttributes(array('sid' => $iSurveyID)); Surveys_languagesettings::model()->deleteAllByAttributes(array('surveyls_survey_id' => $iSurveyID)); Survey_permissions::model()->deleteAllByAttributes(array('sid' => $iSurveyID)); Saved_control::model()->deleteAllByAttributes(array('sid' => $iSurveyID)); Survey_url_parameters::model()->deleteAllByAttributes(array('sid' => $iSurveyID)); Quota::model()->deleteQuota(array('sid' => $iSurveyID), true); } }
/** * Saves the new survey after the creation screen is submitted * * @param $iSurveyID The survey id to be used for the new survey. If already taken a new random one will be used. */ function insert($iSurveyID = null) { if (Yii::app()->session['USER_RIGHT_CREATE_SURVEY']) { // Check if survey title was set if (!$_POST['surveyls_title']) { Yii::app()->session['flashmessage'] = $clang->gT("Survey could not be created because it did not have a title"); redirect($this->getController()->createUrl('admin')); return; } // Check if template may be used $sTemplate = $_POST['template']; if (!$sTemplate || Yii::app()->session['USER_RIGHT_SUPERADMIN'] != 1 && Yii::app()->session['USER_RIGHT_MANAGE_TEMPLATE'] != 1 && !hasTemplateManageRights(Yii::app()->session['loginID'], $_POST['template'])) { $sTemplate = "default"; } Yii::app()->loadHelper("surveytranslator"); // If start date supplied convert it to the right format $aDateFormatData = getDateFormatData(Yii::app()->session['dateformat']); $sStartDate = $_POST['startdate']; if (trim($sStartDate) != '') { Yii::import('application.libraries.Date_Time_Converter'); $converter = new Date_Time_Converter($sStartDate, $aDateFormatData['phpdate'] . ' H:i:s'); $sStartDate = $converter->convert("Y-m-d H:i:s"); } // If expiry date supplied convert it to the right format $sExpiryDate = $_POST['expires']; if (trim($sExpiryDate) != '') { Yii::import('application.libraries.Date_Time_Converter'); $converter = new Date_Time_Converter($sExpiryDate, $aDateFormatData['phpdate'] . ' H:i:s'); $sExpiryDate = $converter->convert("Y-m-d H:i:s"); } // Insert base settings into surveys table $aInsertData = array('expires' => $sExpiryDate, 'startdate' => $sStartDate, 'template' => $sTemplate, 'owner_id' => Yii::app()->session['loginID'], 'admin' => $_POST['admin'], 'active' => 'N', 'adminemail' => $_POST['adminemail'], 'bounce_email' => $_POST['bounce_email'], 'anonymized' => $_POST['anonymized'], 'faxto' => $_POST['faxto'], 'format' => $_POST['format'], 'savetimings' => $_POST['savetimings'], 'language' => $_POST['language'], 'datestamp' => $_POST['datestamp'], 'ipaddr' => $_POST['ipaddr'], 'refurl' => $_POST['refurl'], 'usecookie' => $_POST['usecookie'], 'emailnotificationto' => $_POST['emailnotificationto'], 'allowregister' => $_POST['allowregister'], 'allowsave' => $_POST['allowsave'], 'navigationdelay' => $_POST['navigationdelay'], 'autoredirect' => $_POST['autoredirect'], 'showxquestions' => $_POST['showxquestions'], 'showgroupinfo' => $_POST['showgroupinfo'], 'showqnumcode' => $_POST['showqnumcode'], 'shownoanswer' => $_POST['shownoanswer'], 'showwelcome' => $_POST['showwelcome'], 'allowprev' => $_POST['allowprev'], 'allowjumps' => $_POST['allowjumps'], 'nokeyboard' => $_POST['nokeyboard'], 'showprogress' => $_POST['showprogress'], 'printanswers' => $_POST['printanswers'], 'listpublic' => $_POST['public'], 'htmlemail' => $_POST['htmlemail'], 'sendconfirmation' => $_POST['sendconfirmation'], 'tokenanswerspersistence' => $_POST['tokenanswerspersistence'], 'alloweditaftercompletion' => $_POST['alloweditaftercompletion'], 'usecaptcha' => $_POST['usecaptcha'], 'publicstatistics' => $_POST['publicstatistics'], 'publicgraphs' => $_POST['publicgraphs'], 'assessments' => $_POST['assessments'], 'emailresponseto' => $_POST['emailresponseto'], 'tokenlength' => $_POST['tokenlength']); if (!is_null($iSurveyID)) { $aInsertData['wishSID'] = $iSurveyID; } $iNewSurveyid = Survey::model()->insertNewSurvey($aInsertData); if (!$iNewSurveyid) { die('Survey could not be created.'); } // Prepare locale data for surveys_language_settings table $sTitle = $_POST['surveyls_title']; $sDescription = $_POST['description']; $sWelcome = $_POST['welcome']; $sURLDescription = $_POST['urldescrip']; if (Yii::app()->getConfig('filterxsshtml')) { //$p = new CHtmlPurifier(); //$p->options = array('URI.AllowedSchemes'=>array('http' => true, 'https' => true)); //$sTitle=$p->purify($sTitle); //$sDescription=$p->purify($sDescription); //$sWelcome=$p->purify($sWelcome); //$sURLDescription=$p->purify($sURLDescription); } $sTitle = html_entity_decode($sTitle, ENT_QUOTES, "UTF-8"); $sDescription = html_entity_decode($sDescription, ENT_QUOTES, "UTF-8"); $sWelcome = html_entity_decode($sWelcome, ENT_QUOTES, "UTF-8"); $sURLDescription = html_entity_decode($sURLDescription, ENT_QUOTES, "UTF-8"); // Fix bug with FCKEditor saving strange BR types $sTitle = fixCKeditorText($sTitle); $sDescription = fixCKeditorText($sDescription); $sWelcome = fixCKeditorText($sWelcome); // Insert base language into surveys_language_settings table $aInsertData = array('surveyls_survey_id' => $iNewSurveyid, 'surveyls_title' => $sTitle, 'surveyls_description' => $sDescription, 'surveyls_welcometext' => $sWelcome, 'surveyls_language' => $_POST['language'], 'surveyls_urldescription' => $_POST['urldescrip'], 'surveyls_endtext' => $_POST['endtext'], 'surveyls_url' => $_POST['url'], 'surveyls_dateformat' => (int) $_POST['dateformat'], 'surveyls_numberformat' => (int) $_POST['numberformat']); $langsettings = new Surveys_languagesettings(); $langsettings->insertNewSurvey($aInsertData); Yii::app()->session['flashmessage'] = $this->getController()->lang->gT("Survey was successfully added."); // Update survey permissions Survey_permissions::model()->giveAllSurveyPermissions(Yii::app()->session['loginID'], $iNewSurveyid); $this->getController()->redirect($this->getController()->createUrl('admin/survey/sa/view/surveyid/' . $iNewSurveyid)); } }
/** * Get the date format for a specified survey * * @param $surveyid integer Survey id * @param $languagecode string Survey language code (optional) * @returns integer * */ function getDateFormatForSID($surveyid, $languagecode = '') { if (!isset($languagecode) || $languagecode == '') { $languagecode = Survey::model()->findByPk($surveyid)->language; } $data = Surveys_languagesettings::model()->getDateFormat($surveyid, $languagecode); if (empty($data)) { $dateformat = 0; } else { $dateformat = (int) $data; } return (int) $dateformat; }
function upgradeSurveys156() { global $modifyoutput; $sSurveyQuery = "SELECT * FROM {{surveys_languagesettings}}"; $oSurveyResult = Yii::app()->db->createCommand($sSurveyQuery)->queryAll(); foreach ($oSurveyResult as $aSurveyRow) { Yii::app()->loadLibrary('Limesurvey_lang', array("langcode" => $aSurveyRow['surveyls_language'])); $oLanguage = Yii::app()->lang; $aDefaultTexts = templateDefaultTexts($oLanguage, 'unescaped'); unset($oLanguage); if (trim(strip_tags($aSurveyRow['surveyls_email_confirm'])) == '') { $sSurveyUpdateQuery = "update {{surveys}} set sendconfirmation='N' where sid=" . $aSurveyRow['surveyls_survey_id']; Yii::app()->db->createCommand($sSurveyUpdateQuery)->execute(); $aValues = array('surveyls_email_confirm_subj' => $aDefaultTexts['confirmation_subject'], 'surveyls_email_confirm' => $aDefaultTexts['confirmation']); Surveys_languagesettings::model()->updateAll($aValues, 'surveyls_survey_id=:sid', array(':sid' => $aSurveyRow['surveyls_survey_id'])); } } }
/** * updatetokenattributedescriptions action */ function updatetokenattributedescriptions($iSurveyId) { // CHECK TO SEE IF A TOKEN TABLE EXISTS FOR THIS SURVEY $bTokenExists = tableExists('{{tokens_' . $iSurveyId . '}}'); if (!$bTokenExists) { self::_newtokentable($iSurveyId); } $clang = $this->getController()->lang; $iSurveyId = sanitize_int($iSurveyId); if (!hasSurveyPermission($iSurveyId, 'tokens', 'update')) { die; } // find out the existing token attribute fieldnames $tokenattributefieldnames = getAttributeFieldNames($iSurveyId); $languages = array_merge((array) Survey::model()->findByPk($iSurveyId)->language, Survey::model()->findByPk($iSurveyId)->additionalLanguages); $fieldcontents = array(); $captions = array(); foreach ($tokenattributefieldnames as $fieldname) { $fieldcontents[$fieldname] = array('description' => strip_tags(Yii::app()->request->getPost('description_' . $fieldname)), 'mandatory' => Yii::app()->request->getPost('mandatory_' . $fieldname) == 'Y' ? 'Y' : 'N', 'show_register' => Yii::app()->request->getPost('show_register_' . $fieldname) == 'Y' ? 'Y' : 'N'); foreach ($languages as $language) { $captions[$language][$fieldname] = $_POST["caption_{$fieldname}_{$language}"]; } } Survey::model()->updateByPk($iSurveyId, array('attributedescriptions' => serialize($fieldcontents))); foreach ($languages as $language) { $ls = Surveys_languagesettings::model()->findByAttributes(array('surveyls_survey_id' => $iSurveyId, 'surveyls_language' => $language)); $ls->surveyls_attributecaptions = serialize($captions[$language]); $ls->save(); } $aData['thissurvey'] = getSurveyInfo($iSurveyId); $aData['surveyid'] = $iSurveyId; $this->_renderWrappedTemplate('token', array('tokenbar', 'message' => array('title' => $clang->gT('Token attribute descriptions were successfully updated.'), 'message' => "<br /><input type='button' value='" . $clang->gT('Back to attribute field management.') . "' onclick=\"window.open('" . $this->getController()->createUrl("/admin/tokens/managetokenattributes/surveyid/{$iSurveyId}") . "', '_top')\" />")), $aData); }
/** * Receives an ajax call containing the participant id in the fourth segment of the url * Supplies list of survey links - surveys of which this participant is on the tokens table * URL: [localurl]/limesurvey/admin/participants/getSurveyInfo_json/pid/[participant_id] * RETURNS: json data containing linked survey information (Survey name, survey id, token_id and date_added) */ function getSurveyInfo_json() { $participantid = Yii::app()->request->getQuery('pid'); $records = Survey_links::model()->findAllByAttributes(array('participant_id' => $participantid)); $aData = new stdClass(); $aData->page = 1; $aData->records = count($records); $aData->total = ceil($aData->records / 10); $i = 0; foreach ($records as $row) { $surveyname = Surveys_languagesettings::model()->getSurveyNames($row['survey_id']); $surveylink = ""; /* Check permissions of each survey before creating a link*/ if (!hasSurveyPermission($row['survey_id'], 'tokens', 'read')) { $surveylink = $row['survey_id']; } else { $surveylink = '<a href=' . Yii::app()->getController()->createUrl("/admin/tokens/browse/surveyid/{$row['survey_id']}") . '>' . $row['survey_id'] . '</a>'; } $aData->rows[$i]['cell'] = array($surveyname[0]['surveyls_title'], $surveylink, $row['token_id'], $row['date_created'], $row['date_invited'], $row['date_completed']); $i++; } echo ls_json_encode($aData); }
/** * Database::index() * * @param mixed $action * @return */ function index($sa = null) { $action = Yii::app()->request->getPost('action'); $clang = $this->getController()->lang; $postsid = returnGlobal('sid'); $postgid = returnGlobal('gid'); $postqid = returnGlobal('qid'); $postqaid = returnGlobal('qaid'); $databaseoutput = ''; $surveyid = returnGlobal('sid'); $gid = returnGlobal('gid'); $qid = returnGlobal('qid'); // if $action is not passed, check post data. if (Yii::app()->getConfig('filterxsshtml') && Yii::app()->session['USER_RIGHT_SUPERADMIN'] != 1) { $filter = new CHtmlPurifier(); $filter->options = array('URI.AllowedSchemes' => array('http' => true, 'https' => true)); $xssfilter = true; } else { $xssfilter = false; } if ($action == "updatedefaultvalues" && hasSurveyPermission($surveyid, 'surveycontent', 'update')) { $questlangs = Survey::model()->findByPk($surveyid)->additionalLanguages; $baselang = Survey::model()->findByPk($surveyid)->language; array_unshift($questlangs, $baselang); Questions::model()->updateAll(array('same_default' => Yii::app()->request->getPost('samedefault') ? 1 : 0), 'sid=:sid ANd qid=:qid', array(':sid' => $surveyid, ':qid' => $qid)); $resrow = Questions::model()->findByAttributes(array('qid' => $qid)); $questiontype = $resrow['type']; $qtproperties = getQuestionTypeList('', 'array'); if ($qtproperties[$questiontype]['answerscales'] > 0 && $qtproperties[$questiontype]['subquestions'] == 0) { for ($scale_id = 0; $scale_id < $qtproperties[$questiontype]['answerscales']; $scale_id++) { foreach ($questlangs as $language) { if (!is_null(Yii::app()->request->getPost('defaultanswerscale_' . $scale_id . '_' . $language))) { $this->_updateDefaultValues($qid, 0, $scale_id, '', $language, Yii::app()->request->getPost('defaultanswerscale_' . $scale_id . '_' . $language), true); } if (!is_null(Yii::app()->request->getPost('other_' . $scale_id . '_' . $language))) { $this->_updateDefaultValues($qid, 0, $scale_id, 'other', $language, Yii::app()->request->getPost('other_' . $scale_id . '_' . $language), true); } } } } if ($qtproperties[$questiontype]['subquestions'] > 0) { foreach ($questlangs as $language) { $sqresult = Questions::model()->findAllByAttributes(array('sid' => $surveyid, 'gid' => $gid, 'parent_qid' => $qid, 'language' => $language, 'scale_id' => 0)); for ($scale_id = 0; $scale_id < $qtproperties[$questiontype]['subquestions']; $scale_id++) { foreach ($sqresult as $aSubquestionrow) { if (!is_null(Yii::app()->request->getPost('defaultanswerscale_' . $scale_id . '_' . $language . '_' . $aSubquestionrow['qid']))) { $this->_updateDefaultValues($qid, $aSubquestionrow['qid'], $scale_id, '', $language, Yii::app()->request->getPost('defaultanswerscale_' . $scale_id . '_' . $language . '_' . $aSubquestionrow['qid']), true); } } } } } if ($qtproperties[$questiontype]['answerscales'] == 0 && $qtproperties[$questiontype]['subquestions'] == 0) { foreach ($questlangs as $language) { if (!is_null(Yii::app()->request->getPost('defaultanswerscale_0_' . $language . '_0'))) { $this->_updateDefaultValues($postqid, 0, 0, '', $language, Yii::app()->request->getPost('defaultanswerscale_0_' . $language . '_0'), true); } } } Yii::app()->session['flashmessage'] = $clang->gT("Default value settings were successfully saved."); LimeExpressionManager::SetDirtyFlag(); if ($databaseoutput != '') { echo $databaseoutput; } else { $this->getController()->redirect($this->getController()->createUrl('admin/survey/sa/view/surveyid/' . $surveyid . '/gid/' . $gid . '/qid/' . $qid)); } } if ($action == "updateansweroptions" && hasSurveyPermission($surveyid, 'surveycontent', 'update')) { Yii::app()->loadHelper('database'); $anslangs = Survey::model()->findByPk($surveyid)->additionalLanguages; $baselang = Survey::model()->findByPk($surveyid)->language; $alllanguages = $anslangs; array_unshift($alllanguages, $baselang); $resrow = Questions::model()->findByAttributes(array('qid' => $qid)); $questiontype = $resrow['type']; // Checked) $qtypes = getQuestionTypeList('', 'array'); $scalecount = $qtypes[$questiontype]['answerscales']; $count = 0; $invalidCode = 0; $duplicateCode = 0; //require_once("../classes/inputfilter/class.inputfilter_clean.php"); //$myFilter = new InputFilter('','',1,1,1); //First delete all answers Answers::model()->deleteAllByAttributes(array('qid' => $qid)); LimeExpressionManager::RevertUpgradeConditionsToRelevance($surveyid); for ($scale_id = 0; $scale_id < $scalecount; $scale_id++) { $maxcount = (int) Yii::app()->request->getPost('answercount_' . $scale_id); for ($sortorderid = 1; $sortorderid < $maxcount; $sortorderid++) { $code = sanitize_paranoid_string(Yii::app()->request->getPost('code_' . $sortorderid . '_' . $scale_id)); if (Yii::app()->request->getPost('oldcode_' . $sortorderid . '_' . $scale_id)) { $oldcode = sanitize_paranoid_string(Yii::app()->request->getPost('oldcode_' . $sortorderid . '_' . $scale_id)); if ($code !== $oldcode) { Conditions::model()->updateAll(array('value' => $code), 'cqid=:cqid AND value=:value', array(':cqid' => $qid, ':value' => $oldcode)); } } $assessmentvalue = (int) Yii::app()->request->getPost('assessment_' . $sortorderid . '_' . $scale_id); foreach ($alllanguages as $language) { $answer = Yii::app()->request->getPost('answer_' . $language . '_' . $sortorderid . '_' . $scale_id); if ($xssfilter) { $answer = $filter->purify($answer); } else { $answer = html_entity_decode($answer, ENT_QUOTES, "UTF-8"); } // Fix bug with FCKEditor saving strange BR types $answer = fixCKeditorText($answer); // Now we insert the answers $result = Answers::model()->insertRecords(array('code' => $code, 'answer' => $answer, 'qid' => $qid, 'sortorder' => $sortorderid, 'language' => $language, 'assessment_value' => $assessmentvalue, 'scale_id' => $scale_id)); if (!$result) { $databaseoutput .= "<script type=\"text/javascript\">\n<!--\n alert(\"" . $clang->gT("Failed to update answers", "js") . "\")\n //-->\n</script>\n"; } } // foreach ($alllanguages as $language) if (isset($oldcode) && $code !== $oldcode) { Conditions::model()->updateAll(array('value' => $code), 'cqid=:cqid AND value=:value', array(':cqid' => $qid, ':value' => $oldcode)); } } // for ($sortorderid=0;$sortorderid<$maxcount;$sortorderid++) } // for ($scale_id=0; LimeExpressionManager::UpgradeConditionsToRelevance($surveyid); if ($invalidCode == 1) { $databaseoutput .= "<script type=\"text/javascript\">\n<!--\n alert(\"" . $clang->gT("Answers with a code of 0 (zero) or blank code are not allowed, and will not be saved", "js") . "\")\n //-->\n</script>\n"; } if ($duplicateCode == 1) { $databaseoutput .= "<script type=\"text/javascript\">\n<!--\n alert(\"" . $clang->gT("Duplicate codes found, these entries won't be updated", "js") . "\")\n //-->\n</script>\n"; } Yii::app()->session['flashmessage'] = $clang->gT("Answer options were successfully saved."); LimeExpressionManager::SetDirtyFlag(); if ($databaseoutput != '') { echo $databaseoutput; } else { $this->getController()->redirect($this->getController()->createUrl('/admin/question/sa/answeroptions/surveyid/' . $surveyid . '/gid/' . $gid . '/qid/' . $qid)); } //$action='editansweroptions'; } if ($action == "updatesubquestions" && hasSurveyPermission($surveyid, 'surveycontent', 'update')) { Yii::app()->loadHelper('database'); $anslangs = Survey::model()->findByPk($surveyid)->additionalLanguages; $baselang = Survey::model()->findByPk($surveyid)->language; array_unshift($anslangs, $baselang); $row = Questions::model()->findByAttributes(array('qid' => $qid)); $questiontype = $row['type']; // Checked $qtypes = getQuestionTypeList('', 'array'); $scalecount = $qtypes[$questiontype]['subquestions']; $clang = $this->getController()->lang; // First delete any deleted ids $deletedqids = explode(' ', trim(Yii::app()->request->getPost('deletedqids'))); LimeExpressionManager::RevertUpgradeConditionsToRelevance($surveyid); foreach ($deletedqids as $deletedqid) { $deletedqid = (int) $deletedqid; if ($deletedqid > 0) { // don't remove undefined $result = Questions::model()->deleteAllByAttributes(array('qid' => $deletedqid)); if (!$result) { $databaseoutput .= "<script type=\"text/javascript\">\n<!--\n alert(\"" . $clang->gT("Failed to delete answer", "js") . " \")\n //-->\n</script>\n"; } } } //Determine ids by evaluating the hidden field $rows = array(); $codes = array(); $oldcodes = array(); foreach ($_POST as $postkey => $postvalue) { $postkey = explode('_', $postkey); if ($postkey[0] == 'answer') { $rows[$postkey[3]][$postkey[1]][$postkey[2]] = $postvalue; } if ($postkey[0] == 'code') { $codes[$postkey[2]][] = $postvalue; } if ($postkey[0] == 'oldcode') { $oldcodes[$postkey[2]][] = $postvalue; } } $count = 0; $invalidCode = 0; $duplicateCode = 0; $dupanswers = array(); /* for ($scale_id=0;$scale_id<$scalecount;$scale_id++) { // Find duplicate codes and add these to dupanswers array $foundCat=array_count_values($codes); foreach($foundCat as $key=>$value){ if($value>=2){ $dupanswers[]=$key; } } } */ //require_once("../classes/inputfilter/class.inputfilter_clean.php"); //$myFilter = new InputFilter('','',1,1,1); //$insertqids=array(); //? $insertqid = array(); for ($scale_id = 0; $scale_id < $scalecount; $scale_id++) { foreach ($anslangs as $language) { $position = 0; foreach ($rows[$scale_id][$language] as $subquestionkey => $subquestionvalue) { if (substr($subquestionkey, 0, 3) != 'new') { Questions::model()->updateByPk(array('qid' => $subquestionkey, 'language' => $language), array('question_order' => $position + 1, 'title' => $codes[$scale_id][$position], 'question' => $subquestionvalue, 'scale_id' => $scale_id)); if (isset($oldcodes[$scale_id][$position]) && $codes[$scale_id][$position] !== $oldcodes[$scale_id][$position]) { Conditions::model()->updateAll(array('cfieldname' => '+' . $surveyid . 'X' . $gid . 'X' . $qid . $codes[$scale_id][$position], 'value' => $codes[$scale_id][$position]), 'cqid=:cqid AND cfieldname=:cfieldname AND value=:value', array(':cqid' => $qid, ':cfieldname' => $surveyid . 'X' . $gid . 'X' . $qid, ':value' => $oldcodes[$scale_id][$position])); } } else { if (!isset($insertqid[$scale_id][$position])) { $insertqid[$scale_id][$position] = Questions::model()->insertRecords(array('sid' => $surveyid, 'gid' => $gid, 'question_order' => $position + 1, 'title' => $codes[$scale_id][$position], 'question' => $subquestionvalue, 'parent_qid' => $qid, 'language' => $language, 'scale_id' => $scale_id)); } else { switchMSSQLIdentityInsert('questions', true); Questions::model()->insertRecords(array('qid' => $insertqid[$scale_id][$position], 'sid' => $surveyid, 'gid' => $gid, 'question_order' => $position + 1, 'title' => $codes[$scale_id][$position], 'question' => $subquestionvalue, 'parent_qid' => $qid, 'language' => $language, 'scale_id' => $scale_id)); switchMSSQLIdentityInsert('questions', true); } } $position++; } } } LimeExpressionManager::UpgradeConditionsToRelevance($surveyid); //include("surveytable_functions.php"); //surveyFixColumns($surveyid); Yii::app()->session['flashmessage'] = $clang->gT("Subquestions were successfully saved."); //$action='editsubquestions'; LimeExpressionManager::SetDirtyFlag(); if ($databaseoutput != '') { echo $databaseoutput; } else { $this->getController()->redirect($this->getController()->createUrl('/admin/question/sa/subquestions/surveyid/' . $surveyid . '/gid/' . $gid . '/qid/' . $qid)); } } if (in_array($action, array('insertquestion', 'copyquestion')) && hasSurveyPermission($surveyid, 'surveycontent', 'create')) { $baselang = Survey::model()->findByPk($surveyid)->language; if (strlen(Yii::app()->request->getPost('title')) < 1) { $databaseoutput .= "<script type=\"text/javascript\">\n<!--\n " . "alert(\"" . $clang->gT("The question could not be added. You must enter at least a question code.", "js") . "\")\n " . "//-->\n</script>\n"; } else { if (Yii::app()->request->getPost('questionposition', "") != "") { $question_order = intval(Yii::app()->request->getPost('questionposition')); //Need to renumber all questions on or after this $cdquery = "UPDATE {{questions}} SET question_order=question_order+1 WHERE gid=:gid AND question_order >= :order"; $cdresult = Yii::app()->db->createCommand($cdquery)->bindValues(array(':gid' => $gid, ':order' => $question_order))->query(); } else { $question_order = getMaxQuestionOrder($gid, $surveyid); $question_order++; } $_POST['title'] = html_entity_decode(Yii::app()->request->getPost('title'), ENT_QUOTES, "UTF-8"); $_POST['question_' . $baselang] = html_entity_decode(Yii::app()->request->getPost('question_' . $baselang), ENT_QUOTES, "UTF-8"); $_POST['help_' . $baselang] = html_entity_decode(Yii::app()->request->getPost('help_' . $baselang), ENT_QUOTES, "UTF-8"); // Fix bug with FCKEditor saving strange BR types if ($xssfilter) { $_POST['title'] = $filter->purify($_POST['title']); $_POST['question_' . $baselang] = $filter->purify($_POST['question_' . $baselang]); $_POST['help_' . $baselang] = $filter->purify($_POST['help_' . $baselang]); } else { $_POST['title'] = fixCKeditorText(Yii::app()->request->getPost('title')); $_POST['question_' . $baselang] = fixCKeditorText(Yii::app()->request->getPost('question_' . $baselang)); $_POST['help_' . $baselang] = fixCKeditorText(Yii::app()->request->getPost('help_' . $baselang)); } $data = array('sid' => $surveyid, 'gid' => $gid, 'type' => Yii::app()->request->getPost('type'), 'title' => Yii::app()->request->getPost('title'), 'question' => Yii::app()->request->getPost('question_' . $baselang), 'preg' => Yii::app()->request->getPost('preg'), 'help' => Yii::app()->request->getPost('help_' . $baselang), 'other' => Yii::app()->request->getPost('other'), 'mandatory' => Yii::app()->request->getPost('mandatory'), 'relevance' => Yii::app()->request->getPost('relevance'), 'question_order' => $question_order, 'language' => $baselang); $qid = Questions::model()->insertRecords($data); // Add other languages if ($qid) { $addlangs = Survey::model()->findByPk($surveyid)->additionalLanguages; foreach ($addlangs as $alang) { if ($alang != "") { $data = array('qid' => $qid, 'sid' => $surveyid, 'gid' => $gid, 'type' => Yii::app()->request->getPost('type'), 'title' => Yii::app()->request->getPost('title'), 'question' => Yii::app()->request->getPost('question_' . $alang), 'preg' => Yii::app()->request->getPost('preg'), 'help' => Yii::app()->request->getPost('help_' . $alang), 'other' => Yii::app()->request->getPost('other'), 'mandatory' => Yii::app()->request->getPost('mandatory'), 'question_order' => $question_order, 'language' => $alang); $langqid = Questions::model()->insertRecords($data); // Checked */ if (!$langqid) { $databaseoutput .= "<script type=\"text/javascript\">\n<!--\n alert(\"" . sprintf($clang->gT("Question in language %s could not be created.", "js"), $alang) . "\\n\")\n //-->\n</script>\n"; } } } } if (!$qid) { $databaseoutput .= "<script type=\"text/javascript\">\n<!--\n alert(\"" . $clang->gT("Question could not be created.", "js") . "\\n\")\n //-->\n</script>\n"; } else { if ($action == 'copyquestion') { if (returnGlobal('copysubquestions') == "Y") { $aSQIDMappings = array(); $r1 = Questions::model()->getSubQuestions(returnGlobal('oldqid')); while ($qr1 = $r1->read()) { $qr1['parent_qid'] = $qid; if (isset($aSQIDMappings[$qr1['qid']])) { $qr1['qid'] = $aSQIDMappings[$qr1['qid']]; } else { $oldqid = $qr1['qid']; unset($qr1['qid']); } $qr1['gid'] = $postgid; $iInsertID = Questions::model()->insertRecords($qr1); if (!isset($qr1['qid'])) { $aSQIDMappings[$oldqid] = $iInsertID; } } } if (returnGlobal('copyanswers') == "Y") { $r1 = Answers::model()->getAnswers(returnGlobal('oldqid')); while ($qr1 = $r1->read()) { Answers::model()->insertRecords(array('qid' => $qid, 'code' => $qr1['code'], 'answer' => $qr1['answer'], 'sortorder' => $qr1['sortorder'], 'language' => $qr1['language'], 'scale_id' => $qr1['scale_id'])); } } if (returnGlobal('copyattributes') == "Y") { $r1 = Question_attributes::model()->getQuestionAttributes(returnGlobal('oldqid')); while ($qr1 = $r1->read()) { $qr1['qid'] = $qid; unset($qr1['qaid']); Question_attributes::model()->insertRecords($qr1); } } } else { $qattributes = questionAttributes(); $validAttributes = $qattributes[Yii::app()->request->getPost('type')]; $aLanguages = array_merge(array(Survey::model()->findByPk($surveyid)->language), Survey::model()->findByPk($surveyid)->additionalLanguages); foreach ($validAttributes as $validAttribute) { if ($validAttribute['i18n']) { foreach ($aLanguages as $sLanguage) { // TODO sanitise XSS $value = Yii::app()->request->getPost($validAttribute['name'] . '_' . $sLanguage); $result = Question_attributes::model()->findAllByAttributes(array('attribute' => $validAttribute['name'], 'qid' => $qid, 'language' => $sLanguage)); if (count($result) > 0) { if ($value != '') { Question_attributes::model()->updateAll(array('value' => $value), 'attribute=:attribute AND qid=:qid AND language=:language', array(':attribute' => $validAttribute['name'], ':qid' => $qid, ':language' => $sLanguage)); } else { Question_attributes::model()->deleteAll('attribute=:attribute AND qid=:qid AND language=:language', array(':attribute' => $validAttribute['name'], ':qid' => $qid, ':language' => $sLanguage)); } } elseif ($value != '') { $attribute = new Question_attributes(); $attribute->qid = $qid; $attribute->value = $value; $attribute->attribute = $validAttribute['name']; $attribute->language = $sLanguage; $attribute->save(); } } } else { $value = Yii::app()->request->getPost($validAttribute['name']); if ($validAttribute['name'] == 'multiflexible_step' && trim($value) != '') { $value = floatval($value); if ($value == 0) { $value = 1; } } $result = Question_attributes::model()->findAllByAttributes(array('attribute' => $validAttribute['name'], 'qid' => $qid)); if (count($result) > 0) { if ($value != $validAttribute['default'] && trim($value) != "") { Question_attributes::model()->updateAll(array('value' => $value), 'attribute=:attribute AND qid=:qid', array(':attribute' => $validAttribute['name'], ':qid' => $qid)); } else { Question_attributes::model()->deleteAll('attribute=:attribute AND qid=:qid', array(':attribute' => $validAttribute['name'], ':qid' => $qid)); } } elseif ($value != $validAttribute['default'] && trim($value) != "") { $attribute = new Question_attributes(); $attribute->qid = $qid; $attribute->value = $value; $attribute->attribute = $validAttribute['name']; $attribute->save(); } } } } Questions::model()->updateQuestionOrder($gid, $surveyid); Yii::app()->session['flashmessage'] = $clang->gT("Question was successfully added."); } } LimeExpressionManager::SetDirtyFlag(); // so refreshes syntax highlighting if ($databaseoutput != '') { echo $databaseoutput; } else { $this->getController()->redirect($this->getController()->createUrl('admin/survey/sa/view/surveyid/' . $surveyid . '/gid/' . $gid . '/qid/' . $qid)); } } if ($action == "updatequestion" && hasSurveyPermission($surveyid, 'surveycontent', 'update')) { LimeExpressionManager::RevertUpgradeConditionsToRelevance($surveyid); $cqr = Questions::model()->findByAttributes(array('qid' => $qid)); $oldtype = $cqr['type']; $oldgid = $cqr['gid']; // Remove invalid question attributes on saving $qattributes = questionAttributes(); $criteria = new CDbCriteria(); $criteria->compare('qid', $qid); if (isset($qattributes[Yii::app()->request->getPost('type')])) { $validAttributes = $qattributes[Yii::app()->request->getPost('type')]; foreach ($validAttributes as $validAttribute) { $criteria->compare('attribute', '<>' . $validAttribute['name']); } } Question_attributes::model()->deleteAll($criteria); $aLanguages = array_merge(array(Survey::model()->findByPk($surveyid)->language), Survey::model()->findByPk($surveyid)->additionalLanguages); //now save all valid attributes $validAttributes = $qattributes[Yii::app()->request->getPost('type')]; foreach ($validAttributes as $validAttribute) { if ($validAttribute['i18n']) { foreach ($aLanguages as $sLanguage) { // TODO sanitise XSS $value = Yii::app()->request->getPost($validAttribute['name'] . '_' . $sLanguage); $result = Question_attributes::model()->findAllByAttributes(array('attribute' => $validAttribute['name'], 'qid' => $qid, 'language' => $sLanguage)); if (count($result) > 0) { if ($value != '') { Question_attributes::model()->updateAll(array('value' => $value), 'attribute=:attribute AND qid=:qid AND language=:language', array(':attribute' => $validAttribute['name'], ':qid' => $qid, ':language' => $sLanguage)); } else { Question_attributes::model()->deleteAll('attribute=:attribute AND qid=:qid AND language=:language', array(':attribute' => $validAttribute['name'], ':qid' => $qid, ':language' => $sLanguage)); } } elseif ($value != '') { $attribute = new Question_attributes(); $attribute->qid = $qid; $attribute->value = $value; $attribute->attribute = $validAttribute['name']; $attribute->language = $sLanguage; $attribute->save(); } } } else { $value = Yii::app()->request->getPost($validAttribute['name']); if ($validAttribute['name'] == 'multiflexible_step' && trim($value) != '') { $value = floatval($value); if ($value == 0) { $value = 1; } } $result = Question_attributes::model()->findAllByAttributes(array('attribute' => $validAttribute['name'], 'qid' => $qid)); if (count($result) > 0) { if ($value != $validAttribute['default'] && trim($value) != "") { Question_attributes::model()->updateAll(array('value' => $value), 'attribute=:attribute AND qid=:qid', array(':attribute' => $validAttribute['name'], ':qid' => $qid)); } else { Question_attributes::model()->deleteAll('attribute=:attribute AND qid=:qid', array(':attribute' => $validAttribute['name'], ':qid' => $qid)); } } elseif ($value != $validAttribute['default'] && trim($value) != "") { $attribute = new Question_attributes(); $attribute->qid = $qid; $attribute->value = $value; $attribute->attribute = $validAttribute['name']; $attribute->save(); } } } $qtypes = getQuestionTypeList('', 'array'); // These are the questions types that have no answers and therefore we delete the answer in that case $iAnswerScales = $qtypes[Yii::app()->request->getPost('type')]['answerscales']; $iSubquestionScales = $qtypes[Yii::app()->request->getPost('type')]['subquestions']; // These are the questions types that have the other option therefore we set everything else to 'No Other' if (Yii::app()->request->getPost('type') != "L" && Yii::app()->request->getPost('type') != "!" && Yii::app()->request->getPost('type') != "P" && Yii::app()->request->getPost('type') != "M") { $_POST['other'] = 'N'; } // These are the questions types that have no validation - so zap it accordingly if (Yii::app()->request->getPost('type') == "!" || Yii::app()->request->getPost('type') == "L" || Yii::app()->request->getPost('type') == "M" || Yii::app()->request->getPost('type') == "P" || Yii::app()->request->getPost('type') == "F" || Yii::app()->request->getPost('type') == "H" || Yii::app()->request->getPost('type') == "X" || Yii::app()->request->getPost('type') == "") { $_POST['preg'] = ''; } // These are the questions types that have no mandatory property - so zap it accordingly if (Yii::app()->request->getPost('type') == "X" || Yii::app()->request->getPost('type') == "|") { $_POST['mandatory'] = 'N'; } if ($oldtype != Yii::app()->request->getPost('type')) { // TMSW Conditions->Relevance: Do similar check via EM, but do allow such a change since will be easier to modify relevance //Make sure there are no conditions based on this question, since we are changing the type $ccresult = Conditions::model()->findAllByAttributes(array('cqid' => $qid)); $cccount = count($ccresult); foreach ($ccresult as $ccr) { $qidarray[] = $ccr['qid']; } if (isset($qidarray) && $qidarray) { $qidlist = implode(", ", $qidarray); } } if (isset($cccount) && $cccount) { $databaseoutput .= "<script type=\"text/javascript\">\n<!--\n alert(\"" . $clang->gT("Question could not be updated. There are conditions for other questions that rely on the answers to this question and changing the type will cause problems. You must delete these conditions before you can change the type of this question.", "js") . " ({$qidlist})\")\n //-->\n</script>\n"; } else { if (isset($gid) && $gid != "") { // $array_result=checkMoveQuestionConstraintsForConditions(sanitize_int($surveyid),sanitize_int($qid), sanitize_int($gid)); // // If there is no blocking conditions that could prevent this move // // if (is_null($array_result['notAbove']) && is_null($array_result['notBelow'])) // { $questlangs = Survey::model()->findByPk($surveyid)->additionalLanguages; $baselang = Survey::model()->findByPk($surveyid)->language; array_push($questlangs, $baselang); if ($xssfilter) { $_POST['title'] = $filter->purify($_POST['title']); } else { $_POST['title'] = html_entity_decode(Yii::app()->request->getPost('title'), ENT_QUOTES, "UTF-8"); } // Fix bug with FCKEditor saving strange BR types $_POST['title'] = fixCKeditorText(Yii::app()->request->getPost('title')); foreach ($questlangs as $qlang) { if ($xssfilter) { $_POST['question_' . $qlang] = $filter->purify($_POST['question_' . $qlang]); $_POST['help_' . $qlang] = $filter->purify($_POST['help_' . $qlang]); } else { $_POST['question_' . $qlang] = html_entity_decode(Yii::app()->request->getPost('question_' . $qlang), ENT_QUOTES, "UTF-8"); $_POST['help_' . $qlang] = html_entity_decode(Yii::app()->request->getPost('help_' . $qlang), ENT_QUOTES, "UTF-8"); } // Fix bug with FCKEditor saving strange BR types $_POST['question_' . $qlang] = fixCKeditorText(Yii::app()->request->getPost('question_' . $qlang)); $_POST['help_' . $qlang] = fixCKeditorText(Yii::app()->request->getPost('help_' . $qlang)); if (isset($qlang) && $qlang != "") { // ToDo: Sanitize the POST variables ! $udata = array('type' => Yii::app()->request->getPost('type'), 'title' => Yii::app()->request->getPost('title'), 'question' => Yii::app()->request->getPost('question_' . $qlang), 'preg' => Yii::app()->request->getPost('preg'), 'help' => Yii::app()->request->getPost('help_' . $qlang), 'gid' => $gid, 'other' => Yii::app()->request->getPost('other'), 'mandatory' => Yii::app()->request->getPost('mandatory'), 'relevance' => Yii::app()->request->getPost('relevance')); if ($oldgid != $gid) { if (getGroupOrder($surveyid, $oldgid) > getGroupOrder($surveyid, $gid)) { // TMSW Conditions->Relevance: What is needed here? // Moving question to a 'upper' group // insert question at the end of the destination group // this prevent breaking conditions if the target qid is in the dest group $insertorder = getMaxQuestionOrder($gid, $surveyid) + 1; $udata = array_merge($udata, array('question_order' => $insertorder)); } else { // Moving question to a 'lower' group // insert question at the beginning of the destination group shiftOrderQuestions($surveyid, $gid, 1); // makes 1 spare room for new question at top of dest group $udata = array_merge($udata, array('question_order' => 0)); } } $condn = array('sid' => $surveyid, 'qid' => $qid, 'language' => $qlang); $question = Questions::model()->findByAttributes($condn); foreach ($udata as $k => $v) { $question->{$k} = $v; } $uqresult = $question->save(); //($uqquery); // or safeDie ("Error Update Question: ".$uqquery."<br />"); // Checked) if (!$uqresult) { $databaseoutput .= "<script type=\"text/javascript\">\n<!--\n alert(\"" . $clang->gT("Question could not be updated", "js") . "\n\")\n //-->\n</script>\n"; } } } // Update the group ID on subquestions, too if ($oldgid != $gid) { Questions::model()->updateAll(array('gid' => $gid), 'qid=:qid and parent_qid>0', array(':qid' => $qid)); // if the group has changed then fix the sortorder of old and new group Questions::model()->updateQuestionOrder($oldgid, $surveyid); Questions::model()->updateQuestionOrder($gid, $surveyid); // If some questions have conditions set on this question's answers // then change the cfieldname accordingly fixMovedQuestionConditions($qid, $oldgid, $gid); } if ($oldtype != Yii::app()->request->getPost('type')) { Questions::model()->updateAll(array('type' => Yii::app()->request->getPost('type')), 'parent_qid=:qid', array(':qid' => $qid)); } Answers::model()->deleteAllByAttributes(array('qid' => $qid), 'scale_id >= :scale_id', array(':scale_id' => $iAnswerScales)); // Remove old subquestion scales Questions::model()->deleteAllByAttributes(array('parent_qid' => $qid), 'scale_id >= :scale_id', array(':scale_id' => $iSubquestionScales)); Yii::app()->session['flashmessage'] = $clang->gT("Question was successfully saved."); // } // else // { // // // There are conditions constraints: alert the user // $errormsg=""; // if (!is_null($array_result['notAbove'])) // { // $errormsg.=$clang->gT("This question relies on other question's answers and can't be moved above groupId:","js") // . " " . $array_result['notAbove'][0][0] . " " . $clang->gT("in position","js")." ".$array_result['notAbove'][0][1]."\\n" // . $clang->gT("See conditions:")."\\n"; // // foreach ($array_result['notAbove'] as $notAboveCond) // { // $errormsg.="- cid:". $notAboveCond[3]."\\n"; // } // // } // if (!is_null($array_result['notBelow'])) // { // $errormsg.=$clang->gT("Some questions rely on this question's answers. You can't move this question below groupId:","js") // . " " . $array_result['notBelow'][0][0] . " " . $clang->gT("in position","js")." ".$array_result['notBelow'][0][1]."\\n" // . $clang->gT("See conditions:")."\\n"; // // foreach ($array_result['notBelow'] as $notBelowCond) // { // $errormsg.="- cid:". $notBelowCond[3]."\\n"; // } // } // // $databaseoutput .= "<script type=\"text/javascript\">\n<!--\n alert(\"$errormsg\")\n //-->\n</script>\n"; // $gid= $oldgid; // group move impossible ==> keep display on oldgid // } } else { $databaseoutput .= "<script type=\"text/javascript\">\n<!--\n alert(\"" . $clang->gT("Question could not be updated", "js") . "\")\n //-->\n</script>\n"; } } LimeExpressionManager::UpgradeConditionsToRelevance($surveyid); if ($databaseoutput != '') { echo $databaseoutput; } else { if (Yii::app()->request->getPost('newpage') == "return") { $this->getController()->redirect($this->getController()->createUrl('admin/question/sa/editquestion/surveyid/' . $surveyid . '/gid/' . $gid . '/qid/' . $qid)); } else { $this->getController()->redirect($this->getController()->createUrl('admin/survey/sa/view/surveyid/' . $surveyid . '/gid/' . $gid . '/qid/' . $qid)); } } } if ($action == "updatesurveylocalesettings" && hasSurveyPermission($surveyid, 'surveylocale', 'update')) { $languagelist = Survey::model()->findByPk($surveyid)->additionalLanguages; $languagelist[] = Survey::model()->findByPk($surveyid)->language; Yii::app()->loadHelper('database'); foreach ($languagelist as $langname) { if ($langname) { $url = Yii::app()->request->getPost('url_' . $langname); if ($url == 'http://') { $url = ""; } // Clean XSS attacks if ($xssfilter) { $purifier = new CHtmlPurifier(); $purifier->options = array('HTML.Allowed' => 'p,a[href],b,i'); $short_title = $purifier->purify(Yii::app()->request->getPost('short_title_' . $langname)); $description = $purifier->purify(Yii::app()->request->getPost('description_' . $langname)); $welcome = $purifier->purify(Yii::app()->request->getPost('welcome_' . $langname)); $endtext = $purifier->purify(Yii::app()->request->getPost('endtext_' . $langname)); $sURLDescription = $purifier->purify(Yii::app()->request->getPost('urldescrip_' . $langname)); $sURL = $purifier->purify(Yii::app()->request->getPost('url_' . $langname)); } else { $short_title = html_entity_decode(Yii::app()->request->getPost('short_title_' . $langname), ENT_QUOTES, "UTF-8"); $description = html_entity_decode(Yii::app()->request->getPost('description_' . $langname), ENT_QUOTES, "UTF-8"); $welcome = html_entity_decode(Yii::app()->request->getPost('welcome_' . $langname), ENT_QUOTES, "UTF-8"); $endtext = html_entity_decode(Yii::app()->request->getPost('endtext_' . $langname), ENT_QUOTES, "UTF-8"); $sURLDescription = html_entity_decode(Yii::app()->request->getPost('urldescrip_' . $langname), ENT_QUOTES, "UTF-8"); $sURL = html_entity_decode(Yii::app()->request->getPost('url_' . $langname), ENT_QUOTES, "UTF-8"); } // Fix bug with FCKEditor saving strange BR types $short_title = Yii::app()->request->getPost('short_title_' . $langname); $description = Yii::app()->request->getPost('description_' . $langname); $welcome = Yii::app()->request->getPost('welcome_' . $langname); $endtext = Yii::app()->request->getPost('endtext_' . $langname); $short_title = fixCKeditorText($short_title); $description = fixCKeditorText($description); $welcome = fixCKeditorText($welcome); $endtext = fixCKeditorText($endtext); $data = array('surveyls_title' => $short_title, 'surveyls_description' => $description, 'surveyls_welcometext' => $welcome, 'surveyls_endtext' => $endtext, 'surveyls_url' => $sURL, 'surveyls_urldescription' => $sURLDescription, 'surveyls_dateformat' => Yii::app()->request->getPost('dateformat_' . $langname), 'surveyls_numberformat' => Yii::app()->request->getPost('numberformat_' . $langname)); $Surveys_languagesettings = Surveys_languagesettings::model()->findByPk(array('surveyls_survey_id' => $postsid, 'surveyls_language' => $langname)); $Surveys_languagesettings->attributes = $data; $Surveys_languagesettings->save(); // save the change to database } } Yii::app()->session['flashmessage'] = $clang->gT("Survey text elements successfully saved."); if ($databaseoutput != '') { echo $databaseoutput; } else { $this->getController()->redirect($this->getController()->createUrl('admin/survey/sa/view/surveyid/' . $surveyid)); } } if (($action == "updatesurveysettingsandeditlocalesettings" || $action == "updatesurveysettings") && hasSurveyPermission($surveyid, 'surveysettings', 'update')) { Yii::app()->loadHelper('surveytranslator'); Yii::app()->loadHelper('database'); $formatdata = getDateFormatData(Yii::app()->session['dateformat']); $expires = $_POST['expires']; if (trim($expires) == "") { $expires = null; } else { Yii::app()->loadLibrary('Date_Time_Converter'); $datetimeobj = new date_time_converter($expires, $formatdata['phpdate'] . ' H:i'); //new Date_Time_Converter($expires, $formatdata['phpdate'].' H:i'); $expires = $datetimeobj->convert("Y-m-d H:i:s"); } $startdate = $_POST['startdate']; if (trim($startdate) == "") { $startdate = null; } else { Yii::app()->loadLibrary('Date_Time_Converter'); $datetimeobj = new date_time_converter($startdate, $formatdata['phpdate'] . ' H:i'); //new Date_Time_Converter($startdate,$formatdata['phpdate'].' H:i'); $startdate = $datetimeobj->convert("Y-m-d H:i:s"); } //make sure only numbers are passed within the $_POST variable $tokenlength = (int) $_POST['tokenlength']; //token length has to be at least 5, otherwise set it to default (15) if ($tokenlength < 5) { $tokenlength = 15; } cleanLanguagesFromSurvey($surveyid, Yii::app()->request->getPost('languageids')); fixLanguageConsistency($surveyid, Yii::app()->request->getPost('languageids')); $template = Yii::app()->request->getPost('template'); if (Yii::app()->session['USER_RIGHT_SUPERADMIN'] != 1 && Yii::app()->session['USER_RIGHT_MANAGE_TEMPLATE'] != 1 && !hasTemplateManageRights(Yii::app()->session['loginID'], $template)) { $template = "default"; } $aURLParams = json_decode(Yii::app()->request->getPost('allurlparams'), true); Survey_url_parameters::model()->deleteAllByAttributes(array('sid' => $surveyid)); foreach ($aURLParams as $aURLParam) { $aURLParam['parameter'] = trim($aURLParam['parameter']); if ($aURLParam['parameter'] == '' || !preg_match('/^[a-zA-Z_][a-zA-Z0-9_]*$/', $aURLParam['parameter']) || $aURLParam['parameter'] == 'sid' || $aURLParam['parameter'] == 'newtest' || $aURLParam['parameter'] == 'token' || $aURLParam['parameter'] == 'lang') { continue; // this parameter name seems to be invalid - just ignore it } unset($aURLParam['act']); unset($aURLParam['title']); unset($aURLParam['id']); if ($aURLParam['targetqid'] == '') { $aURLParam['targetqid'] = NULL; } if ($aURLParam['targetsqid'] == '') { $aURLParam['targetsqid'] = NULL; } $aURLParam['sid'] = $surveyid; $param = new Survey_url_parameters(); foreach ($aURLParam as $k => $v) { $param->{$k} = $v; } $param->save(); } $updatearray = array('admin' => Yii::app()->request->getPost('admin'), 'expires' => $expires, 'adminemail' => Yii::app()->request->getPost('adminemail'), 'startdate' => $startdate, 'bounce_email' => Yii::app()->request->getPost('bounce_email'), 'anonymized' => Yii::app()->request->getPost('anonymized'), 'faxto' => Yii::app()->request->getPost('faxto'), 'format' => Yii::app()->request->getPost('format'), 'savetimings' => Yii::app()->request->getPost('savetimings'), 'template' => $template, 'assessments' => Yii::app()->request->getPost('assessments'), 'language' => Yii::app()->request->getPost('language'), 'additional_languages' => Yii::app()->request->getPost('languageids'), 'datestamp' => Yii::app()->request->getPost('datestamp'), 'ipaddr' => Yii::app()->request->getPost('ipaddr'), 'refurl' => Yii::app()->request->getPost('refurl'), 'publicgraphs' => Yii::app()->request->getPost('publicgraphs'), 'usecookie' => Yii::app()->request->getPost('usecookie'), 'allowregister' => Yii::app()->request->getPost('allowregister'), 'allowsave' => Yii::app()->request->getPost('allowsave'), 'navigationdelay' => Yii::app()->request->getPost('navigationdelay'), 'printanswers' => Yii::app()->request->getPost('printanswers'), 'publicstatistics' => Yii::app()->request->getPost('publicstatistics'), 'autoredirect' => Yii::app()->request->getPost('autoredirect'), 'showxquestions' => Yii::app()->request->getPost('showxquestions'), 'showgroupinfo' => Yii::app()->request->getPost('showgroupinfo'), 'showqnumcode' => Yii::app()->request->getPost('showqnumcode'), 'shownoanswer' => Yii::app()->request->getPost('shownoanswer'), 'showwelcome' => Yii::app()->request->getPost('showwelcome'), 'allowprev' => Yii::app()->request->getPost('allowprev'), 'allowjumps' => Yii::app()->request->getPost('allowjumps'), 'nokeyboard' => Yii::app()->request->getPost('nokeyboard'), 'showprogress' => Yii::app()->request->getPost('showprogress'), 'listpublic' => Yii::app()->request->getPost('public'), 'htmlemail' => Yii::app()->request->getPost('htmlemail'), 'sendconfirmation' => Yii::app()->request->getPost('sendconfirmation'), 'tokenanswerspersistence' => Yii::app()->request->getPost('tokenanswerspersistence'), 'alloweditaftercompletion' => Yii::app()->request->getPost('alloweditaftercompletion'), 'usecaptcha' => Yii::app()->request->getPost('usecaptcha'), 'emailresponseto' => trim(Yii::app()->request->getPost('emailresponseto')), 'emailnotificationto' => trim(Yii::app()->request->getPost('emailnotificationto')), 'googleanalyticsapikey' => trim(Yii::app()->request->getPost('googleanalyticsapikey')), 'googleanalyticsstyle' => trim(Yii::app()->request->getPost('googleanalyticsstyle')), 'tokenlength' => $tokenlength); // use model $Survey = Survey::model()->findByPk($surveyid); foreach ($updatearray as $k => $v) { $Survey->{$k} = $v; } $Survey->save(); # Survey::model()->updateByPk($surveyid, $updatearray); $sqlstring = "surveyls_survey_id=:sid AND surveyls_language <> :base "; $params = array(':sid' => $surveyid, ':base' => Survey::model()->findByPk($surveyid)->language); $i = 100000; foreach (Survey::model()->findByPk($surveyid)->additionalLanguages as $langname) { if ($langname) { $sqlstring .= "AND surveyls_language <> :{$i} "; $params[':' . $i] = $langname; } $i++; } Surveys_languagesettings::model()->deleteAll($sqlstring, $params); $usresult = true; foreach (Survey::model()->findByPk($surveyid)->additionalLanguages as $langname) { if ($langname) { $oLanguageSettings = Surveys_languagesettings::model()->find('surveyls_survey_id=:surveyid AND surveyls_language=:langname', array(':surveyid' => $surveyid, ':langname' => $langname)); if (!$oLanguageSettings) { $oLanguageSettings = new Surveys_languagesettings(); $languagedetails = getLanguageDetails($langname); $insertdata = array('surveyls_survey_id' => $surveyid, 'surveyls_language' => $langname, 'surveyls_title' => '', 'surveyls_dateformat' => $languagedetails['dateformat']); foreach ($insertdata as $k => $v) { $oLanguageSettings->{$k} = $v; } $usresult = $oLanguageSettings->save(); } } } if ($usresult) { Yii::app()->session['flashmessage'] = $clang->gT("Survey settings were successfully saved."); } else { Yii::app()->session['flashmessage'] = $clang->gT("Error:") . '<br>' . $clang->gT("Survey could not be updated."); } if (Yii::app()->request->getPost('action') == "updatesurveysettingsandeditlocalesettings") { $this->getController()->redirect($this->getController()->createUrl('admin/survey/sa/editlocalsettings/surveyid/' . $surveyid)); } else { $this->getController()->redirect($this->getController()->createUrl('admin/survey/sa/view/surveyid/' . $surveyid)); } } if (!$action) { $this->getController()->redirect("/admin", "refresh"); } }
/** * This function checks the LimeSurvey database for logical consistency and returns an according array * containing all issues in the particular tables. * @returns Array with all found issues. */ protected function _checkintegrity() { $clang = Yii::app()->lang; /*** Plainly delete survey permissions if the survey or user does not exist ***/ $users = User::model()->findAll(); $uids = array(); foreach ($users as $user) { $uids[] = $user['uid']; } $criteria = new CDbCriteria(); $criteria->addNotInCondition('uid', $uids, 'OR'); $surveys = Survey::model()->findAll(); $sids = array(); foreach ($surveys as $survey) { $sids[] = $survey['sid']; } $criteria->addNotInCondition('sid', $sids, 'OR'); Survey_permissions::model()->deleteAll($criteria); // Deactivate surveys that have a missing response table foreach ($surveys as $survey) { if ($survey['active'] == 'Y' && !tableExists("{{survey_{$survey['sid']}}}")) { Survey::model()->updateByPk($survey['sid'], array('active' => 'N')); } } // Fix subquestions fixSubquestions(); /*** Check for active survey tables with missing survey entry and rename them ***/ $sDBPrefix = Yii::app()->db->tablePrefix; $sQuery = dbSelectTablesLike('{{survey}}\\_%'); $aResult = dbQueryOrFalse($sQuery) or safeDie("Couldn't get list of conditions from database<br />{$sQuery}<br />"); foreach ($aResult->readAll() as $aRow) { $sTableName = substr(reset($aRow), strlen($sDBPrefix)); if ($sTableName == 'survey_permissions' || $sTableName == 'survey_links' || $sTableName == 'survey_url_parameters') { continue; } $aTableName = explode('_', $sTableName); if (isset($aTableName[1]) && ctype_digit($aTableName[1])) { $iSurveyID = $aTableName[1]; if (!in_array($iSurveyID, $sids)) { $sDate = date('YmdHis') . rand(1, 1000); $sOldTable = "survey_{$iSurveyID}"; $sNewTable = "old_survey_{$iSurveyID}_{$sDate}"; try { $deactivateresult = Yii::app()->db->createCommand()->renameTable("{{{$sOldTable}}}", "{{{$sNewTable}}}"); } catch (CDbException $e) { die('Couldn\'t make backup of the survey table. Please try again. The database reported the following error:<br />' . htmlspecialchars($e) . '<br />'); } } } } /*** Check for active token tables with missing survey entry ***/ $aResult = dbQueryOrFalse(dbSelectTablesLike('{{tokens}}\\_%')) or safeDie("Couldn't get list of conditions from database<br />{$sQuery}<br />"); foreach ($aResult->readAll() as $aRow) { $sTableName = substr(reset($aRow), strlen($sDBPrefix)); $iSurveyID = substr($sTableName, strpos($sTableName, '_') + 1); if (!in_array($iSurveyID, $sids)) { $sDate = date('YmdHis') . rand(1, 1000); $sOldTable = "tokens_{$iSurveyID}"; $sNewTable = "old_tokens_{$iSurveyID}_{$sDate}"; try { $deactivateresult = Yii::app()->db->createCommand()->renameTable("{{{$sOldTable}}}", "{{{$sNewTable}}}"); } catch (CDbException $e) { die('Couldn\'t make backup of the survey table. Please try again. The database reported the following error:<br />' . htmlspecialchars($e) . '<br />'); } } } /**********************************************************************/ /* Check conditions */ /**********************************************************************/ // TMSW Conditions->Relevance: Replace this with analysis of relevance $conditions = Conditions::model()->findAll(); if (Conditions::model()->hasErrors()) { safeDie(Conditions::model()->getError()); } $okQuestion = array(); foreach ($conditions as $condition) { if ($condition['cqid'] != 0) { // skip case with cqid=0 for codnitions on {TOKEN:EMAIL} for instance if (!array_key_exists($condition['cqid'], $okQuestion)) { $iRowCount = Questions::model()->countByAttributes(array('qid' => $condition['cqid'])); if (Questions::model()->hasErrors()) { safeDie(Questions::model()->getError()); } if (!$iRowCount) { $aDelete['conditions'][] = array('cid' => $condition['cid'], 'reason' => $clang->gT('No matching CQID')); } else { $okQuestion[$condition['cqid']] = $condition['cqid']; } } } if ($condition['cfieldname']) { if (preg_match('/^\\+{0,1}[0-9]+X[0-9]+X*$/', $condition['cfieldname'])) { // only if cfieldname isn't Tag such as {TOKEN:EMAIL} or any other token list($surveyid, $gid, $rest) = explode('X', $condition['cfieldname']); $iRowCount = count(Groups::model()->findAllByAttributes(array('gid' => $gid))); if (Groups::model()->hasErrors()) { safeDie(Groups::model()->getError()); } if (!$iRowCount) { $aDelete['conditions'][] = array('cid' => $condition['cid'], 'reason' => $clang->gT('No matching CFIELDNAME group!') . " ({$gid}) ({$condition['cfieldname']})"); } } } elseif (!$condition['cfieldname']) { $aDelete['conditions'][] = array('cid' => $condition['cid'], 'reason' => $clang->gT('No CFIELDNAME field set!') . " ({$condition['cfieldname']})"); } } /**********************************************************************/ /* Check question attributes */ /**********************************************************************/ $question_attributes = Question_attributes::model()->findAllBySql('select qid from {{question_attributes}} where qid not in (select qid from {{questions}})'); if (Question_attributes::model()->hasErrors()) { safeDie(Question_attributes::model()->getError()); } foreach ($question_attributes as $question_attribute) { $aDelete['questionattributes'][] = array('qid' => $question_attribute['qid']); } // foreach /**********************************************************************/ /* Check default values */ /**********************************************************************/ $questions = Questions::model()->findAll(); if (Questions::model()->hasErrors()) { safeDie(Questions::model()->getError()); } $qids = array(); foreach ($questions as $question) { $qids[] = $question['qid']; } $criteria = new CDbCriteria(); $criteria->addNotInCondition('qid', $qids); $aDelete['defaultvalues'] = count(Defaultvalues::model()->findAll($criteria)); if (Defaultvalues::model()->hasErrors()) { safeDie(Defaultvalues::model()->getError()); } /**********************************************************************/ /* Check quotas */ /**********************************************************************/ $surveys = Survey::model()->findAll(); if (Survey::model()->hasErrors()) { safeDie(Survey::model()->getError()); } $sids = array(); foreach ($surveys as $survey) { $sids[] = $survey['sid']; } $criteria = new CDbCriteria(); $criteria->addNotInCondition('sid', $sids); $aDelete['quotas'] = count(Quota::model()->findAll($criteria)); if (Quota::model()->hasErrors()) { safeDie(Quota::model()->getError()); } /**********************************************************************/ /* Check quota languagesettings */ /**********************************************************************/ $quotas = Quota::model()->findAll(); if (Quota::model()->hasErrors()) { safeDie(Quota::model()->getError()); } $ids = array(); foreach ($quotas as $quota) { $ids[] = $quota['id']; } $criteria = new CDbCriteria(); $criteria->addNotInCondition('quotals_quota_id', $ids); $aDelete['quotals'] = count(Quota_languagesettings::model()->findAll($criteria)); if (Quota_languagesettings::model()->hasErrors()) { safeDie(Quota_languagesettings::model()->getError()); } /**********************************************************************/ /* Check quota members */ /**********************************************************************/ $quotas = Quota::model()->findAll(); $quota_ids = array(); foreach ($quotas as $quota) { $quota_ids[] = $quota['id']; } $criteria = new CDbCriteria(); $criteria->addNotInCondition('quota_id', $quota_ids); $questions = Questions::model()->findAll(); $qids = array(); foreach ($questions as $question) { $qids[] = $question['qid']; } $criteria->addNotInCondition('qid', $qids, 'OR'); $surveys = Survey::model()->findAll(); $sids = array(); foreach ($surveys as $survey) { $sids[] = $survey['sid']; } $criteria->addNotInCondition('sid', $sids, 'OR'); $aDelete['quotamembers'] = count(Quota_members::model()->findAll($criteria)); if (Quota_members::model()->hasErrors()) { safeDie(Quota_members::model()->getError()); } /**********************************************************************/ /* Check assessments */ /**********************************************************************/ $criteria = new CDbCriteria(); $criteria->compare('scope', 'T'); $assessments = Assessment::model()->findAll($criteria); if (Assessment::model()->hasErrors()) { safeDie(Assessment::model()->getError()); } foreach ($assessments as $assessment) { $iAssessmentCount = count(Survey::model()->findAllByPk($assessment['sid'])); if (Survey::model()->hasErrors()) { safeDie(Survey::model()->getError()); } if (!$iAssessmentCount) { $aDelete['assessments'][] = array('id' => $assessment['id'], 'assessment' => $assessment['name'], 'reason' => $clang->gT('No matching survey')); } } $criteria = new CDbCriteria(); $criteria->compare('scope', 'G'); $assessments = Assessment::model()->findAll($criteria); if (Assessment::model()->hasErrors()) { safeDie(Assessment::model()->getError()); } foreach ($assessments as $assessment) { $iAssessmentCount = count(Groups::model()->findAllByPk(array('gid' => $assessment['gid'], 'language' => $assessment['language']))); if (Groups::model()->hasErrors()) { safeDie(Groups::model()->getError()); } if (!$iAssessmentCount) { $aDelete['assessments'][] = array('id' => $assessment['id'], 'assessment' => $assessment['name'], 'reason' => $clang->gT('No matching group')); } } /**********************************************************************/ /* Check answers */ /**********************************************************************/ $answers = Answers::model()->findAll(); if (Answers::model()->hasErrors()) { safeDie(Answers::model()->getError()); } $okQuestion = array(); foreach ($answers as $answer) { if (!array_key_exists($answer['qid'], $okQuestion)) { $iAnswerCount = Questions::model()->countByAttributes(array('qid' => $answer['qid'])); if (Questions::model()->hasErrors()) { safeDie(Questions::model()->getError()); } if (!$iAnswerCount) { $aDelete['answers'][] = array('qid' => $answer['qid'], 'code' => $answer['code'], 'reason' => $clang->gT('No matching question')); } else { $okQuestion[$answer['qid']] = $answer['qid']; } } } /***************************************************************************/ /* Check survey languagesettings and restore them if they don't exist */ /***************************************************************************/ $surveys = Survey::model()->findAll(); foreach ($surveys as $survey) { $aLanguages = $survey->additionalLanguages; $aLanguages[] = $survey->language; foreach ($aLanguages as $langname) { if ($langname) { $oLanguageSettings = Surveys_languagesettings::model()->find('surveyls_survey_id=:surveyid AND surveyls_language=:langname', array(':surveyid' => $survey->sid, ':langname' => $langname)); if (!$oLanguageSettings) { $oLanguageSettings = new Surveys_languagesettings(); $languagedetails = getLanguageDetails($langname); $insertdata = array('surveyls_survey_id' => $survey->sid, 'surveyls_language' => $langname, 'surveyls_title' => '', 'surveyls_dateformat' => $languagedetails['dateformat']); foreach ($insertdata as $k => $v) { $oLanguageSettings->{$k} = $v; } $usresult = $oLanguageSettings->save(); } } } } /**********************************************************************/ /* Check survey language settings */ /**********************************************************************/ $surveys = Survey::model()->findAll(); if (Survey::model()->hasErrors()) { safeDie(Survey::model()->getError()); } $sids = array(); foreach ($surveys as $survey) { $sids[] = $survey['sid']; } $criteria = new CDbCriteria(); $criteria->addNotInCondition('surveyls_survey_id', $sids); $surveys_languagesettings = Surveys_languagesettings::model()->findAll($criteria); if (Surveys_languagesettings::model()->hasErrors()) { safeDie(Surveys_languagesettings::model()->getError()); } foreach ($surveys_languagesettings as $surveys_languagesetting) { $aDelete['surveylanguagesettings'][] = array('slid' => $surveys_languagesetting['surveyls_survey_id'], 'reason' => $clang->gT('The related survey is missing.')); } /**********************************************************************/ /* Check questions */ /**********************************************************************/ $questions = Questions::model()->findAll(); if (Questions::model()->hasErrors()) { safeDie(Questions::model()->getError()); } $groups = Groups::model()->findAll(); if (Groups::model()->hasErrors()) { safeDie(Groups::model()->getError()); } $gids = array(); foreach ($groups as $group) { $gids[] = $group['gid']; } foreach ($questions as $question) { //Make sure the group exists if (!in_array($question['gid'], $gids)) { $aDelete['questions'][] = array('qid' => $question['qid'], 'reason' => $clang->gT('No matching group') . " ({$question['gid']})"); } //Make sure survey exists if (!in_array($question['sid'], $sids)) { $aDelete['questions'][] = array('qid' => $question['qid'], 'reason' => $clang->gT('There is no matching survey.') . " ({$question['sid']})"); } } /**********************************************************************/ /* Check groups */ /**********************************************************************/ $surveys = Survey::model()->findAll(); if (Survey::model()->hasErrors()) { safeDie(Survey::model()->getError()); } $sids = array(); foreach ($surveys as $survey) { $sids[] = $survey['sid']; } $criteria = new CDbCriteria(); $criteria->addNotInCondition('sid', $sids); $groups = Groups::model()->findAll($criteria); foreach ($groups as $group) { $aDelete['groups'][] = array('gid' => $group['gid'], 'reason' => $clang->gT('There is no matching survey.') . ' SID:' . $group['sid']); } /**********************************************************************/ /* Check old survey tables */ /**********************************************************************/ //1: Get list of 'old_survey' tables and extract the survey id //2: Check if that survey id still exists //3: If it doesn't offer it for deletion $sQuery = dbSelectTablesLike('{{old_survey}}%'); $aResult = dbQueryOrFalse($sQuery) or safeDie("Couldn't get list of conditions from database<br />{$sQuery}<br />"); $aTables = $aResult->readAll(); $aOldSIDs = array(); $aSIDs = array(); foreach ($aTables as $sTable) { $sTable = reset($sTable); list($sOldText, $SurveyText, $iSurveyID, $sDate) = explode('_', substr($sTable, strlen($sDBPrefix))); $aOldSIDs[] = $iSurveyID; $aFullOldSIDs[$iSurveyID][] = $sTable; } $aOldSIDs = array_unique($aOldSIDs); //$sQuery = 'SELECT sid FROM {{surveys}} ORDER BY sid'; //$oResult = dbExecuteAssoc($sQuery) or safeDie('Couldn\'t get unique survey ids'); $surveys = Survey::model()->findAll(); if (Survey::model()->hasErrors()) { safeDie(Survey::model()->getError()); } $aSIDs = array(); foreach ($surveys as $survey) { $aSIDs[] = $survey['sid']; } foreach ($aOldSIDs as $iOldSID) { if (!in_array($iOldSID, $aSIDs)) { foreach ($aFullOldSIDs[$iOldSID] as $sTableName) { $aDelete['orphansurveytables'][] = $sTableName; } } else { foreach ($aFullOldSIDs[$iOldSID] as $sTableName) { $aTableParts = explode('_', substr($sTableName, strlen($sDBPrefix))); if (count($aTableParts) == 4) { $sOldText = $aTableParts[0]; $SurveyText = $aTableParts[1]; $iSurveyID = $aTableParts[2]; $sDateTime = $aTableParts[3]; $sType = $clang->gT('responses'); } elseif (count($aTableParts) == 5) { //This is a timings table ( $sOldText = $aTableParts[0]; $SurveyText = $aTableParts[1]; $iSurveyID = $aTableParts[2]; $sDateTime = $aTableParts[4]; $sType = $clang->gT('timings'); } $iYear = substr($sDateTime, 0, 4); $iMonth = substr($sDateTime, 4, 2); $iDay = substr($sDateTime, 6, 2); $iHour = substr($sDateTime, 8, 2); $iMinute = substr($sDateTime, 10, 2); $sDate = date('d M Y H:i', mktime($iHour, $iMinute, 0, $iMonth, $iDay, $iYear)); $sQuery = 'SELECT count(*) as recordcount FROM ' . $sTableName; $aFirstRow = Yii::app()->db->createCommand($sQuery)->queryRow(); if ($aFirstRow['recordcount'] == 0) { // empty table - so add it to immediate deletion $aDelete['orphansurveytables'][] = $sTableName; } else { $aOldSurveyTableAsk[] = array('table' => $sTableName, 'details' => sprintf($clang->gT('Survey ID %d saved at %s containing %d record(s) (%s)'), $iSurveyID, $sDate, $aFirstRow['recordcount'], $sType)); } } } } /**********************************************************************/ /* CHECK OLD TOKEN TABLES */ /**********************************************************************/ //1: Get list of 'old_token' tables and extract the survey id //2: Check if that survey id still exists //3: If it doesn't offer it for deletion $aResult = dbQueryOrFalse(dbSelectTablesLike('{{old_token}}%')) or safeDie("Couldn't get list of conditions from database<br />{$sQuery}<br />"); $aTables = $aResult->readAll(); $aOldTokenSIDs = array(); $aTokenSIDs = array(); $aFullOldTokenSIDs = array(); foreach ($aTables as $sTable) { $sTable = reset($sTable); list($sOldText, $SurveyText, $iSurveyID, $sDateTime) = explode('_', substr($sTable, strlen($sDBPrefix))); $aTokenSIDs[] = $iSurveyID; $aFullOldTokenSIDs[$iSurveyID][] = $sTable; } $aOldTokenSIDs = array_unique($aTokenSIDs); $surveys = Survey::model()->findAll(); if (Survey::model()->hasErrors()) { safeDie(Survey::model()->getError()); } $aSIDs = array(); foreach ($surveys as $survey) { $aSIDs[] = $survey['sid']; } foreach ($aOldTokenSIDs as $iOldTokenSID) { if (!in_array($iOldTokenSID, $aOldTokenSIDs)) { foreach ($aFullOldTokenSIDs[$iOldTokenSID] as $sTableName) { $aDelete['orphantokentables'][] = $sTableName; } } else { foreach ($aFullOldTokenSIDs[$iOldTokenSID] as $sTableName) { list($sOldText, $sTokensText, $iSurveyID, $sDateTime) = explode('_', substr($sTableName, strlen($sDBPrefix))); $iYear = substr($sDateTime, 0, 4); $iMonth = substr($sDateTime, 4, 2); $iDay = substr($sDateTime, 6, 2); $iHour = substr($sDateTime, 8, 2); $iMinute = substr($sDateTime, 10, 2); $sDate = date('D, d M Y h:i a', mktime($iHour, $iMinute, 0, $iMonth, $iDay, $iYear)); $sQuery = 'SELECT count(*) as recordcount FROM ' . $sTableName; $aFirstRow = Yii::app()->db->createCommand($sQuery)->queryRow(); if ($aFirstRow['recordcount'] == 0) { // empty table - so add it to immediate deletion $aDelete['orphantokentables'][] = $sTableName; } else { $aOldTokenTableAsk[] = array('table' => $sTableName, 'details' => sprintf($clang->gT('Survey ID %d saved at %s containing %d record(s)'), $iSurveyID, $sDate, $aFirstRow['recordcount'])); } } } } if ($aDelete['defaultvalues'] == 0 && $aDelete['quotamembers'] == 0 && $aDelete['quotas'] == 0 && $aDelete['quotals'] == 0 && count($aDelete) == 4) { $aDelete['integrityok'] = true; } else { $aDelete['integrityok'] = false; } if (!isset($aOldTokenTableAsk) && !isset($aOldSurveyTableAsk)) { $aDelete['redundancyok'] = true; } else { $aDelete['redundancyok'] = false; $aDelete['redundanttokentables'] = array(); $aDelete['redundantsurveytables'] = array(); if (isset($aOldTokenTableAsk)) { $aDelete['redundanttokentables'] = $aOldTokenTableAsk; } if (isset($aOldSurveyTableAsk)) { $aDelete['redundantsurveytables'] = $aOldSurveyTableAsk; } } /**********************************************************************/ /* CHECK CPDB SURVEY_LINKS TABLE FOR REDUNDENT TOKEN TABLES */ /**********************************************************************/ //1: Get distinct list of survey_link survey ids, check if tokens // table still exists for each one, and remove if not /* TODO */ /**********************************************************************/ /* CHECK CPDB SURVEY_LINKS TABLE FOR REDUNDENT TOKEN ENTRIES */ /**********************************************************************/ //1: For each survey_link, see if the matching entry still exists in // the token table and remove if it doesn't. /* TODO */ return $aDelete; }
/** * Sends email to tokens - invitation and reminders * * @param mixed $iSurveyID * @param array $aResultTokens * @param string $sType type of notification invite|remind * @return array of results */ function emailTokens($iSurveyID, $aResultTokens, $sType) { Yii::app()->loadHelper('common'); $oSurvey = Survey::model()->findByPk($iSurveyID); if (getEmailFormat($iSurveyID) == 'html') { $bHtml = true; } else { $bHtml = false; } $attributes = array_keys(getTokenFieldsAndNames($iSurveyID)); $oSurveyLocale = Surveys_languagesettings::model()->findAllByAttributes(array('surveyls_survey_id' => $iSurveyID)); $oTokens = Tokens_dynamic::model($iSurveyID); $aSurveyLangs = $oSurvey->additionalLanguages; array_unshift($aSurveyLangs, $oSurvey->language); //Convert result to associative array to minimize SurveyLocale access attempts foreach ($oSurveyLocale as $rows) { $oTempObject = array(); foreach ($rows as $k => $v) { $oTempObject[$k] = $v; } $aSurveyLocaleData[$rows['surveyls_language']] = $oTempObject; } foreach ($aResultTokens as $aTokenRow) { //Select language $aTokenRow['language'] = trim($aTokenRow['language']); $found = array_search($aTokenRow['language'], $aSurveyLangs); if ($aTokenRow['language'] == '' || $found == false) { $aTokenRow['language'] = $oSurvey['language']; } $sTokenLanguage = $aTokenRow['language']; //Build recipient $to = array(); $aEmailaddresses = explode(';', $aTokenRow['email']); foreach ($aEmailaddresses as $sEmailaddress) { $to[] = $aTokenRow['firstname'] . " " . $aTokenRow['lastname'] . " <{$sEmailaddress}>"; } //Populate attributes $fieldsarray["{SURVEYNAME}"] = $aSurveyLocaleData[$sTokenLanguage]['surveyls_title']; if ($fieldsarray["{SURVEYNAME}"] == '') { $fieldsarray["{SURVEYNAME}"] = $aSurveyLocaleData[$oSurvey['language']]['surveyls_title']; } $fieldsarray["{SURVEYDESCRIPTION}"] = $aSurveyLocaleData[$sTokenLanguage]['surveyls_description']; if ($fieldsarray["{SURVEYDESCRIPTION}"] == '') { $fieldsarray["{SURVEYDESCRIPTION}"] = $aSurveyLocaleData[$oSurvey['language']]['surveyls_description']; } $fieldsarray["{ADMINNAME}"] = $oSurvey['admin']; $fieldsarray["{ADMINEMAIL}"] = $oSurvey['adminemail']; $from = $fieldsarray["{ADMINEMAIL}"]; if ($from == '') { $from = Yii::app()->getConfig('siteadminemail'); } foreach ($attributes as $attributefield) { $fieldsarray['{' . strtoupper($attributefield) . '}'] = $aTokenRow[$attributefield]; $fieldsarray['{TOKEN:' . strtoupper($attributefield) . '}'] = $aTokenRow[$attributefield]; } //create urls $fieldsarray["{OPTOUTURL}"] = Yii::app()->getController()->createAbsoluteUrl("/optout/tokens/langcode/" . trim($aTokenRow['language']) . "/surveyid/{$iSurveyID}/token/{$aTokenRow['token']}"); $fieldsarray["{OPTINURL}"] = Yii::app()->getController()->createAbsoluteUrl("/optin/tokens/langcode/" . trim($aTokenRow['language']) . "/surveyid/{$iSurveyID}/token/{$aTokenRow['token']}"); $fieldsarray["{SURVEYURL}"] = Yii::app()->getController()->createAbsoluteUrl("/survey/index/sid/{$iSurveyID}/token/{$aTokenRow['token']}/lang/" . trim($aTokenRow['language']) . "/"); if ($bEmail == true) { foreach (array('OPTOUT', 'OPTIN', 'SURVEY') as $key) { $url = $fieldsarray["{{$key}URL}"]; $fieldsarray["{{$key}URL}"] = "<a href='{$url}'>" . htmlspecialchars($url) . '</a>'; if ($key == 'SURVEY') { $barebone_link = $url; } } } //mail headers $customheaders = array('1' => "X-surveyid: " . $iSurveyID, '2' => "X-tokenid: " . $fieldsarray["{TOKEN}"]); global $maildebug; //choose appriopriate email message if ($sType == 'invite') { $sSubject = $aSurveyLocaleData[$sTokenLanguage]['surveyls_email_invite_subj']; $sMessage = $aSurveyLocaleData[$sTokenLanguage]['surveyls_email_invite']; } else { $sSubject = $aSurveyLocaleData[$sTokenLanguage]['surveyls_email_remind_subj']; $sMessage = $aSurveyLocaleData[$sTokenLanguage]['surveyls_email_remind']; } $modsubject = Replacefields($sSubject, $fieldsarray); $modmessage = Replacefields($sMessage, $fieldsarray); if (isset($barebone_link)) { $modsubject = str_replace("@@SURVEYURL@@", $barebone_link, $modsubject); $modmessage = str_replace("@@SURVEYURL@@", $barebone_link, $modmessage); } if (isset($aTokenRow['validfrom']) && trim($aTokenRow['validfrom']) != '' && convertDateTimeFormat($aTokenRow['validfrom'], 'Y-m-d H:i:s', 'U') * 1 > date('U') * 1) { $aResult[$aTokenRow['tid']] = array('name' => $fieldsarray["{FIRSTNAME}"] . " " . $fieldsarray["{LASTNAME}"], 'email' => $fieldsarray["{EMAIL}"], 'status' => 'fail', 'error' => 'Token not valid yet'); } elseif (isset($aTokenRow['validuntil']) && trim($aTokenRow['validuntil']) != '' && convertDateTimeFormat($aTokenRow['validuntil'], 'Y-m-d H:i:s', 'U') * 1 < date('U') * 1) { $aResult[$aTokenRow['tid']] = array('name' => $fieldsarray["{FIRSTNAME}"] . " " . $fieldsarray["{LASTNAME}"], 'email' => $fieldsarray["{EMAIL}"], 'status' => 'fail', 'error' => 'Token not valid anymore'); } else { if (SendEmailMessage($modmessage, $modsubject, $to, $from, Yii::app()->getConfig("sitename"), $bHtml, getBounceEmail($iSurveyID), null, $customheaders)) { $aResult[$aTokenRow['tid']] = array('name' => $fieldsarray["{FIRSTNAME}"] . " " . $fieldsarray["{LASTNAME}"], 'email' => $fieldsarray["{EMAIL}"], 'status' => 'OK'); if ($sType == 'invite') { $oTokens->updateByPk($aTokenRow['tid'], array('sent' => dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()->getConfig("timeadjust")))); } if ($sType == 'remind') { $iRCount = $oTokens->findByPk($aTokenRow['tid'])->remindercount + 1; $oTokens->updateByPk($aTokenRow['tid'], array('remindersent' => dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i", Yii::app()->getConfig("timeadjust")))); $oTokens->updateByPk($aTokenRow['tid'], array('remindercount' => $iRCount)); } } else { $aResult[$aTokenRow['tid']] = array('name' => $fieldsarray["{FIRSTNAME}"] . " " . $fieldsarray["{LASTNAME}"], 'email' => $fieldsarray["{EMAIL}"], 'status' => 'fail', 'error' => $maildebug); } } unset($fieldsarray); } return $aResult; }
private function query($type, $action, $iSurveyID, $tolang, $baselang, $id1 = "", $id2 = "", $new = "") { $amTypeOptions = array(); switch ($action) { case "queryto": $baselang = $tolang; case "querybase": switch ($type) { case 'title': case 'description': case 'welcome': case 'end': case 'emailinvite': case 'emailinvitebody': case 'emailreminder': case 'emailreminderbody': case 'emailconfirmation': case 'emailconfirmationbody': case 'emailregistration': case 'emailregistrationbody': case 'email_confirm': case 'email_confirmbody': return Surveys_languagesettings::model()->findAllByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $baselang)); case 'group': case 'group_desc': return Groups::model()->findAllByAttributes(array('sid' => $iSurveyID, 'language' => $baselang), array('order' => 'gid')); case 'question': case 'question_help': return Questions::model()->findAllByAttributes(array('sid' => $iSurveyID, 'language' => $baselang, 'parent_qid' => 0), array('order' => 'question_order, scale_id')); case 'subquestion': return Questions::model()->with('parents', 'groups')->findAllByAttributes(array('sid' => $iSurveyID, 'language' => $baselang), array('order' => 'groups.group_order, parents.question_order, t.scale_id, t.question_order', 'condition' => 'parents.language=:baselang1 AND groups.language=:baselang2 AND t.parent_qid>0', 'params' => array(':baselang1' => $baselang, ':baselang2' => $baselang))); case 'answer': return Answers::model()->with('questions', 'groups')->findAllByAttributes(array('language' => $baselang), array('order' => 'groups.group_order, questions.question_order, t.scale_id, t.sortorder', 'condition' => 'questions.sid=:sid AND questions.language=:baselang1 AND groups.language=:baselang2', 'params' => array(':baselang1' => $baselang, ':baselang2' => $baselang, ':sid' => $iSurveyID))); } case "queryupdate": switch ($type) { case 'title': return Surveys_languagesettings::model()->updateByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $tolang), array('surveyls_title' => $new)); case 'description': return Surveys_languagesettings::model()->updateByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $tolang), array('surveyls_description' => $new)); case 'welcome': return Surveys_languagesettings::model()->updateByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $tolang), array('surveyls_welcometext' => $new)); case 'end': return Surveys_languagesettings::model()->updateByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $tolang), array('surveyls_endtext' => $new)); case 'emailinvite': return Surveys_languagesettings::model()->updateByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $tolang), array('surveyls_email_invite_subj' => $new)); case 'emailinvitebody': return Surveys_languagesettings::model()->updateByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $tolang), array('surveyls_email_invite' => $new)); case 'emailreminder': return Surveys_languagesettings::model()->updateByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $tolang), array('surveyls_email_remind_subj' => $new)); case 'emailreminderbody': return Surveys_languagesettings::model()->updateByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $tolang), array('surveyls_email_remind' => $new)); case 'emailconfirmation': return Surveys_languagesettings::model()->updateByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $tolang), array('surveyls_email_confirm_subj' => $new)); case 'emailconfirmationbody': return Surveys_languagesettings::model()->updateByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $tolang), array('surveyls_email_confirm' => $new)); case 'emailregistration': return Surveys_languagesettings::model()->updateByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $tolang), array('surveyls_email_register_subj' => $new)); case 'emailregistrationbody': return Surveys_languagesettings::model()->updateByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $tolang), array('surveyls_email_register' => $new)); case 'email_confirm': return Surveys_languagesettings::model()->updateByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $tolang), array('surveyls_email_confirm_subject' => $new)); case 'email_confirmbody': return Surveys_languagesettings::model()->updateByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $tolang), array('surveyls_email_confirm' => $new)); case 'group': return Groups::model()->updateByPk(array('gid' => $id1, 'language' => $tolang), array('group_name' => $new), 'sid=:sid', array(':sid' => $iSurveyID)); case 'group_desc': return Groups::model()->updateByPk(array('gid' => $id1, 'language' => $tolang), array('description' => $new), 'sid=:sid', array(':sid' => $iSurveyID)); case 'question': return Questions::model()->updateByPk(array('qid' => $id1, 'language' => $tolang), array('question' => $new), 'sid=:sid AND parent_qid=0', array(':sid' => $iSurveyID)); case 'question_help': return Questions::model()->updateByPk(array('qid' => $id1, 'language' => $tolang), array('help' => $new), 'sid=:sid AND parent_qid=0', array(':sid' => $iSurveyID)); case 'subquestion': return Questions::model()->updateByPk(array('qid' => $id1, 'language' => $tolang), array('question' => $new), 'sid=:sid', array(':sid' => $iSurveyID)); case 'answer': return Answers::model()->updateByPk(array('qid' => $id1, 'code' => $id2, 'language' => $tolang, 'scale_id' => 0), array('answer' => $new)); // @todo: FIXME for dual scale answer options } } }
function action() { global $surveyid; global $thissurvey, $thisstep; global $clienttoken, $tokensexist, $token; global $clang; $clang = Yii::app()->lang; @ini_set('session.gc_maxlifetime', Yii::app()->getConfig('iSessionExpirationTime')); $this->_loadRequiredHelpersAndLibraries(); $param = $this->_getParameters(func_get_args(), $_POST); $surveyid = $param['sid']; Yii::app()->setConfig('surveyID', $surveyid); $thisstep = $param['thisstep']; $move = $param['move']; $clienttoken = $param['token']; $standardtemplaterootdir = Yii::app()->getConfig('standardtemplaterootdir'); if (is_null($thissurvey) && !is_null($surveyid)) { $thissurvey = getSurveyInfo($surveyid); } // unused vars in this method (used in methods using compacted method vars) @($loadname = $param['loadname']); @($loadpass = $param['loadpass']); $sitename = Yii::app()->getConfig('sitename'); if (isset($param['newtest']) && $param['newtest'] == "Y") { killSurveySession($surveyid); } $surveyExists = $surveyid && Survey::model()->findByPk($surveyid); $isSurveyActive = $surveyExists && Survey::model()->findByPk($surveyid)->active == "Y"; // collect all data in this method to pass on later $redata = compact(array_keys(get_defined_vars())); $clang = $this->_loadLimesurveyLang($surveyid); if ($this->_isClientTokenDifferentFromSessionToken($clienttoken, $surveyid)) { $asMessage = array($clang->gT('Token mismatch'), $clang->gT('The token you provided doesn\'t match the one in your session.'), $clang->gT('Please wait to begin with a new session.')); $this->_createNewUserSessionAndRedirect($surveyid, $redata, __LINE__, $asMessage); } if ($this->_isSurveyFinished($surveyid)) { $asMessage = array($clang->gT('Previous session is set to be finished.'), $clang->gT('Your browser reports that it was used previously to answer this survey. We are resetting the session so that you can start from the beginning.'), $clang->gT('Please wait to begin with a new session.')); $this->_createNewUserSessionAndRedirect($surveyid, $redata, __LINE__, $asMessage); } $previewmode = false; if (isset($param['action']) && in_array($param['action'], array('previewgroup', 'previewquestion'))) { if (!$this->_canUserPreviewSurvey($surveyid)) { $asMessage = array($clang->gT('Error'), $clang->gT("We are sorry but you don't have permissions to do this.")); $this->_niceExit($redata, __LINE__, null, $asMessage); } else { if (intval($param['qid']) && $param['action'] == 'previewquestion') { $previewmode = 'question'; } if (intval($param['gid']) && $param['action'] == 'previewgroup') { $previewmode = 'group'; } } } if ($this->_surveyCantBeViewedWithCurrentPreviewAccess($surveyid, $isSurveyActive, $surveyExists)) { $bPreviewRight = $this->_userHasPreviewAccessSession($surveyid); if ($bPreviewRight === false) { $asMessage = array($clang->gT("Error"), $clang->gT("We are sorry but you don't have permissions to do this."), sprintf($clang->gT("Please contact %s ( %s ) for further assistance."), $thissurvey['adminname'], $thissurvey['adminemail'])); $this->_niceExit($redata, __LINE__, null, $asMessage); } } // TODO can this be moved to the top? // (Used to be global, used in ExpressionManager, merged into amVars. If not filled in === '') // can this be added in the first computation of $redata? if (isset($_SESSION['survey_' . $surveyid]['srid'])) { $saved_id = $_SESSION['survey_' . $surveyid]['srid']; } // recompute $redata since $saved_id used to be a global $redata = compact(array_keys(get_defined_vars())); /*if ( $this->_didSessionTimeOut() ) { // @TODO is this still required ? $asMessage = array( $clang->gT("Error"), $clang->gT("We are sorry but your session has expired."), $clang->gT("Either you have been inactive for too long, you have cookies disabled for your browser, or there were problems with your connection."), sprintf($clang->gT("Please contact %s ( %s ) for further assistance."),$thissurvey['adminname'],$thissurvey['adminemail']) ); $this->_niceExit($redata, __LINE__, null, $asMessage); };*/ // Set the language of the survey, either from POST, GET parameter of session var if (!empty($_REQUEST['lang'])) { $sTempLanguage = sanitize_languagecode($_REQUEST['lang']); } elseif (!empty($param['lang'])) { $sTempLanguage = sanitize_languagecode($param['lang']); } elseif (isset($_SESSION['survey_' . $surveyid]['s_lang'])) { $sTempLanguage = $_SESSION['survey_' . $surveyid]['s_lang']; } else { $sTempLanguage = ''; } //CHECK FOR REQUIRED INFORMATION (sid) if ($surveyid && $surveyExists) { LimeExpressionManager::SetSurveyId($surveyid); // must be called early - it clears internal cache if a new survey is being used $clang = SetSurveyLanguage($surveyid, $sTempLanguage); if ($previewmode) { LimeExpressionManager::SetPreviewMode($previewmode); } UpdateGroupList($surveyid, $clang->langcode); // to refresh the language strings in the group list session variable UpdateFieldArray(); // to refresh question titles and question text } else { if (!is_null($param['lang'])) { $sDisplayLanguage = $param['lang']; } else { $sDisplayLanguage = Yii::app()->getConfig('defaultlang'); } $clang = $this->_loadLimesurveyLang($sDisplayLanguage); $languagechanger = makeLanguageChanger($sDisplayLanguage); //Find out if there are any publicly available surveys $query = "SELECT sid, surveyls_title, publicstatistics, language\n FROM {{surveys}}\n INNER JOIN {{surveys_languagesettings}}\n ON ( surveyls_survey_id = sid )\n AND (surveyls_language=language)\n WHERE\n active='Y'\n AND listpublic='Y'\n AND ((expires >= '" . date("Y-m-d H:i") . "') OR (expires is null))\n AND ((startdate <= '" . date("Y-m-d H:i") . "') OR (startdate is null))\n ORDER BY surveyls_title"; $result = dbExecuteAssoc($query, false, true) or safeDie("Could not connect to database. If you try to install LimeSurvey please refer to the <a href='http://docs.limesurvey.org'>installation docs</a> and/or contact the system administrator of this webpage."); //Checked $list = array(); foreach ($result->readAll() as $rows) { # $querylang="SELECT surveyls_title # FROM {{surveys_languagesettings}} # WHERE surveyls_survey_id={$rows['sid']} # AND surveyls_language='{$sDisplayLanguage}'"; # $resultlang=Yii::app()->db->createCommand($querylang)->queryRow(); $resultlang = Surveys_languagesettings::model()->find("surveyls_survey_id=:surveyls_survey_id AND surveyls_language=:surveyls_language", array(':surveyls_survey_id' => intval($rows['sid']), ':surveyls_language' => $sDisplayLanguage)); $langparam = array(); $langtag = ""; if ($resultlang) { $rows['surveyls_title'] = $resultlang->surveyls_title; $langparam = array('lang' => $sDisplayLanguage); } else { $langtag = "lang=\"{$rows['language']}\""; } $link = "<li><a href='" . $this->getController()->createUrl('/survey/index/sid/' . $rows['sid'], $langparam); $link .= "' {$langtag} class='surveytitle'>" . $rows['surveyls_title'] . "</a>\n"; if ($rows['publicstatistics'] == 'Y') { $link .= "<a href='" . $this->getController()->createUrl("/statistics_user/action/surveyid/" . $rows['sid']) . "/language/" . $sDisplayLanguage . "'>(" . $clang->gT('View statistics') . ")</a>"; } $link .= "</li>\n"; $list[] = $link; } //Check for inactive surveys which allow public registration. // TODO add a new template replace {SURVEYREGISTERLIST} ? $squery = "SELECT sid, surveyls_title, publicstatistics, language\n FROM {{surveys}}\n INNER JOIN {{surveys_languagesettings}}\n ON (surveyls_survey_id = sid)\n AND (surveyls_language=language)\n WHERE allowregister='Y'\n AND active='Y'\n AND listpublic='Y'\n AND ((expires >= '" . date("Y-m-d H:i") . "') OR (expires is null))\n AND (startdate >= '" . date("Y-m-d H:i") . "')\n ORDER BY surveyls_title"; $sresult = dbExecuteAssoc($squery) or safeDie("Couldn't execute {$squery}"); $aRows = $sresult->readAll(); if (count($aRows) > 0) { $list[] = "</ul>" . " <div class=\"survey-list-heading\">" . $clang->gT("Following survey(s) are not yet active but you can register for them.") . "</div>" . " <ul>"; // TODO give it to template foreach ($aRows as $rows) { $querylang = "SELECT surveyls_title\n FROM {{surveys_languagesettings}}\n WHERE surveyls_survey_id={$rows['sid']}\n AND surveyls_language='{$sDisplayLanguage}'"; $resultlang = Yii::app()->db->createCommand($querylang)->queryRow(); if ($resultlang['surveyls_title']) { $rows['surveyls_title'] = $resultlang['surveyls_title']; $langtag = ""; } else { $langtag = "lang=\"{$rows['language']}\""; } $link = "<li><a href=\"#\" id='inactivesurvey' onclick = 'sendreq(" . $rows['sid'] . ");' "; //$link = "<li><a href=\"#\" id='inactivesurvey' onclick = 'convertGETtoPOST(".$this->getController()->createUrl('survey/send/')."?sid={$rows['sid']}&)sendreq(".$rows['sid'].",".$rows['startdate'].",".$rows['expires'].");' "; $link .= " {$langtag} class='surveytitle'>" . $rows['surveyls_title'] . "</a>\n"; $link .= "</li><div id='regform'></div>\n"; $list[] = $link; } } if (count($list) < 1) { $list[] = "<li class='surveytitle'>" . $clang->gT("No available surveys") . "</li>"; } if (!$surveyid) { $thissurvey['name'] = Yii::app()->getConfig("sitename"); $nosid = $clang->gT("You have not provided a survey identification number"); } else { $thissurvey['name'] = $clang->gT("The survey identification number is invalid"); $nosid = $clang->gT("The survey identification number is invalid"); } $surveylist = array("nosid" => $nosid, "contact" => sprintf($clang->gT("Please contact %s ( %s ) for further assistance."), Yii::app()->getConfig("siteadminname"), encodeEmail(Yii::app()->getConfig("siteadminemail"))), "listheading" => $clang->gT("The following surveys are available:"), "list" => implode("\n", $list)); $data['thissurvey'] = $thissurvey; //$data['privacy'] = $privacy; $data['surveylist'] = $surveylist; $data['surveyid'] = $surveyid; $data['templatedir'] = getTemplatePath(Yii::app()->getConfig("defaulttemplate")); $data['templateurl'] = getTemplateURL(Yii::app()->getConfig("defaulttemplate")) . "/"; $data['templatename'] = Yii::app()->getConfig("defaulttemplate"); $data['sitename'] = Yii::app()->getConfig("sitename"); $data['languagechanger'] = $languagechanger; //A nice exit sendCacheHeaders(); doHeader(); $this->_printTemplateContent(getTemplatePath(Yii::app()->getConfig("defaulttemplate")) . "/startpage.pstpl", $data, __LINE__); $this->_printTemplateContent(getTemplatePath(Yii::app()->getConfig("defaulttemplate")) . "/surveylist.pstpl", $data, __LINE__); echo '<script type="text/javascript" > function sendreq(surveyid) { $.ajax({ type: "GET", url: "' . $this->getController()->createUrl("/register/ajaxregisterform/surveyid") . '/" + surveyid, }).done(function(msg) { document.getElementById("regform").innerHTML = msg; }); } </script>'; $this->_printTemplateContent(getTemplatePath(Yii::app()->getConfig("defaulttemplate")) . "/endpage.pstpl", $data, __LINE__); doFooter(); exit; } // Get token if (!isset($token)) { $token = $clienttoken; } //GET BASIC INFORMATION ABOUT THIS SURVEY $thissurvey = getSurveyInfo($surveyid, $_SESSION['survey_' . $surveyid]['s_lang']); //SEE IF SURVEY USES TOKENS if ($surveyExists == 1 && tableExists('{{tokens_' . $thissurvey['sid'] . '}}')) { $tokensexist = 1; } else { $tokensexist = 0; unset($_POST['token']); unset($param['token']); unset($token); unset($clienttoken); } //SET THE TEMPLATE DIRECTORY $thistpl = getTemplatePath($thissurvey['templatedir']); $timeadjust = Yii::app()->getConfig("timeadjust"); //MAKE SURE SURVEY HASN'T EXPIRED if ($thissurvey['expiry'] != '' and dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i:s", $timeadjust) > $thissurvey['expiry'] && $thissurvey['active'] != 'N' && !$previewmode) { $redata = compact(array_keys(get_defined_vars())); $asMessage = array($clang->gT("Error"), $clang->gT("This survey is no longer available."), sprintf($clang->gT("Please contact %s ( %s ) for further assistance."), $thissurvey['adminname'], $thissurvey['adminemail'])); $this->_niceExit($redata, __LINE__, $thissurvey['templatedir'], $asMessage); } //MAKE SURE SURVEY IS ALREADY VALID if ($thissurvey['startdate'] != '' and dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i:s", $timeadjust) < $thissurvey['startdate'] && $thissurvey['active'] != 'N' && !$previewmode) { $redata = compact(array_keys(get_defined_vars())); $asMessage = array($clang->gT("Error"), $clang->gT("This survey is not yet started."), sprintf($clang->gT("Please contact %s ( %s ) for further assistance."), $thissurvey['adminname'], $thissurvey['adminemail'])); $this->_niceExit($redata, __LINE__, $thissurvey['templatedir'], $asMessage); } //CHECK FOR PREVIOUSLY COMPLETED COOKIE //If cookies are being used, and this survey has been completed, a cookie called "PHPSID[sid]STATUS" will exist (ie: SID6STATUS) and will have a value of "COMPLETE" $sCookieName = "LS_" . $surveyid . "_STATUS"; if (isset($_COOKIE[$sCookieName]) && $_COOKIE[$sCookieName] == "COMPLETE" && $thissurvey['usecookie'] == "Y" && $tokensexist != 1 && (!isset($param['newtest']) || $param['newtest'] != "Y")) { $redata = compact(array_keys(get_defined_vars())); $asMessage = array($clang->gT("Error"), $clang->gT("You have already completed this survey."), sprintf($clang->gT("Please contact %s ( %s ) for further assistance."), $thissurvey['adminname'], $thissurvey['adminemail'])); $this->_niceExit($redata, __LINE__, $thissurvey['templatedir'], $asMessage); } if (isset($_GET['loadall']) && $_GET['loadall'] == "reload") { if (returnGlobal('loadname') && returnGlobal('loadpass')) { $_POST['loadall'] = "reload"; } } //LOAD SAVED SURVEY if (isset($_POST['loadall']) && $_POST['loadall'] == "reload") { $errormsg = ""; if (!isset($param['loadname']) || $param['loadname'] == null) { $errormsg .= $clang->gT("You did not provide a name") . "<br />\n"; } if (!isset($param['loadpass']) || $param['loadpass'] == null) { $errormsg .= $clang->gT("You did not provide a password") . "<br />\n"; } // if security question answer is incorrect // Not called if scid is set in GET params (when using email save/reload reminder URL) if (function_exists("ImageCreate") && isCaptchaEnabled('saveandloadscreen', $thissurvey['usecaptcha'])) { if ((!isset($_POST['loadsecurity']) || !isset($_SESSION['survey_' . $surveyid]['secanswer']) || $_POST['loadsecurity'] != $_SESSION['survey_' . $surveyid]['secanswer']) && !isset($_GET['scid'])) { $errormsg .= $clang->gT("The answer to the security question is incorrect.") . "<br />\n"; } } // Load session before loading the values from the saved data if (isset($_GET['loadall'])) { buildsurveysession($surveyid); } $_SESSION['survey_' . $surveyid]['holdname'] = $param['loadname']; //Session variable used to load answers every page. $_SESSION['survey_' . $surveyid]['holdpass'] = $param['loadpass']; //Session variable used to load answers every page. if ($errormsg == "") { loadanswers(); } $move = "movenext"; if ($errormsg) { $_POST['loadall'] = $clang->gT("Load unfinished survey"); } } //Allow loading of saved survey if (isset($_POST['loadall']) && $_POST['loadall'] == $clang->gT("Load unfinished survey")) { $redata = compact(array_keys(get_defined_vars())); Yii::import("application.libraries.Load_answers"); $tmp = new Load_answers(); $tmp->run($redata); } //Check if TOKEN is used for EVERY PAGE //This function fixes a bug where users able to submit two surveys/votes //by checking that the token has not been used at each page displayed. // bypass only this check at first page (Step=0) because // this check is done in buildsurveysession and error message // could be more interresting there (takes into accound captcha if used) if ($tokensexist == 1 && isset($token) && $token && isset($_SESSION['survey_' . $surveyid]['step']) && $_SESSION['survey_' . $surveyid]['step'] > 0 && tableExists("tokens_{$surveyid}}}")) { //check if tokens actually haven't been already used $areTokensUsed = usedTokens(trim(strip_tags(returnGlobal('token'))), $surveyid); // check if token actually does exist // check also if it is allowed to change survey after completion if ($thissurvey['alloweditaftercompletion'] == 'Y') { $sQuery = "SELECT * FROM {{tokens_" . $surveyid . "}} WHERE token='" . $token . "'"; } else { $sQuery = "SELECT * FROM {{tokens_" . $surveyid . "}} WHERE token='" . $token . "' AND (completed = 'N' or completed='')"; } $aRow = Yii::app()->db->createCommand($sQuery)->queryRow(); $tokendata = $aRow; if (!$aRow || $areTokensUsed && $thissurvey['alloweditaftercompletion'] != 'Y' && !$previewmode) { sendCacheHeaders(); doHeader(); //TOKEN DOESN'T EXIST OR HAS ALREADY BEEN USED. EXPLAIN PROBLEM AND EXIT $redata = compact(array_keys(get_defined_vars())); $this->_printTemplateContent($thistpl . '/startpage.pstpl', $redata, __LINE__); $this->_printTemplateContent($thistpl . '/survey.pstpl', $redata, __LINE__); $asMessage = array(null, $clang->gT("This is a controlled survey. You need a valid token to participate."), sprintf($clang->gT("For further information please contact %s"), $thissurvey['adminname'] . " (<a href='mailto:{$thissurvey['adminemail']}'>" . "{$thissurvey['adminemail']}</a>)")); $this->_niceExit($redata, __LINE__, $thistpl, $asMessage, true); } } if ($tokensexist == 1 && isset($token) && $token && tableExists("{{tokens_" . $surveyid . "}}") && !$previewmode) { // check also if it is allowed to change survey after completion if ($thissurvey['alloweditaftercompletion'] == 'Y') { $tkquery = "SELECT * FROM {{tokens_" . $surveyid . "}} WHERE token='" . $token . "'"; } else { $tkquery = "SELECT * FROM {{tokens_" . $surveyid . "}} WHERE token='" . $token . "' AND (completed = 'N' or completed='')"; } $tkresult = dbExecuteAssoc($tkquery); //Checked $tokendata = $tkresult->read(); $tkresult->close(); //Close the result in case there are more result rows, we are only interested in one and don't want unbuffered query errors if (isset($tokendata['validfrom']) && (trim($tokendata['validfrom']) != '' && $tokendata['validfrom'] > dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i:s", $timeadjust)) || isset($tokendata['validuntil']) && (trim($tokendata['validuntil']) != '' && $tokendata['validuntil'] < dateShift(date("Y-m-d H:i:s"), "Y-m-d H:i:s", $timeadjust))) { sendCacheHeaders(); doHeader(); //TOKEN DOESN'T EXIST OR HAS ALREADY BEEN USED. EXPLAIN PROBLEM AND EXIT $redata = compact(array_keys(get_defined_vars())); $this->_printTemplateContent($thistpl . '/startpage.pstpl', $redata, __LINE__); $this->_printTemplateContent($thistpl . '/survey.pstpl', $redata, __LINE__); $asMessage = array(null, $clang->gT("We are sorry but you are not allowed to enter this survey."), $clang->gT("Your token seems to be valid but can be used only during a certain time period."), sprintf($clang->gT("For further information please contact %s"), $thissurvey['adminname'] . " (<a href='mailto:{$thissurvey['adminemail']}'>" . "{$thissurvey['adminemail']}</a>)")); $this->_niceExit($redata, __LINE__, $thistpl, $asMessage, true); } } //Clear session and remove the incomplete response if requested. if (isset($move) && $move == "clearall") { // delete the response but only if not already completed $s_lang = $_SESSION['survey_' . $surveyid]['s_lang']; if (isset($_SESSION['survey_' . $surveyid]['srid']) && !Survey_dynamic::model($surveyid)->isCompleted($_SESSION['survey_' . $surveyid]['srid'])) { // delete the response but only if not already completed $result = dbExecuteAssoc('DELETE FROM {{survey_' . $surveyid . '}} WHERE id=' . $_SESSION['survey_' . $surveyid]['srid'] . " AND submitdate IS NULL"); if ($result->count() > 0) { // Using count() here *should* be okay for MSSQL because it is a delete statement // find out if there are any fuqt questions - checked $fieldmap = createFieldMap($surveyid, 'short', false, false, $s_lang); foreach ($fieldmap as $field) { if ($field['type'] == "|" && !strpos($field['fieldname'], "_filecount")) { if (!isset($qid)) { $qid = array(); } $qid[] = $field['fieldname']; } } // if yes, extract the response json to those questions if (isset($qid)) { $query = "SELECT * FROM {{survey_" . $surveyid . "}} WHERE id=" . $_SESSION['survey_' . $surveyid]['srid']; $result = dbExecuteAssoc($query); foreach ($result->readAll() as $row) { foreach ($qid as $question) { $json = $row[$question]; if ($json == "" || $json == NULL) { continue; } // decode them $phparray = json_decode($json); foreach ($phparray as $metadata) { $target = Yii::app()->getConfig("uploaddir") . "/surveys/" . $surveyid . "/files/"; // delete those files unlink($target . $metadata->filename); } } } } // done deleting uploaded files } // also delete a record from saved_control when there is one dbExecuteAssoc('DELETE FROM {{saved_control}} WHERE srid=' . $_SESSION['survey_' . $surveyid]['srid'] . ' AND sid=' . $surveyid); } killSurveySession($surveyid); sendCacheHeaders(); doHeader(); $redata = compact(array_keys(get_defined_vars())); $this->_printTemplateContent($thistpl . '/startpage.pstpl', $redata, __LINE__); echo "\n\n<!-- JAVASCRIPT FOR CONDITIONAL QUESTIONS -->\n" . "\t<script type='text/javascript'>\n" . "\t<!--\n" . "function checkconditions(value, name, type, evt_type)\n" . "\t{\n" . "\t}\n" . "\t//-->\n" . "\t</script>\n\n"; //Present the clear all page using clearall.pstpl template $this->_printTemplateContent($thistpl . '/clearall.pstpl', $redata, __LINE__); $this->_printTemplateContent($thistpl . '/endpage.pstpl', $redata, __LINE__); doFooter(); exit; } //Check to see if a refering URL has been captured. if (!isset($_SESSION['survey_' . $surveyid]['refurl'])) { $_SESSION['survey_' . $surveyid]['refurl'] = GetReferringUrl(); // do not overwrite refurl } // Let's do this only if // - a saved answer record hasn't been loaded through the saved feature // - the survey is not anonymous // - the survey is active // - a token information has been provided // - the survey is setup to allow token-response-persistence if (!isset($_SESSION['survey_' . $surveyid]['srid']) && $thissurvey['anonymized'] == "N" && $thissurvey['active'] == "Y" && isset($token) && $token != '') { // load previous answers if any (dataentry with nosubmit) $sQuery = "SELECT id,submitdate,lastpage FROM {$thissurvey['tablename']} WHERE {$thissurvey['tablename']}.token='{$token}' order by id desc"; $aRow = Yii::app()->db->createCommand($sQuery)->queryRow(); if ($aRow) { if ($aRow['submitdate'] == '' && $thissurvey['tokenanswerspersistence'] == 'Y' || $aRow['submitdate'] != '' && $thissurvey['alloweditaftercompletion'] == 'Y') { $_SESSION['survey_' . $surveyid]['srid'] = $aRow['id']; if (!is_null($aRow['lastpage']) && $aRow['submitdate'] == '') { $_SESSION['survey_' . $surveyid]['LEMtokenResume'] = true; $_SESSION['survey_' . $surveyid]['step'] = $aRow['lastpage']; } } buildsurveysession($surveyid); loadanswers(); } } // Preview action : Preview right already tested before if ($previewmode) { // Unset all SESSION: be sure to have the last version unset($_SESSION['fieldmap-' . $surveyid . $clang->langcode]); // Needed by createFieldMap: else fieldmap can be outdated unset($_SESSION['survey_' . $surveyid]); if ($param['action'] == 'previewgroup') { $thissurvey['format'] = 'G'; } elseif ($param['action'] == 'previewquestion') { $thissurvey['format'] = 'S'; } buildsurveysession($surveyid, true); } sendCacheHeaders(); //Send local variables to the appropriate survey type unset($redata); $redata = compact(array_keys(get_defined_vars())); Yii::import('application.helpers.SurveyRuntimeHelper'); $tmp = new SurveyRuntimeHelper(); $tmp->run($surveyid, $redata); if (isset($_POST['saveall']) || isset($flashmessage)) { echo "<script type='text/javascript'> \$(document).ready( function() { alert('" . $clang->gT("Your responses were successfully saved.", "js") . "');}) </script>"; } }