foreach ($questlangs as $qlang) { if ($filterxsshtml) { $_POST['question_' . $qlang] = $myFilter->process(html_entity_decode($_POST['question_' . $qlang], ENT_QUOTES, "UTF-8")); $_POST['help_' . $qlang] = $myFilter->process(html_entity_decode($_POST['help_' . $qlang], ENT_QUOTES, "UTF-8")); } else { $_POST['question_' . $qlang] = html_entity_decode($_POST['question_' . $qlang], ENT_QUOTES, "UTF-8"); $_POST['help_' . $qlang] = html_entity_decode($_POST['help_' . $qlang], ENT_QUOTES, "UTF-8"); } // Fix bug with FCKEditor saving strange BR types $_POST['question_' . $qlang] = fix_FCKeditor_text($_POST['question_' . $qlang]); $_POST['help_' . $qlang] = fix_FCKeditor_text($_POST['help_' . $qlang]); if (isset($qlang) && $qlang != "") { // ToDo: Sanitize the POST variables ! $uqquery = "UPDATE " . db_table_name('questions') . "SET type='" . db_quote($_POST['type']) . "', title='" . db_quote($_POST['title']) . "', " . "question='" . db_quote($_POST['question_' . $qlang]) . "', preg='" . db_quote($_POST['preg']) . "', help='" . db_quote($_POST['help_' . $qlang]) . "', " . "gid='" . db_quote($postgid) . "', other='" . db_quote($_POST['other']) . "', " . "mandatory='" . db_quote($_POST['mandatory']) . "'" . ", relevance='" . db_quote($_POST['relevance']) . "'"; if ($oldgid != $postgid) { if (getGroupOrder(returnglobal('sid'), $oldgid) > getGroupOrder(returnglobal('sid'), returnglobal('gid'))) { // 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($postgid) + 1; $uqquery .= ', question_order=' . $insertorder . ' '; } else { // Moving question to a 'lower' group // insert question at the beginning of the destination group shiftorderQuestions($postsid, $postgid, 1); // makes 1 spare room for new question at top of dest group $uqquery .= ', question_order=0 '; } } $uqquery .= "WHERE sid='" . $postsid . "' AND qid='" . $postqid . "' AND language='{$qlang}'"; $uqresult = $connect->Execute($uqquery) or safe_die("Error Update Question: " . $uqquery . "<br />" . $connect->ErrorMsg());
/** * checkMoveQuestionConstraintsForConditions() * @param string $sid - the currently selected survey * @param string $qid - qid of the question you want to check possible moves * @param string $newgid - (optionnal) get only constraints when trying to move to this particular GroupId * otherwise, get all moves constraints for this question * * @return array - returns an array describing the conditions * Array * ( * ['notAbove'] = null | Array * ( * Array ( gid1, group_order1, qid1, cid1 ) * ) * ['notBelow'] = null | Array * ( * Array ( gid2, group_order2, qid2, cid2 ) * ) * ) * * This should be read as: * - this question can't be move above group gid1 in position group_order1 because of the condition cid1 on question qid1 * - this question can't be move below group gid2 in position group_order2 because of the condition cid2 on question qid2 * */ function checkMoveQuestionConstraintsForConditions($sid, $qid, $newgid = "all") { $resarray = array(); $resarray['notAbove'] = null; // defaults to no constraint $resarray['notBelow'] = null; // defaults to no constraint $sid = sanitize_int($sid); $qid = sanitize_int($qid); if ($newgid != "all") { $newgid = sanitize_int($newgid); $newgorder = getGroupOrder($sid, $newgid); } else { $neworder = ""; // Not used in this case } $baselang = Survey::model()->findByPk($sid)->language; // First look for 'my dependencies': questions on which I have set conditions $condquery = "SELECT tq.qid as depqid, tq.gid as depgid, tg.group_order as depgorder, " . "tq2.qid as targqid, tq2.gid as targgid, tg2.group_order as targgorder, " . "tc.cid FROM " . "{{conditions}} AS tc, " . "{{questions}} AS tq, " . "{{questions}} AS tq2, " . "{{groups}} AS tg, " . "{{groups}} AS tg2 " . "WHERE tq.language='{$baselang}' AND tq2.language='{$baselang}' AND tc.qid = tq.qid AND tq.sid={$sid} " . "AND tq2.qid=tc.cqid AND tg.gid=tq.gid AND tg2.gid=tq2.gid AND tq.qid={$qid} ORDER BY tg2.group_order DESC"; $condresult = Yii::app()->db->createCommand($condquery)->query(); foreach ($condresult->readAll() as $condrow) { // This Question can go up to the minimum GID on the 1st row $depqid = $condrow['depqid']; $depgid = $condrow['depgid']; $depgorder = $condrow['depgorder']; $targetqid = $condrow['targqid']; $targetgid = $condrow['targgid']; $targetgorder = $condrow['targgorder']; $condid = $condrow['cid']; //echo "This question can't go above to GID=$targetgid/order=$targetgorder because of CID=$condid"; if ($newgid != "all") { // Get only constraints when trying to move to this group if ($newgorder < $targetgorder) { $resarray['notAbove'][] = array($targetgid, $targetgorder, $depqid, $condid); } } else { // get all moves constraints $resarray['notAbove'][] = array($targetgid, $targetgorder, $depqid, $condid); } } // Secondly look for 'questions dependent on me': questions that have conditions on my answers $condquery = "SELECT tq.qid as depqid, tq.gid as depgid, tg.group_order as depgorder, " . "tq2.qid as targqid, tq2.gid as targgid, tg2.group_order as targgorder, " . "tc.cid FROM {{conditions}} AS tc, " . "{{questions}} AS tq, " . "{{questions}} AS tq2, " . "{{groups}} AS tg, " . "{{groups}} AS tg2 " . "WHERE tq.language='{$baselang}' AND tq2.language='{$baselang}' AND tc.qid = tq.qid AND tq.sid={$sid} " . "AND tq2.qid=tc.cqid AND tg.gid=tq.gid AND tg2.gid=tq2.gid AND tq2.qid={$qid} ORDER BY tg.group_order"; $condresult = Yii::app()->db->createCommand($condquery)->query(); foreach ($condresult->readAll() as $condrow) { // This Question can go down to the maximum GID on the 1st row $depqid = $condrow['depqid']; $depgid = $condrow['depgid']; $depgorder = $condrow['depgorder']; $targetqid = $condrow['targqid']; $targetgid = $condrow['targgid']; $targetgorder = $condrow['targgorder']; $condid = $condrow['cid']; //echo "This question can't go below to GID=$depgid/order=$depgorder because of CID=$condid"; if ($newgid != "all") { // Get only constraints when trying to move to this group if ($newgorder > $depgorder) { $resarray['notBelow'][] = array($depgid, $depgorder, $depqid, $condid); } } else { // get all moves constraints $resarray['notBelow'][] = array($depgid, $depgorder, $depqid, $condid); } } return $resarray; }
/** * Database::index() * * @param mixed $sa * @return */ function index($sa = null) { $sAction = Yii::app()->request->getPost('action'); $iSurveyID = isset($_POST['sid']) ? $_POST['sid'] : returnGlobal('sid'); $iQuestionGroupID = returnGlobal('gid'); $iQuestionID = returnGlobal('qid'); // TODO: This variable seems to be never set or used in any function call? $sDBOutput = ''; $oFixCKeditor = new LSYii_Validators(); $oFixCKeditor->fixCKeditor = true; $oFixCKeditor->xssfilter = false; if ($sAction == "updatedefaultvalues" && Permission::model()->hasSurveyPermission($iSurveyID, 'surveycontent', 'update')) { $aSurveyLanguages = Survey::model()->findByPk($iSurveyID)->additionalLanguages; $sBaseLanguage = Survey::model()->findByPk($iSurveyID)->language; array_unshift($aSurveyLanguages, $sBaseLanguage); Question::model()->updateAll(array('same_default' => Yii::app()->request->getPost('samedefault') ? 1 : 0), 'sid=:sid ANd qid=:qid', array(':sid' => $iSurveyID, ':qid' => $iQuestionID)); $arQuestion = Question::model()->findByAttributes(array('qid' => $iQuestionID)); $sQuestionType = $arQuestion['type']; $aQuestionTypeList = getQuestionTypeList('', 'array'); if ($aQuestionTypeList[$sQuestionType]['answerscales'] > 0 && $aQuestionTypeList[$sQuestionType]['subquestions'] == 0) { for ($iScaleID = 0; $iScaleID < $aQuestionTypeList[$sQuestionType]['answerscales']; $iScaleID++) { foreach ($aSurveyLanguages as $sLanguage) { if (!is_null(Yii::app()->request->getPost('defaultanswerscale_' . $iScaleID . '_' . $sLanguage))) { $this->_updateDefaultValues($iQuestionID, 0, $iScaleID, '', $sLanguage, Yii::app()->request->getPost('defaultanswerscale_' . $iScaleID . '_' . $sLanguage), true); } if (!is_null(Yii::app()->request->getPost('other_' . $iScaleID . '_' . $sLanguage))) { $this->_updateDefaultValues($iQuestionID, 0, $iScaleID, 'other', $sLanguage, Yii::app()->request->getPost('other_' . $iScaleID . '_' . $sLanguage), true); } } } } if ($aQuestionTypeList[$sQuestionType]['subquestions'] > 0) { foreach ($aSurveyLanguages as $sLanguage) { $arQuestions = Question::model()->findAllByAttributes(array('sid' => $iSurveyID, 'gid' => $iQuestionGroupID, 'parent_qid' => $iQuestionID, 'language' => $sLanguage, 'scale_id' => 0)); for ($iScaleID = 0; $iScaleID < $aQuestionTypeList[$sQuestionType]['subquestions']; $iScaleID++) { foreach ($arQuestions as $aSubquestionrow) { if (!is_null(Yii::app()->request->getPost('defaultanswerscale_' . $iScaleID . '_' . $sLanguage . '_' . $aSubquestionrow['qid']))) { $this->_updateDefaultValues($iQuestionID, $aSubquestionrow['qid'], $iScaleID, '', $sLanguage, Yii::app()->request->getPost('defaultanswerscale_' . $iScaleID . '_' . $sLanguage . '_' . $aSubquestionrow['qid']), true); } } } } } if ($aQuestionTypeList[$sQuestionType]['answerscales'] == 0 && $aQuestionTypeList[$sQuestionType]['subquestions'] == 0) { foreach ($aSurveyLanguages as $sLanguage) { // Qick and dirty insert for yes/no defaul value // write the the selectbox option, or if "EM" is slected, this value to table if ($sQuestionType == 'Y') { /// value for all langs if (Yii::app()->request->getPost('samedefault') == 1) { $sLanguage = $aSurveyLanguages[0]; // turn } else { $sCurrentLang = $sLanguage; // edit the next lines } if (Yii::app()->request->getPost('defaultanswerscale_0_' . $sLanguage) == 'EM') { // Case EM, write expression to database $this->_updateDefaultValues($iQuestionID, 0, 0, '', $sLanguage, Yii::app()->request->getPost('defaultanswerscale_0_' . $sLanguage . '_EM'), true); } else { // Case "other", write list value to database $this->_updateDefaultValues($iQuestionID, 0, 0, '', $sLanguage, Yii::app()->request->getPost('defaultanswerscale_0_' . $sLanguage), true); } ///// end yes/no } else { if (!is_null(Yii::app()->request->getPost('defaultanswerscale_0_' . $sLanguage . '_0'))) { $this->_updateDefaultValues($iQuestionID, 0, 0, '', $sLanguage, Yii::app()->request->getPost('defaultanswerscale_0_' . $sLanguage . '_0'), true); } } } } Yii::app()->session['flashmessage'] = gT("Default value settings were successfully saved."); LimeExpressionManager::SetDirtyFlag(); if ($sDBOutput != '') { echo $sDBOutput; } else { if (Yii::app()->request->getPost('close-after-save') === 'true') { $this->getController()->redirect(array('admin/questions/sa/view/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } $this->getController()->redirect(array('admin/questions/sa/editdefaultvalues/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } } if ($sAction == "updateansweroptions" && Permission::model()->hasSurveyPermission($iSurveyID, 'surveycontent', 'update')) { Yii::app()->loadHelper('database'); $aSurveyLanguages = Survey::model()->findByPk($iSurveyID)->additionalLanguages; $sBaseLanguage = Survey::model()->findByPk($iSurveyID)->language; array_unshift($aSurveyLanguages, $sBaseLanguage); $arQuestion = Question::model()->findByAttributes(array('qid' => $iQuestionID)); $sQuestionType = $arQuestion['type']; // Checked) $aQuestionTypeList = getQuestionTypeList('', 'array'); $iScaleCount = $aQuestionTypeList[$sQuestionType]['answerscales']; //First delete all answers Answer::model()->deleteAllByAttributes(array('qid' => $iQuestionID)); LimeExpressionManager::RevertUpgradeConditionsToRelevance($iSurveyID); for ($iScaleID = 0; $iScaleID < $iScaleCount; $iScaleID++) { $iMaxCount = (int) Yii::app()->request->getPost('answercount_' . $iScaleID); for ($iSortOrderID = 1; $iSortOrderID < $iMaxCount; $iSortOrderID++) { $sCode = sanitize_paranoid_string(Yii::app()->request->getPost('code_' . $iSortOrderID . '_' . $iScaleID)); $iAssessmentValue = (int) Yii::app()->request->getPost('assessment_' . $iSortOrderID . '_' . $iScaleID); foreach ($aSurveyLanguages as $sLanguage) { $sAnswerText = Yii::app()->request->getPost('answer_' . $sLanguage . '_' . $iSortOrderID . '_' . $iScaleID); // Fix bug with FCKEditor saving strange BR types $sAnswerText = $oFixCKeditor->fixCKeditor($sAnswerText); // Now we insert the answers $iInsertCount = Answer::model()->insertRecords(array('code' => $sCode, 'answer' => $sAnswerText, 'qid' => $iQuestionID, 'sortorder' => $iSortOrderID, 'language' => $sLanguage, 'assessment_value' => $iAssessmentValue, 'scale_id' => $iScaleID)); if (!$iInsertCount) { Yii::app()->setFlashMessage(gT("Failed to update answers"), 'error'); } } // Updating code (oldcode!==null) => update condition with the new code $sOldCode = Yii::app()->request->getPost('oldcode_' . $iSortOrderID . '_' . $iScaleID); if (isset($sOldCode) && $sCode !== $sOldCode) { Condition::model()->updateAll(array('value' => $sCode), 'cqid=:cqid AND value=:value', array(':cqid' => $iQuestionID, ':value' => $sOldCode)); } } // for ($sortorderid=0;$sortorderid<$maxcount;$sortorderid++) } // for ($scale_id=0; LimeExpressionManager::UpgradeConditionsToRelevance($iSurveyID); if (!Yii::app()->request->getPost('bFullPOST')) { Yii::app()->setFlashMessage(gT("Not all answer options were saved. This usually happens due to server limitations ( PHP setting max_input_vars) - please contact your system administrator.")); } else { Yii::app()->session['flashmessage'] = gT("Answer options were successfully saved."); } LimeExpressionManager::SetDirtyFlag(); if ($sDBOutput != '') { echo $sDBOutput; } else { if (Yii::app()->request->getPost('close-after-save') === 'true') { $this->getController()->redirect(array('admin/questions/sa/view/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } $this->getController()->redirect(array('/admin/questions/sa/answeroptions/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } } if ($sAction == "updatesubquestions" && Permission::model()->hasSurveyPermission($iSurveyID, 'surveycontent', 'update')) { Yii::app()->loadHelper('database'); $aSurveyLanguages = Survey::model()->findByPk($iSurveyID)->additionalLanguages; $sBaseLanguage = Survey::model()->findByPk($iSurveyID)->language; array_unshift($aSurveyLanguages, $sBaseLanguage); $arQuestion = Question::model()->findByAttributes(array('qid' => $iQuestionID)); $sQuestionType = $arQuestion['type']; // Checked $aQuestionTypeList = getQuestionTypeList('', 'array'); $iScaleCount = $aQuestionTypeList[$sQuestionType]['subquestions']; // First delete any deleted ids $aDeletedQIDs = explode(' ', trim(Yii::app()->request->getPost('deletedqids'))); LimeExpressionManager::RevertUpgradeConditionsToRelevance($iSurveyID); $aDeletedQIDs = array_unique($aDeletedQIDs, SORT_NUMERIC); foreach ($aDeletedQIDs as $iDeletedQID) { $iDeletedQID = (int) $iDeletedQID; if ($iDeletedQID > 0) { // don't remove undefined $iInsertCount = Question::model()->deleteAllByAttributes(array('qid' => $iDeletedQID)); if (!$iInsertCount) { Yii::app()->setFlashMessage(gT("Failed to delete answer"), 'error'); } } } //Determine ids by evaluating the hidden field $aRows = array(); $aCodes = array(); $aOldCodes = array(); $aRelevance = array(); foreach ($_POST as $sPOSTKey => $sPOSTValue) { $sPOSTKey = explode('_', $sPOSTKey); if ($sPOSTKey[0] == 'answer') { $aRows[$sPOSTKey[3]][$sPOSTKey[1]][$sPOSTKey[2]] = $sPOSTValue; } if ($sPOSTKey[0] == 'code') { $aCodes[$sPOSTKey[2]][] = $sPOSTValue; } if ($sPOSTKey[0] == 'oldcode') { $aOldCodes[$sPOSTKey[2]][] = $sPOSTValue; } if ($sPOSTKey[0] == 'relevance') { $aRelevance[$sPOSTKey[2]][] = $sPOSTValue; } } $aInsertQID = array(); for ($iScaleID = 0; $iScaleID < $iScaleCount; $iScaleID++) { foreach ($aSurveyLanguages as $sLanguage) { $iPosition = 0; foreach ($aRows[$iScaleID][$sLanguage] as $subquestionkey => $subquestionvalue) { if (substr($subquestionkey, 0, 3) != 'new') { $oSubQuestion = Question::model()->find("qid=:qid AND language=:language", array(":qid" => $subquestionkey, ':language' => $sLanguage)); if (!is_object($oSubQuestion)) { throw new CHttpException(502, "could not find subquestion {$subquestionkey} !"); } $oSubQuestion->question_order = $iPosition + 1; $oSubQuestion->title = $aCodes[$iScaleID][$iPosition]; $oSubQuestion->question = $subquestionvalue; $oSubQuestion->scale_id = $iScaleID; $oSubQuestion->relevance = isset($aRelevance[$iScaleID][$iPosition]) ? $aRelevance[$iScaleID][$iPosition] : ""; } else { if (!isset($aInsertQID[$iScaleID][$iPosition])) { $oSubQuestion = new Question(); $oSubQuestion->sid = $iSurveyID; $oSubQuestion->gid = $iQuestionGroupID; $oSubQuestion->question_order = $iPosition + 1; $oSubQuestion->title = $aCodes[$iScaleID][$iPosition]; $oSubQuestion->question = $subquestionvalue; $oSubQuestion->parent_qid = $iQuestionID; $oSubQuestion->language = $sLanguage; $oSubQuestion->scale_id = $iScaleID; $oSubQuestion->relevance = isset($aRelevance[$iScaleID][$iPosition]) ? $aRelevance[$iScaleID][$iPosition] : ""; } else { $oSubQuestion = Question::model()->find("qid=:qid AND language=:language", array(":qid" => $aInsertQID[$iScaleID][$iPosition], ':language' => $sLanguage)); if (!$oSubQuestion) { $oSubQuestion = new Question(); } $oSubQuestion->sid = $iSurveyID; $oSubQuestion->qid = $aInsertQID[$iScaleID][$iPosition]; $oSubQuestion->gid = $iQuestionGroupID; $oSubQuestion->question_order = $iPosition + 1; $oSubQuestion->title = $aCodes[$iScaleID][$iPosition]; $oSubQuestion->question = $subquestionvalue; $oSubQuestion->parent_qid = $iQuestionID; $oSubQuestion->language = $sLanguage; $oSubQuestion->scale_id = $iScaleID; $oSubQuestion->relevance = isset($aRelevance[$iScaleID][$iPosition]) ? $aRelevance[$iScaleID][$iPosition] : ""; } } if ($oSubQuestion->qid) { switchMSSQLIdentityInsert('questions', true); $bSubQuestionResult = $oSubQuestion->save(); switchMSSQLIdentityInsert('questions', false); } else { $bSubQuestionResult = $oSubQuestion->save(); } if ($bSubQuestionResult) { if (substr($subquestionkey, 0, 3) != 'new' && isset($aOldCodes[$iScaleID][$iPosition]) && $aCodes[$iScaleID][$iPosition] !== $aOldCodes[$iScaleID][$iPosition]) { Condition::model()->updateAll(array('cfieldname' => '+' . $iSurveyID . 'X' . $iQuestionGroupID . 'X' . $iQuestionID . $aCodes[$iScaleID][$iPosition], 'value' => $aCodes[$iScaleID][$iPosition]), 'cqid=:cqid AND cfieldname=:cfieldname AND value=:value', array(':cqid' => $iQuestionID, ':cfieldname' => $iSurveyID . 'X' . $iQuestionGroupID . 'X' . $iQuestionID, ':value' => $aOldCodes[$iScaleID][$iPosition])); } if (!isset($aInsertQID[$iScaleID][$iPosition])) { $aInsertQID[$iScaleID][$iPosition] = $oSubQuestion->qid; } } else { $aErrors = $oSubQuestion->getErrors(); if (count($aErrors)) { //$sErrorMessage=gT("Question could not be updated with this errors:"); foreach ($aErrors as $sAttribute => $aStringErrors) { foreach ($aStringErrors as $sStringErrors) { Yii::app()->setFlashMessage(sprintf(gT("Error on %s for subquestion %s: %s"), $sAttribute, $aCodes[$iScaleID][$iPosition], $sStringErrors), 'error'); } } } else { Yii::app()->setFlashMessage(sprintf(gT("Subquestions %s could not be updated."), $aCodes[$iScaleID][$iPosition]), 'error'); } } $iPosition++; } } } LimeExpressionManager::UpgradeConditionsToRelevance($iSurveyID); // Do it only if there are no error ? if (!isset($aErrors) || !count($aErrors)) { if (!Yii::app()->request->getPost('bFullPOST')) { Yii::app()->session['flashmessage'] = gT("Not all subquestions were saved. This usually happens due to server limitations ( PHP setting max_input_vars) - please contact your system administrator."); } else { Yii::app()->session['flashmessage'] = gT("Subquestions were successfully saved."); } } //$action='editsubquestions'; LimeExpressionManager::SetDirtyFlag(); if ($sDBOutput != '') { echo 'Problem in database controller: ' . $sDBOutput; } else { if (Yii::app()->request->getPost('close-after-save') === 'true') { $this->getController()->redirect(array('/admin/questions/sa/view/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } $this->getController()->redirect(array('/admin/questions/sa/subquestions/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } } /** * Insert / Copy question */ if (in_array($sAction, array('insertquestion', 'copyquestion')) && Permission::model()->hasSurveyPermission($iSurveyID, 'surveycontent', 'create')) { $survey = Survey::model()->findByPk($iSurveyID); $sBaseLanguage = $survey->language; // Abort if survey is active if ($survey->active !== 'N') { Yii::app()->setFlashMessage(gT("You can't insert a new question when the survey is active."), 'error'); $this->getController()->redirect(array("/admin/survey/sa/view/surveyid/" . $survey->sid), "refresh"); } if (strlen(Yii::app()->request->getPost('title')) < 1) { Yii::app()->setFlashMessage(gT("The question could not be added. You must enter at least a question code."), 'error'); } else { // For Bootstrap Version usin YiiWheels switch : $_POST['mandatory'] = Yii::app()->request->getPost('mandatory') == '1' ? 'Y' : 'N'; $_POST['other'] = Yii::app()->request->getPost('other') == '1' ? 'Y' : 'N'; if (Yii::app()->request->getPost('questionposition', "") != "") { $iQuestionOrder = intval(Yii::app()->request->getPost('questionposition')); //Need to renumber all questions on or after this $sQuery = "UPDATE {{questions}} SET question_order=question_order+1 WHERE gid=:gid AND question_order >= :order"; Yii::app()->db->createCommand($sQuery)->bindValues(array(':gid' => $iQuestionGroupID, ':order' => $iQuestionOrder))->query(); } else { $iQuestionOrder = getMaxQuestionOrder($iQuestionGroupID, $iSurveyID); $iQuestionOrder++; } $sQuestionText = Yii::app()->request->getPost('question_' . $sBaseLanguage, ''); $sQuestionHelp = Yii::app()->request->getPost('help_' . $sBaseLanguage, ''); // Fix bug with FCKEditor saving strange BR types : in rules ? $sQuestionText = $oFixCKeditor->fixCKeditor($sQuestionText); $sQuestionHelp = $oFixCKeditor->fixCKeditor($sQuestionHelp); $iQuestionID = 0; $oQuestion = new Question(); $oQuestion->sid = $iSurveyID; $oQuestion->gid = $iQuestionGroupID; $oQuestion->type = Yii::app()->request->getPost('type'); $oQuestion->title = Yii::app()->request->getPost('title'); $oQuestion->question = $sQuestionText; $oQuestion->preg = Yii::app()->request->getPost('preg'); $oQuestion->help = $sQuestionHelp; $oQuestion->other = Yii::app()->request->getPost('other'); // For Bootstrap Version usin YiiWheels switch : $oQuestion->mandatory = Yii::app()->request->getPost('mandatory'); $oQuestion->other = Yii::app()->request->getPost('other'); $oQuestion->relevance = Yii::app()->request->getPost('relevance'); $oQuestion->question_order = $iQuestionOrder; $oQuestion->language = $sBaseLanguage; $oQuestion->save(); if ($oQuestion) { $iQuestionID = $oQuestion->qid; } $aErrors = $oQuestion->getErrors(); if (count($aErrors)) { foreach ($aErrors as $sAttribute => $aStringErrors) { foreach ($aStringErrors as $sStringErrors) { Yii::app()->setFlashMessage(sprintf(gT("Question could not be created with error on %s: %s"), $sAttribute, $sStringErrors), 'error'); } } } // Add other languages if ($iQuestionID) { $addlangs = Survey::model()->findByPk($iSurveyID)->additionalLanguages; foreach ($addlangs as $alang) { if ($alang != "") { $langqid = 0; $oQuestion = new Question(); $oQuestion->qid = $iQuestionID; $oQuestion->sid = $iSurveyID; $oQuestion->gid = $iQuestionGroupID; $oQuestion->type = Yii::app()->request->getPost('type'); $oQuestion->title = Yii::app()->request->getPost('title'); $oQuestion->question = Yii::app()->request->getPost('question_' . $alang); $oQuestion->preg = Yii::app()->request->getPost('preg'); $oQuestion->help = Yii::app()->request->getPost('help_' . $alang); $oQuestion->other = Yii::app()->request->getPost('other'); $oQuestion->mandatory = Yii::app()->request->getPost('mandatory'); $oQuestion->relevance = Yii::app()->request->getPost('relevance'); $oQuestion->question_order = $iQuestionOrder; $oQuestion->language = $alang; switchMSSQLIdentityInsert('questions', true); // Not sure for this one ? $oQuestion->save(); switchMSSQLIdentityInsert('questions', false); if ($oQuestion) { $langqid = $oQuestion->qid; } $aErrors = $oQuestion->getErrors(); if (count($aErrors)) { foreach ($aErrors as $sAttribute => $aStringErrors) { foreach ($aStringErrors as $sStringErrors) { Yii::app()->setFlashMessage(sprintf(gT("Question in language %s could not be created with error on %s: %s"), $alang, $sAttribute, $sStringErrors), 'error'); } } } # if (!$langqid) # { # Yii::app()->setFlashMessage(gT("Question in language %s could not be created."),'error'); # } } } } if (!$iQuestionID) { Yii::app()->setFlashMessage(gT("Question could not be created."), 'error'); } else { /** * * Copy Question * */ if ($sAction == 'copyquestion') { if (returnGlobal('copysubquestions') == "Y") { $aSQIDMappings = array(); $r1 = Question::model()->getSubQuestions(returnGlobal('oldqid')); $aSubQuestions = $r1->readAll(); foreach ($aSubQuestions as $qr1) { $qr1['parent_qid'] = $iQuestionID; if (isset($aSQIDMappings[$qr1['qid']])) { $qr1['qid'] = $aSQIDMappings[$qr1['qid']]; } else { $oldqid = $qr1['qid']; unset($qr1['qid']); } $qr1['gid'] = $iQuestionGroupID; $iInsertID = Question::model()->insertRecords($qr1); if (!isset($qr1['qid'])) { $aSQIDMappings[$oldqid] = $iInsertID; } } } if (returnGlobal('copyanswers') == "Y") { $r1 = Answer::model()->getAnswers(returnGlobal('oldqid')); $aAnswerOptions = $r1->readAll(); foreach ($aAnswerOptions as $qr1) { Answer::model()->insertRecords(array('qid' => $iQuestionID, 'code' => $qr1['code'], 'answer' => $qr1['answer'], 'assessment_value' => $qr1['assessment_value'], 'sortorder' => $qr1['sortorder'], 'language' => $qr1['language'], 'scale_id' => $qr1['scale_id'])); } } /** * Copy attribute */ if (returnGlobal('copyattributes') == "Y") { $oOldAttributes = QuestionAttribute::model()->findAll("qid=:qid", array("qid" => returnGlobal('oldqid'))); foreach ($oOldAttributes as $oOldAttribute) { $attribute = new QuestionAttribute(); $attribute->qid = $iQuestionID; $attribute->value = $oOldAttribute->value; $attribute->attribute = $oOldAttribute->attribute; $attribute->language = $oOldAttribute->language; $attribute->save(); } } // Since 2.5, user can edit attribute while copying $qattributes = questionAttributes(); $validAttributes = $qattributes[Yii::app()->request->getPost('type')]; $aLanguages = array_merge(array(Survey::model()->findByPk($iSurveyID)->language), Survey::model()->findByPk($iSurveyID)->additionalLanguages); foreach ($validAttributes as $validAttribute) { if ($validAttribute['i18n']) { foreach ($aLanguages as $sLanguage) { $value = Yii::app()->request->getPost($validAttribute['name'] . '_' . $sLanguage); $iInsertCount = QuestionAttribute::model()->findAllByAttributes(array('attribute' => $validAttribute['name'], 'qid' => $iQuestionID, 'language' => $sLanguage)); if (count($iInsertCount) > 0) { if ($value != '') { QuestionAttribute::model()->updateAll(array('value' => $value), 'attribute=:attribute AND qid=:qid AND language=:language', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID, ':language' => $sLanguage)); } else { QuestionAttribute::model()->deleteAll('attribute=:attribute AND qid=:qid AND language=:language', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID, ':language' => $sLanguage)); } } elseif ($value != '') { $attribute = new QuestionAttribute(); $attribute->qid = $iQuestionID; $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; } } $iInsertCount = QuestionAttribute::model()->findAllByAttributes(array('attribute' => $validAttribute['name'], 'qid' => $iQuestionID)); if (count($iInsertCount) > 0) { if ($value != $validAttribute['default'] && trim($value) != "") { QuestionAttribute::model()->updateAll(array('value' => $value), 'attribute=:attribute AND qid=:qid', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID)); } else { QuestionAttribute::model()->deleteAll('attribute=:attribute AND qid=:qid', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID)); } } elseif ($value != $validAttribute['default'] && trim($value) != "") { $attribute = new QuestionAttribute(); $attribute->qid = $iQuestionID; $attribute->value = $value; $attribute->attribute = $validAttribute['name']; $attribute->save(); } } } } else { $qattributes = questionAttributes(); $validAttributes = $qattributes[Yii::app()->request->getPost('type')]; $aLanguages = array_merge(array(Survey::model()->findByPk($iSurveyID)->language), Survey::model()->findByPk($iSurveyID)->additionalLanguages); foreach ($validAttributes as $validAttribute) { if ($validAttribute['i18n']) { foreach ($aLanguages as $sLanguage) { $value = Yii::app()->request->getPost($validAttribute['name'] . '_' . $sLanguage); $iInsertCount = QuestionAttribute::model()->findAllByAttributes(array('attribute' => $validAttribute['name'], 'qid' => $iQuestionID, 'language' => $sLanguage)); if (count($iInsertCount) > 0) { if ($value != '') { QuestionAttribute::model()->updateAll(array('value' => $value), 'attribute=:attribute AND qid=:qid AND language=:language', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID, ':language' => $sLanguage)); } else { QuestionAttribute::model()->deleteAll('attribute=:attribute AND qid=:qid AND language=:language', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID, ':language' => $sLanguage)); } } elseif ($value != '') { $attribute = new QuestionAttribute(); $attribute->qid = $iQuestionID; $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; } } $iInsertCount = QuestionAttribute::model()->findAllByAttributes(array('attribute' => $validAttribute['name'], 'qid' => $iQuestionID)); if (count($iInsertCount) > 0) { if ($value != $validAttribute['default'] && trim($value) != "") { QuestionAttribute::model()->updateAll(array('value' => $value), 'attribute=:attribute AND qid=:qid', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID)); } else { QuestionAttribute::model()->deleteAll('attribute=:attribute AND qid=:qid', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID)); } } elseif ($value != $validAttribute['default'] && trim($value) != "") { $attribute = new QuestionAttribute(); $attribute->qid = $iQuestionID; $attribute->value = $value; $attribute->attribute = $validAttribute['name']; $attribute->save(); } } } } Question::model()->updateQuestionOrder($iQuestionGroupID, $iSurveyID); Yii::app()->session['flashmessage'] = gT("Question was successfully added."); } } LimeExpressionManager::SetDirtyFlag(); // so refreshes syntax highlighting if ($sDBOutput != '') { echo $sDBOutput; } else { //admin/survey/sa/view/surveyid/ $this->getController()->redirect(array('admin/questions/sa/view/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } } /** * Update question */ if ($sAction == "updatequestion" && Permission::model()->hasSurveyPermission($iSurveyID, 'surveycontent', 'update')) { LimeExpressionManager::RevertUpgradeConditionsToRelevance($iSurveyID); $cqr = Question::model()->findByAttributes(array('qid' => $iQuestionID)); $oldtype = $cqr['type']; $oldgid = $cqr['gid']; $survey = Survey::model()->findByPk($iSurveyID); // If the survey is activate the question type may not be changed if ($survey->active !== 'N') { $sQuestionType = $oldtype; } else { $sQuestionType = Yii::app()->request->getPost('type'); } // Remove invalid question attributes on saving $qattributes = questionAttributes(); $criteria = new CDbCriteria(); $criteria->compare('qid', $iQuestionID); if (isset($qattributes[$sQuestionType])) { $validAttributes = $qattributes[$sQuestionType]; foreach ($validAttributes as $validAttribute) { $criteria->compare('attribute', '<>' . $validAttribute['name']); } } QuestionAttribute::model()->deleteAll($criteria); $aLanguages = array_merge(array(Survey::model()->findByPk($iSurveyID)->language), Survey::model()->findByPk($iSurveyID)->additionalLanguages); //now save all valid attributes $validAttributes = $qattributes[$sQuestionType]; foreach ($validAttributes as $validAttribute) { if ($validAttribute['i18n']) { foreach ($aLanguages as $sLanguage) { // TODO sanitise XSS $value = Yii::app()->request->getPost($validAttribute['name'] . '_' . $sLanguage); $iInsertCount = QuestionAttribute::model()->findAllByAttributes(array('attribute' => $validAttribute['name'], 'qid' => $iQuestionID, 'language' => $sLanguage)); if (count($iInsertCount) > 0) { if ($value != '') { QuestionAttribute::model()->updateAll(array('value' => $value), 'attribute=:attribute AND qid=:qid AND language=:language', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID, ':language' => $sLanguage)); } else { QuestionAttribute::model()->deleteAll('attribute=:attribute AND qid=:qid AND language=:language', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID, ':language' => $sLanguage)); } } elseif ($value != '') { $attribute = new QuestionAttribute(); $attribute->qid = $iQuestionID; $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; } } $iInsertCount = QuestionAttribute::model()->findAllByAttributes(array('attribute' => $validAttribute['name'], 'qid' => $iQuestionID)); if (count($iInsertCount) > 0) { if ($value != $validAttribute['default'] && trim($value) != "") { QuestionAttribute::model()->updateAll(array('value' => $value), 'attribute=:attribute AND qid=:qid', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID)); } else { QuestionAttribute::model()->deleteAll('attribute=:attribute AND qid=:qid', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID)); } } elseif ($value != $validAttribute['default'] && trim($value) != "") { $attribute = new QuestionAttribute(); $attribute->qid = $iQuestionID; $attribute->value = $value; $attribute->attribute = $validAttribute['name']; $attribute->save(); } } } $aQuestionTypeList = getQuestionTypeList('', 'array'); // These are the questions types that have no answers and therefore we delete the answer in that case $iAnswerScales = $aQuestionTypeList[$sQuestionType]['answerscales']; $iSubquestionScales = $aQuestionTypeList[$sQuestionType]['subquestions']; // These are the questions types that have the other option therefore we set everything else to 'No Other' if ($sQuestionType != "L" && $sQuestionType != "!" && $sQuestionType != "P" && $sQuestionType != "M") { $_POST['other'] = 'N'; } // These are the questions types that have no validation - so zap it accordingly if ($sQuestionType == "!" || $sQuestionType == "L" || $sQuestionType == "M" || $sQuestionType == "P" || $sQuestionType == "F" || $sQuestionType == "H" || $sQuestionType == "X" || $sQuestionType == "") { $_POST['preg'] = ''; } // For Bootstrap Version usin YiiWheels switch : $_POST['mandatory'] = Yii::app()->request->getPost('mandatory') == '1' ? 'Y' : 'N'; $_POST['other'] = Yii::app()->request->getPost('other') == '1' ? 'Y' : 'N'; // These are the questions types that have no mandatory property - so zap it accordingly if ($sQuestionType == "X" || $sQuestionType == "|") { $_POST['mandatory'] = 'N'; } if ($oldtype != $sQuestionType) { // TMSW Condition->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 = Condition::model()->findAllByAttributes(array('cqid' => $iQuestionID)); $cccount = count($ccresult); foreach ($ccresult as $ccr) { $qidarray[] = $ccr['qid']; } if (isset($qidarray) && $qidarray) { $qidlist = implode(", ", $qidarray); } } if (isset($cccount) && $cccount) { Yii::app()->setFlashMessage(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."), 'error'); } else { if (isset($iQuestionGroupID) && $iQuestionGroupID != "") { // $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'])) // { $aSurveyLanguages = Survey::model()->findByPk($iSurveyID)->additionalLanguages; $sBaseLanguage = Survey::model()->findByPk($iSurveyID)->language; array_push($aSurveyLanguages, $sBaseLanguage); foreach ($aSurveyLanguages as $qlang) { if (isset($qlang) && $qlang != "") { // é to é and & to & : really needed ? Why not for answers ? (130307) $sQuestionText = Yii::app()->request->getPost('question_' . $qlang, ''); $sQuestionHelp = Yii::app()->request->getPost('help_' . $qlang, ''); // Fix bug with FCKEditor saving strange BR types : in rules ? $sQuestionText = $oFixCKeditor->fixCKeditor($sQuestionText); $sQuestionHelp = $oFixCKeditor->fixCKeditor($sQuestionHelp); $udata = array('type' => $sQuestionType, 'title' => Yii::app()->request->getPost('title'), 'question' => $sQuestionText, 'preg' => Yii::app()->request->getPost('preg'), 'help' => $sQuestionHelp, 'gid' => $iQuestionGroupID, 'other' => Yii::app()->request->getPost('other'), 'mandatory' => Yii::app()->request->getPost('mandatory'), 'relevance' => Yii::app()->request->getPost('relevance')); // Update question module if (Yii::app()->request->getPost('module_name') != '') { // The question module is not empty. So it's an external question module. $udata['modulename'] = Yii::app()->request->getPost('module_name'); } else { // If it was a module before, we must $udata['modulename'] = ''; } if ($oldgid != $iQuestionGroupID) { if (getGroupOrder($iSurveyID, $oldgid) > getGroupOrder($iSurveyID, $iQuestionGroupID)) { // TMSW Condition->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($iQuestionGroupID, $iSurveyID) + 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($iSurveyID, $iQuestionGroupID, 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); $oQuestion = Question::model()->findByPk(array("qid" => $iQuestionID, 'language' => $qlang)); foreach ($udata as $k => $v) { $oQuestion->{$k} = $v; } $uqresult = $oQuestion->save(); //($uqquery); // or safeDie ("Error Update Question: ".$uqquery."<br />"); // Checked) if (!$uqresult) { $bOnError = true; $aErrors = $oQuestion->getErrors(); if (count($aErrors)) { foreach ($aErrors as $sAttribute => $aStringErrors) { foreach ($aStringErrors as $sStringErrors) { Yii::app()->setFlashMessage(sprintf(gT("Question could not be updated with error on %s: %s"), $sAttribute, $sStringErrors), 'error'); } } } else { Yii::app()->setFlashMessage(gT("Question could not be updated."), 'error'); } } } } // Update the group ID on subquestions, too if ($oldgid != $iQuestionGroupID) { Question::model()->updateAll(array('gid' => $iQuestionGroupID), 'qid=:qid and parent_qid>0', array(':qid' => $iQuestionID)); // if the group has changed then fix the sortorder of old and new group Question::model()->updateQuestionOrder($oldgid, $iSurveyID); Question::model()->updateQuestionOrder($iQuestionGroupID, $iSurveyID); // If some questions have conditions set on this question's answers // then change the cfieldname accordingly fixMovedQuestionConditions($iQuestionID, $oldgid, $iQuestionGroupID); } // Update subquestions if ($oldtype != $sQuestionType) { Question::model()->updateAll(array('type' => $sQuestionType), 'parent_qid=:qid', array(':qid' => $iQuestionID)); } // Update subquestions if question module if (Yii::app()->request->getPost('module_name') != '') { // The question module is not empty. So it's an external question module. Question::model()->updateAll(array('modulename' => Yii::app()->request->getPost('module_name')), 'parent_qid=:qid', array(':qid' => $iQuestionID)); } else { // If it was a module before, we must Question::model()->updateAll(array('modulename' => ''), 'parent_qid=:qid', array(':qid' => $iQuestionID)); } Answer::model()->deleteAllByAttributes(array('qid' => $iQuestionID), 'scale_id >= :scale_id', array(':scale_id' => $iAnswerScales)); // Remove old subquestion scales Question::model()->deleteAllByAttributes(array('parent_qid' => $iQuestionID), 'scale_id >= :scale_id', array(':scale_id' => $iSubquestionScales)); if (!isset($bOnError) || !$bOnError) { // This really a quick hack and need a better system Yii::app()->setFlashMessage(gT("Question was successfully saved.")); } // } // else // { // // // There are conditions constraints: alert the user // $errormsg=""; // if (!is_null($array_result['notAbove'])) // { // $errormsg.=gT("This question relies on other question's answers and can't be moved above groupId:","js") // . " " . $array_result['notAbove'][0][0] . " " . gT("in position","js")." ".$array_result['notAbove'][0][1]."\\n" // . gT("See conditions:")."\\n"; // // foreach ($array_result['notAbove'] as $notAboveCond) // { // $errormsg.="- cid:". $notAboveCond[3]."\\n"; // } // // } // if (!is_null($array_result['notBelow'])) // { // $errormsg.=gT("Some questions rely on this question's answers. You can't move this question below groupId:","js") // . " " . $array_result['notBelow'][0][0] . " " . gT("in position","js")." ".$array_result['notBelow'][0][1]."\\n" // . 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 { Yii::app()->setFlashMessage(gT("Question could not be updated"), 'error'); } } LimeExpressionManager::UpgradeConditionsToRelevance($iSurveyID); if ($sDBOutput != '') { echo $sDBOutput; } else { $closeAfterSave = Yii::app()->request->getPost('close-after-save') === 'true'; if ($closeAfterSave) { // Redirect to summary $this->getController()->redirect(array('admin/questions/sa/view/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } else { // Redirect to edit $this->getController()->redirect(array('admin/questions/sa/editquestion/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); // This works too: $this->getController()->redirect(Yii::app()->request->urlReferrer); } } } /** * updatesurveylocalesettings */ if ($sAction == "updatesurveylocalesettings" && Permission::model()->hasSurveyPermission($iSurveyID, 'surveylocale', 'update')) { $languagelist = Survey::model()->findByPk($iSurveyID)->additionalLanguages; $languagelist[] = Survey::model()->findByPk($iSurveyID)->language; Yii::app()->loadHelper('database'); foreach ($languagelist as $langname) { if ($langname) { $url = Yii::app()->request->getPost('url_' . $langname); if ($url == 'http://') { $url = ""; } $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 = $oFixCKeditor->fixCKeditor($short_title); $description = $oFixCKeditor->fixCKeditor($description); $welcome = $oFixCKeditor->fixCKeditor($welcome); $endtext = $oFixCKeditor->fixCKeditor($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)); $SurveyLanguageSetting = SurveyLanguageSetting::model()->findByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $langname)); $SurveyLanguageSetting->attributes = $data; $SurveyLanguageSetting->save(); // save the change to database } } //Yii::app()->session['flashmessage'] = gT("Survey text elements successfully saved."); //////////////////////////////////////////////////////////////////////////////////// // General settings (copy / paste from surveyadmin::update) // Preload survey $oSurvey = Survey::model()->findByPk($iSurveyID); // Save plugin settings. $pluginSettings = App()->request->getPost('plugin', array()); foreach ($pluginSettings as $plugin => $settings) { $settingsEvent = new PluginEvent('newSurveySettings'); $settingsEvent->set('settings', $settings); $settingsEvent->set('survey', $iSurveyID); App()->getPluginManager()->dispatchEvent($settingsEvent, $plugin); } /* Start to fix some param before save (TODO : use models directly ?) */ /* Date management */ Yii::app()->loadHelper('surveytranslator'); $formatdata = getDateFormatData(Yii::app()->session['dateformat']); Yii::app()->loadLibrary('Date_Time_Converter'); $startdate = App()->request->getPost('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"); } $expires = App()->request->getPost('expires'); if (trim($expires) == "") { $expires = null; } else { $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"); } // We have $oSurvey : update and save it $oSurvey->owner_id = Yii::app()->request->getPost('owner_id'); $oSurvey->admin = Yii::app()->request->getPost('admin'); $oSurvey->expires = $expires; $oSurvey->startdate = $startdate; $oSurvey->faxto = App()->request->getPost('faxto'); $oSurvey->format = App()->request->getPost('format'); $oSurvey->template = Yii::app()->request->getPost('template'); $oSurvey->assessments = App()->request->getPost('assessments'); $oSurvey->additional_languages = Yii::app()->request->getPost('languageids'); if ($oSurvey->active != 'Y') { $oSurvey->anonymized = App()->request->getPost('anonymized'); $oSurvey->savetimings = App()->request->getPost('savetimings'); $oSurvey->datestamp = App()->request->getPost('datestamp'); $oSurvey->ipaddr = App()->request->getPost('ipaddr'); $oSurvey->refurl = App()->request->getPost('refurl'); } $oSurvey->publicgraphs = App()->request->getPost('publicgraphs'); $oSurvey->usecookie = App()->request->getPost('usecookie'); $oSurvey->allowregister = App()->request->getPost('allowregister'); $oSurvey->allowsave = App()->request->getPost('allowsave'); $oSurvey->navigationdelay = App()->request->getPost('navigationdelay'); $oSurvey->printanswers = App()->request->getPost('printanswers'); $oSurvey->publicstatistics = App()->request->getPost('publicstatistics'); $oSurvey->autoredirect = App()->request->getPost('autoredirect'); $oSurvey->showxquestions = App()->request->getPost('showxquestions'); $oSurvey->showgroupinfo = App()->request->getPost('showgroupinfo'); $oSurvey->showqnumcode = App()->request->getPost('showqnumcode'); $oSurvey->shownoanswer = App()->request->getPost('shownoanswer'); $oSurvey->showwelcome = App()->request->getPost('showwelcome'); $oSurvey->allowprev = App()->request->getPost('allowprev'); $oSurvey->questionindex = App()->request->getPost('questionindex'); $oSurvey->nokeyboard = App()->request->getPost('nokeyboard'); $oSurvey->showprogress = App()->request->getPost('showprogress'); $oSurvey->listpublic = App()->request->getPost('public'); $oSurvey->htmlemail = App()->request->getPost('htmlemail'); $oSurvey->sendconfirmation = App()->request->getPost('sendconfirmation'); $oSurvey->tokenanswerspersistence = App()->request->getPost('tokenanswerspersistence'); $oSurvey->alloweditaftercompletion = App()->request->getPost('alloweditaftercompletion'); $oSurvey->usecaptcha = Survey::transcribeCaptchaOptions(); $oSurvey->emailresponseto = App()->request->getPost('emailresponseto'); $oSurvey->emailnotificationto = App()->request->getPost('emailnotificationto'); $oSurvey->googleanalyticsapikey = App()->request->getPost('googleanalyticsapikey'); $oSurvey->googleanalyticsstyle = App()->request->getPost('googleanalyticsstyle'); $oSurvey->tokenlength = App()->request->getPost('tokenlength'); $oSurvey->adminemail = App()->request->getPost('adminemail'); $oSurvey->bounce_email = App()->request->getPost('bounce_email'); if ($oSurvey->save()) { Yii::app()->setFlashMessage(gT("Survey settings were successfully saved.")); } else { Yii::app()->setFlashMessage(gT("Survey could not be updated."), "error"); tracevar($oSurvey->getErrors()); } /* Reload $oSurvey (language are fixed : need it ?) */ $oSurvey = Survey::model()->findByPk($iSurveyID); /* Delete removed language cleanLanguagesFromSurvey do it already why redo it (cleanLanguagesFromSurvey must be moved to model) ?*/ $aAvailableLanguage = $oSurvey->getAllLanguages(); $oCriteria = new CDbCriteria(); $oCriteria->compare('surveyls_survey_id', $iSurveyID); $oCriteria->addNotInCondition('surveyls_language', $aAvailableLanguage); SurveyLanguageSetting::model()->deleteAll($oCriteria); /* Add new language fixLanguageConsistency do it ?*/ foreach ($oSurvey->additionalLanguages as $sLang) { if ($sLang) { $oLanguageSettings = SurveyLanguageSetting::model()->find('surveyls_survey_id=:surveyid AND surveyls_language=:langname', array(':surveyid' => $iSurveyID, ':langname' => $sLang)); if (!$oLanguageSettings) { $oLanguageSettings = new SurveyLanguageSetting(); $languagedetails = getLanguageDetails($sLang); $oLanguageSettings->surveyls_survey_id = $iSurveyID; $oLanguageSettings->surveyls_language = $sLang; $oLanguageSettings->surveyls_title = ''; // Not in default model ? $oLanguageSettings->surveyls_dateformat = $languagedetails['dateformat']; if (!$oLanguageSettings->save()) { Yii::app()->setFlashMessage(gT("Survey language could not be created."), "error"); tracevar($oLanguageSettings->getErrors()); } } } } /* Language fix : remove and add question/group */ cleanLanguagesFromSurvey($iSurveyID, implode(" ", $oSurvey->additionalLanguages)); fixLanguageConsistency($iSurveyID, implode(" ", $oSurvey->additionalLanguages)); // Url params in json $aURLParams = json_decode(Yii::app()->request->getPost('allurlparams'), true); SurveyURLParameter::model()->deleteAllByAttributes(array('sid' => $iSurveyID)); if (isset($aURLParams)) { 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'] = $iSurveyID; $param = new SurveyURLParameter(); foreach ($aURLParam as $k => $v) { $param->{$k} = $v; } $param->save(); } } //////////////////////////////////////// if ($sDBOutput != '') { echo $sDBOutput; } else { if (Yii::app()->request->getPost('close-after-save') === 'true') { $this->getController()->redirect(array('admin/survey/sa/view/surveyid/' . $iSurveyID)); } $this->getController()->redirect(array('/admin/survey/sa/editlocalsettings/surveyid/' . $iSurveyID)); } } $this->getController()->redirect(array("/admin"), "refresh"); }
/** * Database::index() * * @param mixed $sa * @return */ function index($sa = null) { $sAction = Yii::app()->request->getPost('action'); $iSurveyID = returnGlobal('sid'); $iQuestionGroupID = returnGlobal('gid'); $iQuestionID = returnGlobal('qid'); $sDBOutput = ''; $oFixCKeditor = new LSYii_Validators(); $oFixCKeditor->fixCKeditor = true; $oFixCKeditor->xssfilter = false; if ($sAction == "updatedefaultvalues" && Permission::model()->hasSurveyPermission($iSurveyID, 'surveycontent', 'update')) { $aSurveyLanguages = Survey::model()->findByPk($iSurveyID)->additionalLanguages; $sBaseLanguage = Survey::model()->findByPk($iSurveyID)->language; array_unshift($aSurveyLanguages, $sBaseLanguage); Question::model()->updateAll(array('same_default' => Yii::app()->request->getPost('samedefault') ? 1 : 0), 'sid=:sid ANd qid=:qid', array(':sid' => $iSurveyID, ':qid' => $iQuestionID)); $arQuestion = Question::model()->findByAttributes(array('qid' => $iQuestionID)); $sQuestionType = $arQuestion['type']; $aQuestionTypeList = getQuestionTypeList('', 'array'); if ($aQuestionTypeList[$sQuestionType]['answerscales'] > 0 && $aQuestionTypeList[$sQuestionType]['subquestions'] == 0) { for ($iScaleID = 0; $iScaleID < $aQuestionTypeList[$sQuestionType]['answerscales']; $iScaleID++) { foreach ($aSurveyLanguages as $sLanguage) { if (!is_null(Yii::app()->request->getPost('defaultanswerscale_' . $iScaleID . '_' . $sLanguage))) { $this->_updateDefaultValues($iQuestionID, 0, $iScaleID, '', $sLanguage, Yii::app()->request->getPost('defaultanswerscale_' . $iScaleID . '_' . $sLanguage), true); } if (!is_null(Yii::app()->request->getPost('other_' . $iScaleID . '_' . $sLanguage))) { $this->_updateDefaultValues($iQuestionID, 0, $iScaleID, 'other', $sLanguage, Yii::app()->request->getPost('other_' . $iScaleID . '_' . $sLanguage), true); } } } } if ($aQuestionTypeList[$sQuestionType]['subquestions'] > 0) { foreach ($aSurveyLanguages as $sLanguage) { $arQuestions = Question::model()->findAllByAttributes(array('sid' => $iSurveyID, 'gid' => $iQuestionGroupID, 'parent_qid' => $iQuestionID, 'language' => $sLanguage, 'scale_id' => 0)); for ($iScaleID = 0; $iScaleID < $aQuestionTypeList[$sQuestionType]['subquestions']; $iScaleID++) { foreach ($arQuestions as $aSubquestionrow) { if (!is_null(Yii::app()->request->getPost('defaultanswerscale_' . $iScaleID . '_' . $sLanguage . '_' . $aSubquestionrow['qid']))) { $this->_updateDefaultValues($iQuestionID, $aSubquestionrow['qid'], $iScaleID, '', $sLanguage, Yii::app()->request->getPost('defaultanswerscale_' . $iScaleID . '_' . $sLanguage . '_' . $aSubquestionrow['qid']), true); } } } } } if ($aQuestionTypeList[$sQuestionType]['answerscales'] == 0 && $aQuestionTypeList[$sQuestionType]['subquestions'] == 0) { foreach ($aSurveyLanguages as $sLanguage) { // Qick and dirty insert for yes/no defaul value // write the the selectbox option, or if "EM" is slected, this value to table if ($sQuestionType == 'Y') { /// value for all langs if (Yii::app()->request->getPost('samedefault') == 1) { $sLanguage = $aSurveyLanguages[0]; // turn } else { $sCurrentLang = $sLanguage; // edit the next lines } if (Yii::app()->request->getPost('defaultanswerscale_0_' . $sLanguage) == 'EM') { // Case EM, write expression to database $this->_updateDefaultValues($iQuestionID, 0, 0, '', $sLanguage, Yii::app()->request->getPost('defaultanswerscale_0_' . $sLanguage . '_EM'), true); } else { // Case "other", write list value to database $this->_updateDefaultValues($iQuestionID, 0, 0, '', $sLanguage, Yii::app()->request->getPost('defaultanswerscale_0_' . $sLanguage), true); } ///// end yes/no } else { if (!is_null(Yii::app()->request->getPost('defaultanswerscale_0_' . $sLanguage . '_0'))) { $this->_updateDefaultValues($iQuestionID, 0, 0, '', $sLanguage, Yii::app()->request->getPost('defaultanswerscale_0_' . $sLanguage . '_0'), true); } } } } Yii::app()->session['flashmessage'] = gT("Default value settings were successfully saved."); LimeExpressionManager::SetDirtyFlag(); if ($sDBOutput != '') { echo $sDBOutput; } else { $this->getController()->redirect(array('admin/survey/sa/view/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } } if ($sAction == "updateansweroptions" && Permission::model()->hasSurveyPermission($iSurveyID, 'surveycontent', 'update')) { Yii::app()->loadHelper('database'); $aSurveyLanguages = Survey::model()->findByPk($iSurveyID)->additionalLanguages; $sBaseLanguage = Survey::model()->findByPk($iSurveyID)->language; array_unshift($aSurveyLanguages, $sBaseLanguage); $arQuestion = Question::model()->findByAttributes(array('qid' => $iQuestionID)); $sQuestionType = $arQuestion['type']; // Checked) $aQuestionTypeList = getQuestionTypeList('', 'array'); $iScaleCount = $aQuestionTypeList[$sQuestionType]['answerscales']; //First delete all answers Answer::model()->deleteAllByAttributes(array('qid' => $iQuestionID)); LimeExpressionManager::RevertUpgradeConditionsToRelevance($iSurveyID); for ($iScaleID = 0; $iScaleID < $iScaleCount; $iScaleID++) { $iMaxCount = (int) Yii::app()->request->getPost('answercount_' . $iScaleID); for ($iSortOrderID = 1; $iSortOrderID < $iMaxCount; $iSortOrderID++) { $sCode = sanitize_paranoid_string(Yii::app()->request->getPost('code_' . $iSortOrderID . '_' . $iScaleID)); $iAssessmentValue = (int) Yii::app()->request->getPost('assessment_' . $iSortOrderID . '_' . $iScaleID); foreach ($aSurveyLanguages as $sLanguage) { $sAnswerText = Yii::app()->request->getPost('answer_' . $sLanguage . '_' . $iSortOrderID . '_' . $iScaleID); // Fix bug with FCKEditor saving strange BR types $sAnswerText = $oFixCKeditor->fixCKeditor($sAnswerText); // Now we insert the answers $iInsertCount = Answer::model()->insertRecords(array('code' => $sCode, 'answer' => $sAnswerText, 'qid' => $iQuestionID, 'sortorder' => $iSortOrderID, 'language' => $sLanguage, 'assessment_value' => $iAssessmentValue, 'scale_id' => $iScaleID)); if (!$iInsertCount) { Yii::app()->setFlashMessage(gT("Failed to update answers"), 'error'); } } // Updating code (oldcode!==null) => update condition with the new code $sOldCode = Yii::app()->request->getPost('oldcode_' . $iSortOrderID . '_' . $iScaleID); if (isset($sOldCode) && $sCode !== $sOldCode) { Condition::model()->updateAll(array('value' => $sCode), 'cqid=:cqid AND value=:value', array(':cqid' => $iQuestionID, ':value' => $sOldCode)); } } // for ($sortorderid=0;$sortorderid<$maxcount;$sortorderid++) } // for ($scale_id=0; LimeExpressionManager::UpgradeConditionsToRelevance($iSurveyID); if (!Yii::app()->request->getPost('bFullPOST')) { Yii::app()->setFlashMessage(gT("Not all answer options were saved. This usually happens due to server limitations ( PHP setting max_input_vars) - please contact your system administrator.")); } else { Yii::app()->session['flashmessage'] = gT("Answer options were successfully saved."); } LimeExpressionManager::SetDirtyFlag(); if ($sDBOutput != '') { echo $sDBOutput; } else { $this->getController()->redirect(array('/admin/questions/sa/answeroptions/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } } if ($sAction == "updatesubquestions" && Permission::model()->hasSurveyPermission($iSurveyID, 'surveycontent', 'update')) { Yii::app()->loadHelper('database'); $aSurveyLanguages = Survey::model()->findByPk($iSurveyID)->additionalLanguages; $sBaseLanguage = Survey::model()->findByPk($iSurveyID)->language; array_unshift($aSurveyLanguages, $sBaseLanguage); $arQuestion = Question::model()->findByAttributes(array('qid' => $iQuestionID)); $sQuestionType = $arQuestion['type']; // Checked $aQuestionTypeList = getQuestionTypeList('', 'array'); $iScaleCount = $aQuestionTypeList[$sQuestionType]['subquestions']; // First delete any deleted ids $aDeletedQIDs = explode(' ', trim(Yii::app()->request->getPost('deletedqids'))); LimeExpressionManager::RevertUpgradeConditionsToRelevance($iSurveyID); $aDeletedQIDs = array_unique($aDeletedQIDs, SORT_NUMERIC); foreach ($aDeletedQIDs as $iDeletedQID) { $iDeletedQID = (int) $iDeletedQID; if ($iDeletedQID > 0) { // don't remove undefined $iInsertCount = Question::model()->deleteAllByAttributes(array('qid' => $iDeletedQID)); if (!$iInsertCount) { Yii::app()->setFlashMessage(gT("Failed to delete answer"), 'error'); } } } //Determine ids by evaluating the hidden field $aRows = array(); $aCodes = array(); $aOldCodes = array(); $aRelevance = array(); foreach ($_POST as $sPOSTKey => $sPOSTValue) { $sPOSTKey = explode('_', $sPOSTKey); if ($sPOSTKey[0] == 'answer') { $aRows[$sPOSTKey[3]][$sPOSTKey[1]][$sPOSTKey[2]] = $sPOSTValue; } if ($sPOSTKey[0] == 'code') { $aCodes[$sPOSTKey[2]][] = $sPOSTValue; } if ($sPOSTKey[0] == 'oldcode') { $aOldCodes[$sPOSTKey[2]][] = $sPOSTValue; } if ($sPOSTKey[0] == 'relevance') { $aRelevance[$sPOSTKey[2]][] = $sPOSTValue; } } $aInsertQID = array(); for ($iScaleID = 0; $iScaleID < $iScaleCount; $iScaleID++) { foreach ($aSurveyLanguages as $sLanguage) { $iPosition = 0; foreach ($aRows[$iScaleID][$sLanguage] as $subquestionkey => $subquestionvalue) { if (substr($subquestionkey, 0, 3) != 'new') { $oSubQuestion = Question::model()->find("qid=:qid AND language=:language", array(":qid" => $subquestionkey, ':language' => $sLanguage)); $oSubQuestion->question_order = $iPosition + 1; $oSubQuestion->title = $aCodes[$iScaleID][$iPosition]; $oSubQuestion->question = $subquestionvalue; $oSubQuestion->scale_id = $iScaleID; //dual matrix, text/number matrix: subQ relevance per line not per scale, so ScaleID is always 0 $oSubQuestion->relevance = $aRelevance[0][$iPosition]; } else { if (!isset($aInsertQID[$iScaleID][$iPosition])) { $oSubQuestion = new Question(); $oSubQuestion->sid = $iSurveyID; $oSubQuestion->gid = $iQuestionGroupID; $oSubQuestion->question_order = $iPosition + 1; $oSubQuestion->title = $aCodes[$iScaleID][$iPosition]; $oSubQuestion->question = $subquestionvalue; $oSubQuestion->parent_qid = $iQuestionID; $oSubQuestion->language = $sLanguage; $oSubQuestion->scale_id = $iScaleID; $oSubQuestion->relevance = $aRelevance[0][$iPosition]; } else { $oSubQuestion = Question::model()->find("qid=:qid AND language=:language", array(":qid" => $aInsertQID[$iScaleID][$iPosition], ':language' => $sLanguage)); if (!$oSubQuestion) { $oSubQuestion = new Question(); } $oSubQuestion->sid = $iSurveyID; $oSubQuestion->qid = $aInsertQID[$iScaleID][$iPosition]; $oSubQuestion->gid = $iQuestionGroupID; $oSubQuestion->question_order = $iPosition + 1; $oSubQuestion->title = $aCodes[$iScaleID][$iPosition]; $oSubQuestion->question = $subquestionvalue; $oSubQuestion->parent_qid = $iQuestionID; $oSubQuestion->language = $sLanguage; $oSubQuestion->scale_id = $iScaleID; $oSubQuestion->relevance = $aRelevance[$iScaleID][$iPosition]; } } if ($oSubQuestion->qid) { switchMSSQLIdentityInsert('questions', true); $bSubQuestionResult = $oSubQuestion->save(); switchMSSQLIdentityInsert('questions', false); } else { $bSubQuestionResult = $oSubQuestion->save(); } if ($bSubQuestionResult) { if (substr($subquestionkey, 0, 3) != 'new' && isset($aOldCodes[$iScaleID][$iPosition]) && $aCodes[$iScaleID][$iPosition] !== $aOldCodes[$iScaleID][$iPosition]) { Condition::model()->updateAll(array('cfieldname' => '+' . $iSurveyID . 'X' . $iQuestionGroupID . 'X' . $iQuestionID . $aCodes[$iScaleID][$iPosition], 'value' => $aCodes[$iScaleID][$iPosition]), 'cqid=:cqid AND cfieldname=:cfieldname AND value=:value', array(':cqid' => $iQuestionID, ':cfieldname' => $iSurveyID . 'X' . $iQuestionGroupID . 'X' . $iQuestionID, ':value' => $aOldCodes[$iScaleID][$iPosition])); } if (!isset($aInsertQID[$iScaleID][$iPosition])) { $aInsertQID[$iScaleID][$iPosition] = $oSubQuestion->qid; } } else { $aErrors = $oSubQuestion->getErrors(); if (count($aErrors)) { //$sErrorMessage=gT("Question could not be updated with this errors:"); foreach ($aErrors as $sAttribute => $aStringErrors) { foreach ($aStringErrors as $sStringErrors) { Yii::app()->setFlashMessage(sprintf(gT("Error on %s for subquestion %s: %s"), $sAttribute, $aCodes[$iScaleID][$iPosition], $sStringErrors), 'error'); } } } else { Yii::app()->setFlashMessage(sprintf(gT("Subquestions %s could not be updated."), $aCodes[$iScaleID][$iPosition]), 'error'); } } $iPosition++; } } } LimeExpressionManager::UpgradeConditionsToRelevance($iSurveyID); // Do it only if there are no error ? if (!isset($aErrors) || !count($aErrors)) { if (!Yii::app()->request->getPost('bFullPOST')) { Yii::app()->session['flashmessage'] = gT("Not all subquestions were saved. This usually happens due to server limitations ( PHP setting max_input_vars) - please contact your system administrator."); } else { Yii::app()->session['flashmessage'] = gT("Subquestions were successfully saved."); } } //$action='editsubquestions'; LimeExpressionManager::SetDirtyFlag(); if ($sDBOutput != '') { echo $sDBOutput; } else { $this->getController()->redirect(array('/admin/questions/sa/subquestions/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } } if (in_array($sAction, array('insertquestion', 'copyquestion')) && Permission::model()->hasSurveyPermission($iSurveyID, 'surveycontent', 'create')) { $sBaseLanguage = Survey::model()->findByPk($iSurveyID)->language; if (strlen(Yii::app()->request->getPost('title')) < 1) { Yii::app()->setFlashMessage(gT("The question could not be added. You must enter at least a question code."), 'error'); } else { if (Yii::app()->request->getPost('questionposition', "") != "") { $iQuestionOrder = intval(Yii::app()->request->getPost('questionposition')); //Need to renumber all questions on or after this $sQuery = "UPDATE {{questions}} SET question_order=question_order+1 WHERE gid=:gid AND question_order >= :order"; Yii::app()->db->createCommand($sQuery)->bindValues(array(':gid' => $iQuestionGroupID, ':order' => $iQuestionOrder))->query(); } else { $iQuestionOrder = getMaxQuestionOrder($iQuestionGroupID, $iSurveyID); $iQuestionOrder++; } $sQuestionText = Yii::app()->request->getPost('question_' . $sBaseLanguage, ''); $sQuestionHelp = Yii::app()->request->getPost('help_' . $sBaseLanguage, ''); // Fix bug with FCKEditor saving strange BR types : in rules ? $sQuestionText = $oFixCKeditor->fixCKeditor($sQuestionText); $sQuestionHelp = $oFixCKeditor->fixCKeditor($sQuestionHelp); $iQuestionID = 0; $oQuestion = new Question(); $oQuestion->sid = $iSurveyID; $oQuestion->gid = $iQuestionGroupID; $oQuestion->type = Yii::app()->request->getPost('type'); $oQuestion->title = Yii::app()->request->getPost('title'); $oQuestion->question = $sQuestionText; $oQuestion->preg = Yii::app()->request->getPost('preg'); $oQuestion->help = $sQuestionHelp; $oQuestion->other = Yii::app()->request->getPost('other'); $oQuestion->mandatory = Yii::app()->request->getPost('mandatory'); $oQuestion->relevance = Yii::app()->request->getPost('relevance'); $oQuestion->question_order = $iQuestionOrder; $oQuestion->language = $sBaseLanguage; $oQuestion->save(); if ($oQuestion) { $iQuestionID = $oQuestion->qid; } $aErrors = $oQuestion->getErrors(); if (count($aErrors)) { foreach ($aErrors as $sAttribute => $aStringErrors) { foreach ($aStringErrors as $sStringErrors) { Yii::app()->setFlashMessage(sprintf(gT("Question could not be created with error on %s: %s"), $sAttribute, $sStringErrors), 'error'); } } } // Add other languages if ($iQuestionID) { $addlangs = Survey::model()->findByPk($iSurveyID)->additionalLanguages; foreach ($addlangs as $alang) { if ($alang != "") { $langqid = 0; $oQuestion = new Question(); $oQuestion->qid = $iQuestionID; $oQuestion->sid = $iSurveyID; $oQuestion->gid = $iQuestionGroupID; $oQuestion->type = Yii::app()->request->getPost('type'); $oQuestion->title = Yii::app()->request->getPost('title'); $oQuestion->question = Yii::app()->request->getPost('question_' . $alang); $oQuestion->preg = Yii::app()->request->getPost('preg'); $oQuestion->help = Yii::app()->request->getPost('help_' . $alang); $oQuestion->other = Yii::app()->request->getPost('other'); $oQuestion->mandatory = Yii::app()->request->getPost('mandatory'); $oQuestion->relevance = Yii::app()->request->getPost('relevance'); $oQuestion->question_order = $iQuestionOrder; $oQuestion->language = $alang; switchMSSQLIdentityInsert('questions', true); // Not sure for this one ? $oQuestion->save(); switchMSSQLIdentityInsert('questions', false); if ($oQuestion) { $langqid = $oQuestion->qid; } $aErrors = $oQuestion->getErrors(); if (count($aErrors)) { foreach ($aErrors as $sAttribute => $aStringErrors) { foreach ($aStringErrors as $sStringErrors) { Yii::app()->setFlashMessage(sprintf(gT("Question in language %s could not be created with error on %s: %s"), $alang, $sAttribute, $sStringErrors), 'error'); } } } # if (!$langqid) # { # Yii::app()->setFlashMessage(gT("Question in language %s could not be created."),'error'); # } } } } if (!$iQuestionID) { Yii::app()->setFlashMessage(gT("Question could not be created."), 'error'); } else { if ($sAction == 'copyquestion') { if (returnGlobal('copysubquestions') == "Y") { $aSQIDMappings = array(); $r1 = Question::model()->getSubQuestions(returnGlobal('oldqid')); $aSubQuestions = $r1->readAll(); foreach ($aSubQuestions as $qr1) { $qr1['parent_qid'] = $iQuestionID; if (isset($aSQIDMappings[$qr1['qid']])) { $qr1['qid'] = $aSQIDMappings[$qr1['qid']]; } else { $oldqid = $qr1['qid']; unset($qr1['qid']); } $qr1['gid'] = $iQuestionGroupID; $iInsertID = Question::model()->insertRecords($qr1); if (!isset($qr1['qid'])) { $aSQIDMappings[$oldqid] = $iInsertID; } } } if (returnGlobal('copyanswers') == "Y") { $r1 = Answer::model()->getAnswers(returnGlobal('oldqid')); $aAnswerOptions = $r1->readAll(); foreach ($aAnswerOptions as $qr1) { Answer::model()->insertRecords(array('qid' => $iQuestionID, 'code' => $qr1['code'], 'answer' => $qr1['answer'], 'assessment_value' => $qr1['assessment_value'], 'sortorder' => $qr1['sortorder'], 'language' => $qr1['language'], 'scale_id' => $qr1['scale_id'])); } } if (returnGlobal('copyattributes') == "Y") { $oOldAttributes = QuestionAttribute::model()->findAll("qid=:qid", array("qid" => returnGlobal('oldqid'))); foreach ($oOldAttributes as $oOldAttribute) { $attribute = new QuestionAttribute(); $attribute->qid = $iQuestionID; $attribute->value = $oOldAttribute->value; $attribute->attribute = $oOldAttribute->attribute; $attribute->language = $oOldAttribute->language; $attribute->save(); } } } else { $qattributes = questionAttributes(); $validAttributes = $qattributes[Yii::app()->request->getPost('type')]; $aLanguages = array_merge(array(Survey::model()->findByPk($iSurveyID)->language), Survey::model()->findByPk($iSurveyID)->additionalLanguages); foreach ($validAttributes as $validAttribute) { if ($validAttribute['i18n']) { foreach ($aLanguages as $sLanguage) { $value = Yii::app()->request->getPost($validAttribute['name'] . '_' . $sLanguage); $iInsertCount = QuestionAttribute::model()->findAllByAttributes(array('attribute' => $validAttribute['name'], 'qid' => $iQuestionID, 'language' => $sLanguage)); if (count($iInsertCount) > 0) { if ($value != '') { QuestionAttribute::model()->updateAll(array('value' => $value), 'attribute=:attribute AND qid=:qid AND language=:language', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID, ':language' => $sLanguage)); } else { QuestionAttribute::model()->deleteAll('attribute=:attribute AND qid=:qid AND language=:language', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID, ':language' => $sLanguage)); } } elseif ($value != '') { $attribute = new QuestionAttribute(); $attribute->qid = $iQuestionID; $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; } } $iInsertCount = QuestionAttribute::model()->findAllByAttributes(array('attribute' => $validAttribute['name'], 'qid' => $iQuestionID)); if (count($iInsertCount) > 0) { if ($value != $validAttribute['default'] && trim($value) != "") { QuestionAttribute::model()->updateAll(array('value' => $value), 'attribute=:attribute AND qid=:qid', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID)); } else { QuestionAttribute::model()->deleteAll('attribute=:attribute AND qid=:qid', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID)); } } elseif ($value != $validAttribute['default'] && trim($value) != "") { $attribute = new QuestionAttribute(); $attribute->qid = $iQuestionID; $attribute->value = $value; $attribute->attribute = $validAttribute['name']; $attribute->save(); } } } } Question::model()->updateQuestionOrder($iQuestionGroupID, $iSurveyID); Yii::app()->session['flashmessage'] = gT("Question was successfully added."); } } LimeExpressionManager::SetDirtyFlag(); // so refreshes syntax highlighting if ($sDBOutput != '') { echo $sDBOutput; } else { $this->getController()->redirect(array('admin/survey/sa/view/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } } if ($sAction == "updatequestion" && Permission::model()->hasSurveyPermission($iSurveyID, 'surveycontent', 'update')) { LimeExpressionManager::RevertUpgradeConditionsToRelevance($iSurveyID); $cqr = Question::model()->findByAttributes(array('qid' => $iQuestionID)); $oldtype = $cqr['type']; $oldgid = $cqr['gid']; // Remove invalid question attributes on saving $qattributes = questionAttributes(); $criteria = new CDbCriteria(); $criteria->compare('qid', $iQuestionID); if (isset($qattributes[Yii::app()->request->getPost('type')])) { $validAttributes = $qattributes[Yii::app()->request->getPost('type')]; foreach ($validAttributes as $validAttribute) { $criteria->compare('attribute', '<>' . $validAttribute['name']); } } QuestionAttribute::model()->deleteAll($criteria); $aLanguages = array_merge(array(Survey::model()->findByPk($iSurveyID)->language), Survey::model()->findByPk($iSurveyID)->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); $iInsertCount = QuestionAttribute::model()->findAllByAttributes(array('attribute' => $validAttribute['name'], 'qid' => $iQuestionID, 'language' => $sLanguage)); if (count($iInsertCount) > 0) { if ($value != '') { QuestionAttribute::model()->updateAll(array('value' => $value), 'attribute=:attribute AND qid=:qid AND language=:language', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID, ':language' => $sLanguage)); } else { QuestionAttribute::model()->deleteAll('attribute=:attribute AND qid=:qid AND language=:language', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID, ':language' => $sLanguage)); } } elseif ($value != '') { $attribute = new QuestionAttribute(); $attribute->qid = $iQuestionID; $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; } } $iInsertCount = QuestionAttribute::model()->findAllByAttributes(array('attribute' => $validAttribute['name'], 'qid' => $iQuestionID)); if (count($iInsertCount) > 0) { if ($value != $validAttribute['default'] && trim($value) != "") { QuestionAttribute::model()->updateAll(array('value' => $value), 'attribute=:attribute AND qid=:qid', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID)); } else { QuestionAttribute::model()->deleteAll('attribute=:attribute AND qid=:qid', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID)); } } elseif ($value != $validAttribute['default'] && trim($value) != "") { $attribute = new QuestionAttribute(); $attribute->qid = $iQuestionID; $attribute->value = $value; $attribute->attribute = $validAttribute['name']; $attribute->save(); } } } $aQuestionTypeList = getQuestionTypeList('', 'array'); // These are the questions types that have no answers and therefore we delete the answer in that case $iAnswerScales = $aQuestionTypeList[Yii::app()->request->getPost('type')]['answerscales']; $iSubquestionScales = $aQuestionTypeList[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 Condition->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 = Condition::model()->findAllByAttributes(array('cqid' => $iQuestionID)); $cccount = count($ccresult); foreach ($ccresult as $ccr) { $qidarray[] = $ccr['qid']; } if (isset($qidarray) && $qidarray) { $qidlist = implode(", ", $qidarray); } } if (isset($cccount) && $cccount) { Yii::app()->setFlashMessage(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."), 'error'); } else { if (isset($iQuestionGroupID) && $iQuestionGroupID != "") { // $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'])) // { $aSurveyLanguages = Survey::model()->findByPk($iSurveyID)->additionalLanguages; $sBaseLanguage = Survey::model()->findByPk($iSurveyID)->language; array_push($aSurveyLanguages, $sBaseLanguage); foreach ($aSurveyLanguages as $qlang) { if (isset($qlang) && $qlang != "") { // é to é and & to & : really needed ? Why not for answers ? (130307) $sQuestionText = Yii::app()->request->getPost('question_' . $qlang, ''); $sQuestionHelp = Yii::app()->request->getPost('help_' . $qlang, ''); // Fix bug with FCKEditor saving strange BR types : in rules ? $sQuestionText = $oFixCKeditor->fixCKeditor($sQuestionText); $sQuestionHelp = $oFixCKeditor->fixCKeditor($sQuestionHelp); $udata = array('type' => Yii::app()->request->getPost('type'), 'title' => Yii::app()->request->getPost('title'), 'question' => $sQuestionText, 'preg' => Yii::app()->request->getPost('preg'), 'help' => $sQuestionHelp, 'gid' => $iQuestionGroupID, 'other' => Yii::app()->request->getPost('other'), 'mandatory' => Yii::app()->request->getPost('mandatory'), 'relevance' => Yii::app()->request->getPost('relevance')); if ($oldgid != $iQuestionGroupID) { if (getGroupOrder($iSurveyID, $oldgid) > getGroupOrder($iSurveyID, $iQuestionGroupID)) { // TMSW Condition->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($iQuestionGroupID, $iSurveyID) + 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($iSurveyID, $iQuestionGroupID, 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); $oQuestion = Question::model()->findByPk(array("qid" => $iQuestionID, 'language' => $qlang)); foreach ($udata as $k => $v) { $oQuestion->{$k} = $v; } $uqresult = $oQuestion->save(); //($uqquery); // or safeDie ("Error Update Question: ".$uqquery."<br />"); // Checked) if (!$uqresult) { $bOnError = true; $aErrors = $oQuestion->getErrors(); if (count($aErrors)) { foreach ($aErrors as $sAttribute => $aStringErrors) { foreach ($aStringErrors as $sStringErrors) { Yii::app()->setFlashMessage(sprintf(gT("Question could not be updated with error on %s: %s"), $sAttribute, $sStringErrors), 'error'); } } } else { Yii::app()->setFlashMessage(gT("Question could not be updated."), 'error'); } } } } // Update the group ID on subquestions, too if ($oldgid != $iQuestionGroupID) { Question::model()->updateAll(array('gid' => $iQuestionGroupID), 'qid=:qid and parent_qid>0', array(':qid' => $iQuestionID)); // if the group has changed then fix the sortorder of old and new group Question::model()->updateQuestionOrder($oldgid, $iSurveyID); Question::model()->updateQuestionOrder($iQuestionGroupID, $iSurveyID); // If some questions have conditions set on this question's answers // then change the cfieldname accordingly fixMovedQuestionConditions($iQuestionID, $oldgid, $iQuestionGroupID); } if ($oldtype != Yii::app()->request->getPost('type')) { Question::model()->updateAll(array('type' => Yii::app()->request->getPost('type')), 'parent_qid=:qid', array(':qid' => $iQuestionID)); } Answer::model()->deleteAllByAttributes(array('qid' => $iQuestionID), 'scale_id >= :scale_id', array(':scale_id' => $iAnswerScales)); // Remove old subquestion scales Question::model()->deleteAllByAttributes(array('parent_qid' => $iQuestionID), 'scale_id >= :scale_id', array(':scale_id' => $iSubquestionScales)); if (!isset($bOnError) || !$bOnError) { // This really a quick hack and need a better system Yii::app()->setFlashMessage(gT("Question was successfully saved.")); } // } // else // { // // // There are conditions constraints: alert the user // $errormsg=""; // if (!is_null($array_result['notAbove'])) // { // $errormsg.=gT("This question relies on other question's answers and can't be moved above groupId:","js") // . " " . $array_result['notAbove'][0][0] . " " . gT("in position","js")." ".$array_result['notAbove'][0][1]."\\n" // . gT("See conditions:")."\\n"; // // foreach ($array_result['notAbove'] as $notAboveCond) // { // $errormsg.="- cid:". $notAboveCond[3]."\\n"; // } // // } // if (!is_null($array_result['notBelow'])) // { // $errormsg.=gT("Some questions rely on this question's answers. You can't move this question below groupId:","js") // . " " . $array_result['notBelow'][0][0] . " " . gT("in position","js")." ".$array_result['notBelow'][0][1]."\\n" // . 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 { Yii::app()->setFlashMessage(gT("Question could not be updated"), 'error'); } } LimeExpressionManager::UpgradeConditionsToRelevance($iSurveyID); if ($sDBOutput != '') { echo $sDBOutput; } else { if (Yii::app()->request->getPost('redirection') == "edit") { $this->getController()->redirect(array('admin/questions/sa/editquestion/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } else { $this->getController()->redirect(array('admin/survey/sa/view/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } } } if ($sAction == "updatesurveylocalesettings" && Permission::model()->hasSurveyPermission($iSurveyID, 'surveylocale', 'update')) { $languagelist = Survey::model()->findByPk($iSurveyID)->additionalLanguages; $languagelist[] = Survey::model()->findByPk($iSurveyID)->language; Yii::app()->loadHelper('database'); foreach ($languagelist as $langname) { if ($langname) { $url = Yii::app()->request->getPost('url_' . $langname); if ($url == 'http://') { $url = ""; } $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 = $oFixCKeditor->fixCKeditor($short_title); $description = $oFixCKeditor->fixCKeditor($description); $welcome = $oFixCKeditor->fixCKeditor($welcome); $endtext = $oFixCKeditor->fixCKeditor($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)); $SurveyLanguageSetting = SurveyLanguageSetting::model()->findByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $langname)); $SurveyLanguageSetting->attributes = $data; $SurveyLanguageSetting->save(); // save the change to database } } Yii::app()->session['flashmessage'] = gT("Survey text elements successfully saved."); if ($sDBOutput != '') { echo $sDBOutput; } else { $this->getController()->redirect(array('admin/survey/sa/view/surveyid/' . $iSurveyID)); } } $this->getController()->redirect(array("/admin"), "refresh"); }
/** * checkMovequestionConstraintsForConditions() * @param string $sid - the currently selected survey * @param string $qid - qid of the question you want to check possible moves * @param string $newgid - (optionnal) get only constraints when trying to move to this particular GroupId * otherwise, get all moves constraints for this question * * @return array - returns an array describing the conditions * Array * ( * ['notAbove'] = null | Array * ( * Array ( gid1, group_order1, qid1, cid1 ) * ) * ['notBelow'] = null | Array * ( * Array ( gid2, group_order2, qid2, cid2 ) * ) * ) * * This should be read as: * - this question can't be move above group gid1 in position group_order1 because of the condition cid1 on question qid1 * - this question can't be move below group gid2 in position group_order2 because of the condition cid2 on question qid2 * */ function checkMovequestionConstraintsForConditions($sid, $qid, $newgid = "all") { global $connect; $resarray = array(); $resarray['notAbove'] = null; // defaults to no constraint $resarray['notBelow'] = null; // defaults to no constraint $sid = sanitize_int($sid); $qid = sanitize_int($qid); if ($newgid != "all") { $newgid = sanitize_int($newgid); $newgorder = getGroupOrder($sid, $newgid); } else { $neworder = ""; // Not used in this case } $baselang = GetBaseLanguageFromSurveyID($sid); // First look for 'my dependencies': questions on which I have set conditions $condquery = "SELECT tq.qid as depqid, tq.gid as depgid, tg.group_order as depgorder, " . "tq2.qid as targqid, tq2.gid as targgid, tg2.group_order as targgorder, " . "tc.cid FROM " . db_table_name('conditions') . " AS tc, " . db_table_name('questions') . " AS tq, " . db_table_name('questions') . " AS tq2, " . db_table_name('groups') . " AS tg, " . db_table_name('groups') . " AS tg2 " . "WHERE tq.language='{$baselang}' AND tq2.language='{$baselang}' AND tc.qid = tq.qid AND tq.sid={$sid} " . "AND tq2.qid=tc.cqid AND tg.gid=tq.gid AND tg2.gid=tq2.gid AND tq.qid={$qid} ORDER BY tg2.group_order DESC"; $condresult = db_execute_assoc($condquery) or safe_die($connect->ErrorMsg()); //Checked if ($condresult->RecordCount() > 0) { while ($condrow = $condresult->FetchRow()) { // This Question can go up to the minimum GID on the 1st row $depqid = $condrow['depqid']; $depgid = $condrow['depgid']; $depgorder = $condrow['depgorder']; $targetqid = $condrow['targqid']; $targetgid = $condrow['targgid']; $targetgorder = $condrow['targgorder']; $condid = $condrow['cid']; //echo "This question can't go above to GID=$targetgid/order=$targetgorder because of CID=$condid"; if ($newgid != "all") { // Get only constraints when trying to move to this group if ($newgorder < $targetgorder) { $resarray['notAbove'][] = array($targetgid, $targetgorder, $depqid, $condid); } } else { // get all moves constraints $resarray['notAbove'][] = array($targetgid, $targetgorder, $depqid, $condid); } } } // Secondly look for 'questions dependent on me': questions that have conditions on my answers $condquery = "SELECT tq.qid as depqid, tq.gid as depgid, tg.group_order as depgorder, " . "tq2.qid as targqid, tq2.gid as targgid, tg2.group_order as targgorder, " . "tc.cid FROM " . db_table_name('conditions') . " AS tc, " . db_table_name('questions') . " AS tq, " . db_table_name('questions') . " AS tq2, " . db_table_name('groups') . " AS tg, " . db_table_name('groups') . " AS tg2 " . "WHERE tq.language='{$baselang}' AND tq2.language='{$baselang}' AND tc.qid = tq.qid AND tq.sid={$sid} " . "AND tq2.qid=tc.cqid AND tg.gid=tq.gid AND tg2.gid=tq2.gid AND tq2.qid={$qid} ORDER BY tg.group_order"; $condresult = db_execute_assoc($condquery) or safe_die($connect->ErrorMsg()); //Checked if ($condresult->RecordCount() > 0) { while ($condrow = $condresult->FetchRow()) { // This Question can go down to the maximum GID on the 1st row $depqid = $condrow['depqid']; $depgid = $condrow['depgid']; $depgorder = $condrow['depgorder']; $targetqid = $condrow['targqid']; $targetgid = $condrow['targgid']; $targetgorder = $condrow['targgorder']; $condid = $condrow['cid']; //echo "This question can't go below to GID=$depgid/order=$depgorder because of CID=$condid"; if ($newgid != "all") { // Get only constraints when trying to move to this group if ($newgorder > $depgorder) { $resarray['notBelow'][] = array($depgid, $depgorder, $depqid, $condid); } } else { // get all moves constraints $resarray['notBelow'][] = array($depgid, $depgorder, $depqid, $condid); } } } return $resarray; }
/** * 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"); } }
/** * Database::index() * * @param mixed $sa * @return */ function index($sa = null) { $sAction = Yii::app()->request->getPost('action'); $clang = $this->getController()->lang; $iSurveyID = returnGlobal('sid'); $iQuestionGroupID = returnGlobal('gid'); $iQuestionID = returnGlobal('qid'); $sDBOutput = ''; if (Yii::app()->getConfig('filterxsshtml') && !Permission::model()->hasGlobalPermission('superadmin', 'read')) { $oPurifier = new CHtmlPurifier(); $oPurifier->options = array('URI.AllowedSchemes' => array('http' => true, 'https' => true)); $bXSSFilter = true; } else { $bXSSFilter = false; } if ($sAction == "updatedefaultvalues" && Permission::model()->hasSurveyPermission($iSurveyID, 'surveycontent', 'update')) { $aSurveyLanguages = Survey::model()->findByPk($iSurveyID)->additionalLanguages; $sBaseLanguage = Survey::model()->findByPk($iSurveyID)->language; array_unshift($aSurveyLanguages, $sBaseLanguage); Question::model()->updateAll(array('same_default' => Yii::app()->request->getPost('samedefault') ? 1 : 0), 'sid=:sid ANd qid=:qid', array(':sid' => $iSurveyID, ':qid' => $iQuestionID)); $arQuestion = Question::model()->findByAttributes(array('qid' => $iQuestionID)); $sQuestionType = $arQuestion['type']; $aQuestionTypeList = getQuestionTypeList('', 'array'); if ($aQuestionTypeList[$sQuestionType]['answerscales'] > 0 && $aQuestionTypeList[$sQuestionType]['subquestions'] == 0) { for ($iScaleID = 0; $iScaleID < $aQuestionTypeList[$sQuestionType]['answerscales']; $iScaleID++) { foreach ($aSurveyLanguages as $sLanguage) { if (!is_null(Yii::app()->request->getPost('defaultanswerscale_' . $iScaleID . '_' . $sLanguage))) { $this->_updateDefaultValues($iQuestionID, 0, $iScaleID, '', $sLanguage, Yii::app()->request->getPost('defaultanswerscale_' . $iScaleID . '_' . $sLanguage), true); } if (!is_null(Yii::app()->request->getPost('other_' . $iScaleID . '_' . $sLanguage))) { $this->_updateDefaultValues($iQuestionID, 0, $iScaleID, 'other', $sLanguage, Yii::app()->request->getPost('other_' . $iScaleID . '_' . $sLanguage), true); } } } } if ($aQuestionTypeList[$sQuestionType]['subquestions'] > 0) { foreach ($aSurveyLanguages as $sLanguage) { $arQuestions = Question::model()->findAllByAttributes(array('sid' => $iSurveyID, 'gid' => $iQuestionGroupID, 'parent_qid' => $iQuestionID, 'language' => $sLanguage, 'scale_id' => 0)); for ($iScaleID = 0; $iScaleID < $aQuestionTypeList[$sQuestionType]['subquestions']; $iScaleID++) { foreach ($arQuestions as $aSubquestionrow) { if (!is_null(Yii::app()->request->getPost('defaultanswerscale_' . $iScaleID . '_' . $sLanguage . '_' . $aSubquestionrow['qid']))) { $this->_updateDefaultValues($iQuestionID, $aSubquestionrow['qid'], $iScaleID, '', $sLanguage, Yii::app()->request->getPost('defaultanswerscale_' . $iScaleID . '_' . $sLanguage . '_' . $aSubquestionrow['qid']), true); } } } } } if ($aQuestionTypeList[$sQuestionType]['answerscales'] == 0 && $aQuestionTypeList[$sQuestionType]['subquestions'] == 0) { foreach ($aSurveyLanguages as $sLanguage) { if (!is_null(Yii::app()->request->getPost('defaultanswerscale_0_' . $sLanguage . '_0'))) { $this->_updateDefaultValues($iQuestionID, 0, 0, '', $sLanguage, Yii::app()->request->getPost('defaultanswerscale_0_' . $sLanguage . '_0'), true); } } } Yii::app()->session['flashmessage'] = $clang->gT("Default value settings were successfully saved."); LimeExpressionManager::SetDirtyFlag(); if ($sDBOutput != '') { echo $sDBOutput; } else { $this->getController()->redirect(array('admin/survey/sa/view/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } } if ($sAction == "updateansweroptions" && Permission::model()->hasSurveyPermission($iSurveyID, 'surveycontent', 'update')) { Yii::app()->loadHelper('database'); $aSurveyLanguages = Survey::model()->findByPk($iSurveyID)->additionalLanguages; $sBaseLanguage = Survey::model()->findByPk($iSurveyID)->language; array_unshift($aSurveyLanguages, $sBaseLanguage); $arQuestion = Question::model()->findByAttributes(array('qid' => $iQuestionID)); $sQuestionType = $arQuestion['type']; // Checked) $aQuestionTypeList = getQuestionTypeList('', 'array'); $iScaleCount = $aQuestionTypeList[$sQuestionType]['answerscales']; //First delete all answers Answer::model()->deleteAllByAttributes(array('qid' => $iQuestionID)); LimeExpressionManager::RevertUpgradeConditionsToRelevance($iSurveyID); for ($iScaleID = 0; $iScaleID < $iScaleCount; $iScaleID++) { $iMaxCount = (int) Yii::app()->request->getPost('answercount_' . $iScaleID); for ($iSortOrderID = 1; $iSortOrderID < $iMaxCount; $iSortOrderID++) { $sCode = sanitize_paranoid_string(Yii::app()->request->getPost('code_' . $iSortOrderID . '_' . $iScaleID)); if (Yii::app()->request->getPost('oldcode_' . $iSortOrderID . '_' . $iScaleID)) { $sOldCode = sanitize_paranoid_string(Yii::app()->request->getPost('oldcode_' . $iSortOrderID . '_' . $iScaleID)); if ($sCode !== $sOldCode) { Condition::model()->updateAll(array('value' => $sCode), 'cqid=:cqid AND value=:value', array(':cqid' => $iQuestionID, ':value' => $sOldCode)); } } $iAssessmentValue = (int) Yii::app()->request->getPost('assessment_' . $iSortOrderID . '_' . $iScaleID); foreach ($aSurveyLanguages as $sLanguage) { $sAnswerText = Yii::app()->request->getPost('answer_' . $sLanguage . '_' . $iSortOrderID . '_' . $iScaleID); if ($bXSSFilter) { $sAnswerText = $oPurifier->purify($sAnswerText); } else { $sAnswerText = html_entity_decode($sAnswerText, ENT_QUOTES, "UTF-8"); } // Fix bug with FCKEditor saving strange BR types $sAnswerText = fixCKeditorText($sAnswerText); // Now we insert the answers $iInsertCount = Answer::model()->insertRecords(array('code' => $sCode, 'answer' => $sAnswerText, 'qid' => $iQuestionID, 'sortorder' => $iSortOrderID, 'language' => $sLanguage, 'assessment_value' => $iAssessmentValue, 'scale_id' => $iScaleID)); if (!$iInsertCount) { Yii::app()->setFlashMessage($clang->gT("Failed to update answers"), 'error'); } } // foreach ($alllanguages as $language) if (isset($sOldCode) && $sCode !== $sOldCode) { Condition::model()->updateAll(array('value' => $sCode), 'cqid=:cqid AND value=:value', array(':cqid' => $iQuestionID, ':value' => $sOldCode)); } } // for ($sortorderid=0;$sortorderid<$maxcount;$sortorderid++) } // for ($scale_id=0; LimeExpressionManager::UpgradeConditionsToRelevance($iSurveyID); if (!Yii::app()->request->getPost('bFullPOST')) { Yii::app()->setFlashMessage($clang->gT("Not all answer options were saved. This usually happens due to server limitations ( PHP setting max_input_vars) - please contact your system administrator.")); } else { Yii::app()->session['flashmessage'] = $clang->gT("Answer options were successfully saved."); } LimeExpressionManager::SetDirtyFlag(); if ($sDBOutput != '') { echo $sDBOutput; } else { $this->getController()->redirect(array('/admin/questions/sa/answeroptions/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } } if ($sAction == "updatesubquestions" && Permission::model()->hasSurveyPermission($iSurveyID, 'surveycontent', 'update')) { Yii::app()->loadHelper('database'); $aSurveyLanguages = Survey::model()->findByPk($iSurveyID)->additionalLanguages; $sBaseLanguage = Survey::model()->findByPk($iSurveyID)->language; array_unshift($aSurveyLanguages, $sBaseLanguage); $arQuestion = Question::model()->findByAttributes(array('qid' => $iQuestionID)); $sQuestionType = $arQuestion['type']; // Checked $aQuestionTypeList = getQuestionTypeList('', 'array'); $iScaleCount = $aQuestionTypeList[$sQuestionType]['subquestions']; $clang = $this->getController()->lang; // First delete any deleted ids $aDeletedQIDs = explode(' ', trim(Yii::app()->request->getPost('deletedqids'))); LimeExpressionManager::RevertUpgradeConditionsToRelevance($iSurveyID); $aDeletedQIDs = array_unique($aDeletedQIDs, SORT_NUMERIC); foreach ($aDeletedQIDs as $iDeletedQID) { $iDeletedQID = (int) $iDeletedQID; if ($iDeletedQID > 0) { // don't remove undefined $iInsertCount = Question::model()->deleteAllByAttributes(array('qid' => $iDeletedQID)); if (!$iInsertCount) { Yii::app()->setFlashMessage($clang->gT("Failed to delete answer"), 'error'); } } } //Determine ids by evaluating the hidden field $aRows = array(); $aCodes = array(); $aOldCodes = array(); foreach ($_POST as $sPOSTKey => $sPOSTValue) { $sPOSTKey = explode('_', $sPOSTKey); if ($sPOSTKey[0] == 'answer') { $aRows[$sPOSTKey[3]][$sPOSTKey[1]][$sPOSTKey[2]] = $sPOSTValue; } if ($sPOSTKey[0] == 'code') { $aCodes[$sPOSTKey[2]][] = $sPOSTValue; } if ($sPOSTKey[0] == 'oldcode') { $aOldCodes[$sPOSTKey[2]][] = $sPOSTValue; } } $aInsertQID = array(); for ($iScaleID = 0; $iScaleID < $iScaleCount; $iScaleID++) { foreach ($aSurveyLanguages as $sLanguage) { $iPosition = 0; foreach ($aRows[$iScaleID][$sLanguage] as $subquestionkey => $subquestionvalue) { if (substr($subquestionkey, 0, 3) != 'new') { $oSubQuestion = Question::model()->find("qid=:qid AND language=:language", array(":qid" => $subquestionkey, ':language' => $sLanguage)); $oSubQuestion->question_order = $iPosition + 1; $oSubQuestion->title = $aCodes[$iScaleID][$iPosition]; $oSubQuestion->question = $subquestionvalue; $oSubQuestion->scale_id = $iScaleID; } else { if (!isset($aInsertQID[$iScaleID][$iPosition])) { $oSubQuestion = new Question(); $oSubQuestion->sid = $iSurveyID; $oSubQuestion->gid = $iQuestionGroupID; $oSubQuestion->question_order = $iPosition + 1; $oSubQuestion->title = $aCodes[$iScaleID][$iPosition]; $oSubQuestion->question = $subquestionvalue; $oSubQuestion->parent_qid = $iQuestionID; $oSubQuestion->language = $sLanguage; $oSubQuestion->scale_id = $iScaleID; } else { $oSubQuestion = Question::model()->find("qid=:qid AND language=:language", array(":qid" => $aInsertQID[$iScaleID][$iPosition], ':language' => $sLanguage)); if (!$oSubQuestion) { $oSubQuestion = new Question(); } $oSubQuestion->sid = $iSurveyID; $oSubQuestion->qid = $aInsertQID[$iScaleID][$iPosition]; $oSubQuestion->gid = $iQuestionGroupID; $oSubQuestion->question_order = $iPosition + 1; $oSubQuestion->title = $aCodes[$iScaleID][$iPosition]; $oSubQuestion->question = $subquestionvalue; $oSubQuestion->parent_qid = $iQuestionID; $oSubQuestion->language = $sLanguage; $oSubQuestion->scale_id = $iScaleID; } } $bSubQuestionResult = $oSubQuestion->save(); if ($bSubQuestionResult) { if (substr($subquestionkey, 0, 3) != 'new' && isset($aOldCodes[$iScaleID][$iPosition]) && $aCodes[$iScaleID][$iPosition] !== $aOldCodes[$iScaleID][$iPosition]) { Condition::model()->updateAll(array('cfieldname' => '+' . $iSurveyID . 'X' . $iQuestionGroupID . 'X' . $iQuestionID . $aCodes[$iScaleID][$iPosition], 'value' => $aCodes[$iScaleID][$iPosition]), 'cqid=:cqid AND cfieldname=:cfieldname AND value=:value', array(':cqid' => $iQuestionID, ':cfieldname' => $iSurveyID . 'X' . $iQuestionGroupID . 'X' . $iQuestionID, ':value' => $aOldCodes[$iScaleID][$iPosition])); } if (!isset($aInsertQID[$iScaleID][$iPosition])) { $aInsertQID[$iScaleID][$iPosition] = $oSubQuestion->qid; } } else { $aErrors = $oSubQuestion->getErrors(); if (count($aErrors)) { //$sErrorMessage=$clang->gT("Question could not be updated with this errors:"); foreach ($aErrors as $sAttribute => $aStringErrors) { foreach ($aStringErrors as $sStringErrors) { Yii::app()->setFlashMessage(sprintf($clang->gT("Error on %s for subquestion %s: %s"), $sAttribute, $aCodes[$iScaleID][$iPosition], $sStringErrors), 'error'); } } } else { Yii::app()->setFlashMessage(sprintf($clang->gT("Subquestions %s could not be updated."), $aCodes[$iScaleID][$iPosition]), 'error'); } } $iPosition++; } } } LimeExpressionManager::UpgradeConditionsToRelevance($iSurveyID); // Do it only if there are no error ? if (!isset($aErrors) || !count($aErrors)) { if (!Yii::app()->request->getPost('bFullPOST')) { Yii::app()->session['flashmessage'] = $clang->gT("Not all subquestions were saved. This usually happens due to server limitations ( PHP setting max_input_vars) - please contact your system administrator."); } else { Yii::app()->session['flashmessage'] = $clang->gT("Subquestions were successfully saved."); } } //$action='editsubquestions'; LimeExpressionManager::SetDirtyFlag(); if ($sDBOutput != '') { echo $sDBOutput; } else { $this->getController()->redirect(array('/admin/questions/sa/subquestions/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } } if (in_array($sAction, array('insertquestion', 'copyquestion')) && Permission::model()->hasSurveyPermission($iSurveyID, 'surveycontent', 'create')) { $sBaseLanguage = Survey::model()->findByPk($iSurveyID)->language; if (strlen(Yii::app()->request->getPost('title')) < 1) { Yii::app()->setFlashMessage($clang->gT("The question could not be added. You must enter at least a question code."), 'error'); } else { if (Yii::app()->request->getPost('questionposition', "") != "") { $iQuestionOrder = intval(Yii::app()->request->getPost('questionposition')); //Need to renumber all questions on or after this $sQuery = "UPDATE {{questions}} SET question_order=question_order+1 WHERE gid=:gid AND question_order >= :order"; Yii::app()->db->createCommand($sQuery)->bindValues(array(':gid' => $iQuestionGroupID, ':order' => $iQuestionOrder))->query(); } else { $iQuestionOrder = getMaxQuestionOrder($iQuestionGroupID, $iSurveyID); $iQuestionOrder++; } $_POST['title'] = html_entity_decode(Yii::app()->request->getPost('title'), ENT_QUOTES, "UTF-8"); $_POST['question_' . $sBaseLanguage] = html_entity_decode(Yii::app()->request->getPost('question_' . $sBaseLanguage), ENT_QUOTES, "UTF-8"); $_POST['help_' . $sBaseLanguage] = html_entity_decode(Yii::app()->request->getPost('help_' . $sBaseLanguage), ENT_QUOTES, "UTF-8"); $_POST['title'] = fixCKeditorText(Yii::app()->request->getPost('title')); $_POST['question_' . $sBaseLanguage] = fixCKeditorText(Yii::app()->request->getPost('question_' . $sBaseLanguage)); $_POST['help_' . $sBaseLanguage] = fixCKeditorText(Yii::app()->request->getPost('help_' . $sBaseLanguage)); $iQuestionID = 0; $oQuestion = new Question(); $oQuestion->sid = $iSurveyID; $oQuestion->gid = $iQuestionGroupID; $oQuestion->type = Yii::app()->request->getPost('type'); $oQuestion->title = Yii::app()->request->getPost('title'); $oQuestion->question = Yii::app()->request->getPost('question_' . $sBaseLanguage); $oQuestion->preg = Yii::app()->request->getPost('preg'); $oQuestion->help = Yii::app()->request->getPost('help_' . $sBaseLanguage); $oQuestion->other = Yii::app()->request->getPost('other'); $oQuestion->mandatory = Yii::app()->request->getPost('mandatory'); $oQuestion->relevance = Yii::app()->request->getPost('relevance'); $oQuestion->question_order = $iQuestionOrder; $oQuestion->language = $sBaseLanguage; $oQuestion->save(); if ($oQuestion) { $iQuestionID = $oQuestion->qid; } $aErrors = $oQuestion->getErrors(); if (count($aErrors)) { foreach ($aErrors as $sAttribute => $aStringErrors) { foreach ($aStringErrors as $sStringErrors) { Yii::app()->setFlashMessage(sprintf($clang->gT("Question could not be created with error on %s: %s"), $sAttribute, $sStringErrors), 'error'); } } } // Add other languages if ($iQuestionID) { $addlangs = Survey::model()->findByPk($iSurveyID)->additionalLanguages; foreach ($addlangs as $alang) { if ($alang != "") { $langqid = 0; $oQuestion = new Question(); $oQuestion->qid = $iQuestionID; $oQuestion->sid = $iSurveyID; $oQuestion->gid = $iQuestionGroupID; $oQuestion->type = Yii::app()->request->getPost('type'); $oQuestion->title = Yii::app()->request->getPost('title'); $oQuestion->question = Yii::app()->request->getPost('question_' . $alang); $oQuestion->preg = Yii::app()->request->getPost('preg'); $oQuestion->help = Yii::app()->request->getPost('help_' . $alang); $oQuestion->other = Yii::app()->request->getPost('other'); $oQuestion->mandatory = Yii::app()->request->getPost('mandatory'); $oQuestion->relevance = Yii::app()->request->getPost('relevance'); $oQuestion->question_order = $iQuestionOrder; $oQuestion->language = $alang; switchMSSQLIdentityInsert('questions', true); // Not sure for this one ? $oQuestion->save(); switchMSSQLIdentityInsert('questions', false); if ($oQuestion) { $langqid = $oQuestion->qid; } $aErrors = $oQuestion->getErrors(); if (count($aErrors)) { foreach ($aErrors as $sAttribute => $aStringErrors) { foreach ($aStringErrors as $sStringErrors) { Yii::app()->setFlashMessage(sprintf($clang->gT("Question in language %s could not be created with error on %s: %s"), $alang, $sAttribute, $sStringErrors), 'error'); } } } # if (!$langqid) # { # Yii::app()->setFlashMessage($clang->gT("Question in language %s could not be created."),'error'); # } } } } if (!$iQuestionID) { Yii::app()->setFlashMessage($clang->gT("Question could not be created."), 'error'); } else { if ($sAction == 'copyquestion') { if (returnGlobal('copysubquestions') == "Y") { $aSQIDMappings = array(); $r1 = Question::model()->getSubQuestions(returnGlobal('oldqid')); while ($qr1 = $r1->read()) { $qr1['parent_qid'] = $iQuestionID; if (isset($aSQIDMappings[$qr1['qid']])) { $qr1['qid'] = $aSQIDMappings[$qr1['qid']]; } else { $oldqid = $qr1['qid']; unset($qr1['qid']); } $qr1['gid'] = $iQuestionGroupID; $iInsertID = Question::model()->insertRecords($qr1); if (!isset($qr1['qid'])) { $aSQIDMappings[$oldqid] = $iInsertID; } } } if (returnGlobal('copyanswers') == "Y") { $r1 = Answer::model()->getAnswers(returnGlobal('oldqid')); while ($qr1 = $r1->read()) { Answer::model()->insertRecords(array('qid' => $iQuestionID, 'code' => $qr1['code'], 'answer' => $qr1['answer'], 'assessment_value' => $qr1['assessment_value'], 'sortorder' => $qr1['sortorder'], 'language' => $qr1['language'], 'scale_id' => $qr1['scale_id'])); } } if (returnGlobal('copyattributes') == "Y") { $oOldAttributes = QuestionAttribute::model()->findAll("qid=:qid", array("qid" => returnGlobal('oldqid'))); foreach ($oOldAttributes as $oOldAttribute) { $attribute = new QuestionAttribute(); $attribute->qid = $iQuestionID; $attribute->value = $oOldAttribute->value; $attribute->attribute = $oOldAttribute->attribute; $attribute->language = $oOldAttribute->language; $attribute->save(); } } } else { $qattributes = questionAttributes(); $validAttributes = $qattributes[Yii::app()->request->getPost('type')]; $aLanguages = array_merge(array(Survey::model()->findByPk($iSurveyID)->language), Survey::model()->findByPk($iSurveyID)->additionalLanguages); foreach ($validAttributes as $validAttribute) { if ($validAttribute['i18n']) { foreach ($aLanguages as $sLanguage) { $value = Yii::app()->request->getPost($validAttribute['name'] . '_' . $sLanguage); $iInsertCount = QuestionAttribute::model()->findAllByAttributes(array('attribute' => $validAttribute['name'], 'qid' => $iQuestionID, 'language' => $sLanguage)); if (count($iInsertCount) > 0) { if ($value != '') { QuestionAttribute::model()->updateAll(array('value' => $value), 'attribute=:attribute AND qid=:qid AND language=:language', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID, ':language' => $sLanguage)); } else { QuestionAttribute::model()->deleteAll('attribute=:attribute AND qid=:qid AND language=:language', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID, ':language' => $sLanguage)); } } elseif ($value != '') { $attribute = new QuestionAttribute(); $attribute->qid = $iQuestionID; $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; } } $iInsertCount = QuestionAttribute::model()->findAllByAttributes(array('attribute' => $validAttribute['name'], 'qid' => $iQuestionID)); if (count($iInsertCount) > 0) { if ($value != $validAttribute['default'] && trim($value) != "") { QuestionAttribute::model()->updateAll(array('value' => $value), 'attribute=:attribute AND qid=:qid', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID)); } else { QuestionAttribute::model()->deleteAll('attribute=:attribute AND qid=:qid', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID)); } } elseif ($value != $validAttribute['default'] && trim($value) != "") { $attribute = new QuestionAttribute(); $attribute->qid = $iQuestionID; $attribute->value = $value; $attribute->attribute = $validAttribute['name']; $attribute->save(); } } } } Question::model()->updateQuestionOrder($iQuestionGroupID, $iSurveyID); Yii::app()->session['flashmessage'] = $clang->gT("Question was successfully added."); } } LimeExpressionManager::SetDirtyFlag(); // so refreshes syntax highlighting if ($sDBOutput != '') { echo $sDBOutput; } else { $this->getController()->redirect(array('admin/survey/sa/view/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } } if ($sAction == "updatequestion" && Permission::model()->hasSurveyPermission($iSurveyID, 'surveycontent', 'update')) { LimeExpressionManager::RevertUpgradeConditionsToRelevance($iSurveyID); $cqr = Question::model()->findByAttributes(array('qid' => $iQuestionID)); $oldtype = $cqr['type']; $oldgid = $cqr['gid']; // Remove invalid question attributes on saving $qattributes = questionAttributes(); $criteria = new CDbCriteria(); $criteria->compare('qid', $iQuestionID); if (isset($qattributes[Yii::app()->request->getPost('type')])) { $validAttributes = $qattributes[Yii::app()->request->getPost('type')]; foreach ($validAttributes as $validAttribute) { $criteria->compare('attribute', '<>' . $validAttribute['name']); } } QuestionAttribute::model()->deleteAll($criteria); $aLanguages = array_merge(array(Survey::model()->findByPk($iSurveyID)->language), Survey::model()->findByPk($iSurveyID)->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); $iInsertCount = QuestionAttribute::model()->findAllByAttributes(array('attribute' => $validAttribute['name'], 'qid' => $iQuestionID, 'language' => $sLanguage)); if (count($iInsertCount) > 0) { if ($value != '') { QuestionAttribute::model()->updateAll(array('value' => $value), 'attribute=:attribute AND qid=:qid AND language=:language', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID, ':language' => $sLanguage)); } else { QuestionAttribute::model()->deleteAll('attribute=:attribute AND qid=:qid AND language=:language', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID, ':language' => $sLanguage)); } } elseif ($value != '') { $attribute = new QuestionAttribute(); $attribute->qid = $iQuestionID; $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; } } $iInsertCount = QuestionAttribute::model()->findAllByAttributes(array('attribute' => $validAttribute['name'], 'qid' => $iQuestionID)); if (count($iInsertCount) > 0) { if ($value != $validAttribute['default'] && trim($value) != "") { QuestionAttribute::model()->updateAll(array('value' => $value), 'attribute=:attribute AND qid=:qid', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID)); } else { QuestionAttribute::model()->deleteAll('attribute=:attribute AND qid=:qid', array(':attribute' => $validAttribute['name'], ':qid' => $iQuestionID)); } } elseif ($value != $validAttribute['default'] && trim($value) != "") { $attribute = new QuestionAttribute(); $attribute->qid = $iQuestionID; $attribute->value = $value; $attribute->attribute = $validAttribute['name']; $attribute->save(); } } } $aQuestionTypeList = getQuestionTypeList('', 'array'); // These are the questions types that have no answers and therefore we delete the answer in that case $iAnswerScales = $aQuestionTypeList[Yii::app()->request->getPost('type')]['answerscales']; $iSubquestionScales = $aQuestionTypeList[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 Condition->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 = Condition::model()->findAllByAttributes(array('cqid' => $iQuestionID)); $cccount = count($ccresult); foreach ($ccresult as $ccr) { $qidarray[] = $ccr['qid']; } if (isset($qidarray) && $qidarray) { $qidlist = implode(", ", $qidarray); } } if (isset($cccount) && $cccount) { Yii::app()->setFlashMessage($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."), 'error'); } else { if (isset($iQuestionGroupID) && $iQuestionGroupID != "") { // $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'])) // { $aSurveyLanguages = Survey::model()->findByPk($iSurveyID)->additionalLanguages; $sBaseLanguage = Survey::model()->findByPk($iSurveyID)->language; array_push($aSurveyLanguages, $sBaseLanguage); if ($bXSSFilter) { $_POST['title'] = $oPurifier->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 ($aSurveyLanguages as $qlang) { if ($bXSSFilter) { $_POST['question_' . $qlang] = $oPurifier->purify($_POST['question_' . $qlang]); $_POST['help_' . $qlang] = $oPurifier->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 : in rules ? $_POST['question_' . $qlang] = fixCKeditorText(Yii::app()->request->getPost('question_' . $qlang)); $_POST['help_' . $qlang] = fixCKeditorText(Yii::app()->request->getPost('help_' . $qlang)); if (isset($qlang) && $qlang != "") { $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' => $iQuestionGroupID, 'other' => Yii::app()->request->getPost('other'), 'mandatory' => Yii::app()->request->getPost('mandatory'), 'relevance' => Yii::app()->request->getPost('relevance')); if ($oldgid != $iQuestionGroupID) { if (getGroupOrder($iSurveyID, $oldgid) > getGroupOrder($iSurveyID, $iQuestionGroupID)) { // TMSW Condition->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($iQuestionGroupID, $iSurveyID) + 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($iSurveyID, $iQuestionGroupID, 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); $oQuestion = Question::model()->findByPk(array("qid" => $iQuestionID, 'language' => $qlang)); foreach ($udata as $k => $v) { $oQuestion->{$k} = $v; } $uqresult = $oQuestion->save(); //($uqquery); // or safeDie ("Error Update Question: ".$uqquery."<br />"); // Checked) if (!$uqresult) { $bOnError = true; $aErrors = $oQuestion->getErrors(); if (count($aErrors)) { foreach ($aErrors as $sAttribute => $aStringErrors) { foreach ($aStringErrors as $sStringErrors) { Yii::app()->setFlashMessage(sprintf($clang->gT("Question could not be updated with error on %s: %s"), $sAttribute, $sStringErrors), 'error'); } } } else { Yii::app()->setFlashMessage($clang->gT("Question could not be updated."), 'error'); } } } } // Update the group ID on subquestions, too if ($oldgid != $iQuestionGroupID) { Question::model()->updateAll(array('gid' => $iQuestionGroupID), 'qid=:qid and parent_qid>0', array(':qid' => $iQuestionID)); // if the group has changed then fix the sortorder of old and new group Question::model()->updateQuestionOrder($oldgid, $iSurveyID); Question::model()->updateQuestionOrder($iQuestionGroupID, $iSurveyID); // If some questions have conditions set on this question's answers // then change the cfieldname accordingly fixMovedQuestionConditions($iQuestionID, $oldgid, $iQuestionGroupID); } if ($oldtype != Yii::app()->request->getPost('type')) { Question::model()->updateAll(array('type' => Yii::app()->request->getPost('type')), 'parent_qid=:qid', array(':qid' => $iQuestionID)); } Answer::model()->deleteAllByAttributes(array('qid' => $iQuestionID), 'scale_id >= :scale_id', array(':scale_id' => $iAnswerScales)); // Remove old subquestion scales Question::model()->deleteAllByAttributes(array('parent_qid' => $iQuestionID), 'scale_id >= :scale_id', array(':scale_id' => $iSubquestionScales)); if (!isset($bOnError) || !$bOnError) { // This really a quick hack and need a better system Yii::app()->setFlashMessage($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 { Yii::app()->setFlashMessage($clang->gT("Question could not be updated"), 'error'); } } LimeExpressionManager::UpgradeConditionsToRelevance($iSurveyID); if ($sDBOutput != '') { echo $sDBOutput; } else { if (Yii::app()->request->getPost('redirection') == "edit") { $this->getController()->redirect(array('admin/questions/sa/editquestion/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } else { $this->getController()->redirect(array('admin/survey/sa/view/surveyid/' . $iSurveyID . '/gid/' . $iQuestionGroupID . '/qid/' . $iQuestionID)); } } } if ($sAction == "updatesurveylocalesettings" && Permission::model()->hasSurveyPermission($iSurveyID, 'surveylocale', 'update')) { $languagelist = Survey::model()->findByPk($iSurveyID)->additionalLanguages; $languagelist[] = Survey::model()->findByPk($iSurveyID)->language; Yii::app()->loadHelper('database'); foreach ($languagelist as $langname) { if ($langname) { $url = Yii::app()->request->getPost('url_' . $langname); if ($url == 'http://') { $url = ""; } $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)); $SurveyLanguageSetting = SurveyLanguageSetting::model()->findByPk(array('surveyls_survey_id' => $iSurveyID, 'surveyls_language' => $langname)); $SurveyLanguageSetting->attributes = $data; $SurveyLanguageSetting->save(); // save the change to database } } Yii::app()->session['flashmessage'] = $clang->gT("Survey text elements successfully saved."); if ($sDBOutput != '') { echo $sDBOutput; } else { $this->getController()->redirect(array('admin/survey/sa/view/surveyid/' . $iSurveyID)); } } if (($sAction == "updatesurveysettingsandeditlocalesettings" || $sAction == "updatesurveysettings") && Permission::model()->hasSurveyPermission($iSurveyID, 'surveysettings', 'update')) { // Save plugin settings. $pluginSettings = App()->request->getPost('plugin', array()); foreach ($pluginSettings as $plugin => $settings) { $settingsEvent = new PluginEvent('newSurveySettings'); $settingsEvent->set('settings', $settings); $settingsEvent->set('survey', $iSurveyID); App()->getPluginManager()->dispatchEvent($settingsEvent, $plugin); } 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; } if ($tokenlength > 36) { $tokenlength = 36; } cleanLanguagesFromSurvey($iSurveyID, Yii::app()->request->getPost('languageids')); fixLanguageConsistency($iSurveyID, Yii::app()->request->getPost('languageids')); $template = Yii::app()->request->getPost('template'); if (!Permission::model()->hasGlobalPermission('superadmin', 'read') && !Permission::model()->hasGlobalPermission('templates', 'read') && !hasTemplateManageRights(Yii::app()->session['loginID'], $template)) { $template = "default"; } $aURLParams = json_decode(Yii::app()->request->getPost('allurlparams'), true); SurveyURLParameter::model()->deleteAllByAttributes(array('sid' => $iSurveyID)); if (isset($aURLParams)) { 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'] = $iSurveyID; $param = new SurveyURLParameter(); foreach ($aURLParam as $k => $v) { $param->{$k} = $v; } $param->save(); } } $updatearray = array('admin' => Yii::app()->request->getPost('admin'), 'expires' => $expires, 'startdate' => $startdate, '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'), 'questionindex' => Yii::app()->request->getPost('questionindex'), '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); $warning = ''; // make sure we only update admin email if it is valid if (Yii::app()->request->getPost('adminemail', '') == '' || validateEmailAddress(Yii::app()->request->getPost('adminemail'))) { $updatearray['adminemail'] = Yii::app()->request->getPost('adminemail'); } else { $warning .= $clang->gT("Warning! Notification email was not updated because it was not valid.") . '<br/>'; } // make sure we only update bounce email if it is valid if (Yii::app()->request->getPost('bounce_email', '') == '' || validateEmailAddress(Yii::app()->request->getPost('bounce_email'))) { $updatearray['bounce_email'] = Yii::app()->request->getPost('bounce_email'); } else { $warning .= $clang->gT("Warning! Bounce email was not updated because it was not valid.") . '<br/>'; } // use model $Survey = Survey::model()->findByPk($iSurveyID); 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' => $iSurveyID, ':base' => Survey::model()->findByPk($iSurveyID)->language); $i = 100000; foreach (Survey::model()->findByPk($iSurveyID)->additionalLanguages as $langname) { if ($langname) { $sqlstring .= "AND surveyls_language <> :{$i} "; $params[':' . $i] = $langname; } $i++; } SurveyLanguageSetting::model()->deleteAll($sqlstring, $params); $usresult = true; foreach (Survey::model()->findByPk($iSurveyID)->additionalLanguages as $langname) { if ($langname) { $oLanguageSettings = SurveyLanguageSetting::model()->find('surveyls_survey_id=:surveyid AND surveyls_language=:langname', array(':surveyid' => $iSurveyID, ':langname' => $langname)); if (!$oLanguageSettings) { $oLanguageSettings = new SurveyLanguageSetting(); $languagedetails = getLanguageDetails($langname); $insertdata = array('surveyls_survey_id' => $iSurveyID, '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'] = $warning . $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(array('admin/survey/sa/editlocalsettings/surveyid/' . $iSurveyID)); } else { $this->getController()->redirect(array('admin/survey/sa/view/surveyid/' . $iSurveyID)); } } if (!$sAction) { $this->getController()->redirect(array("/admin"), "refresh"); } }