/** * fixes the numbering of questions * This can happen if question 1 have subquestion code 1 and have question 11 in same survey and group (then same SGQA) * @param int $fixnumbering * @todo can call this function (no $_GET, but getParam) AND do it with Yii */ function fixNumbering($iQuestionID, $iSurveyID) { Yii::app()->loadHelper("database"); LimeExpressionManager::RevertUpgradeConditionsToRelevance($iSurveyID); //Fix a question id - requires renumbering a question $iQuestionID = (int) $iQuestionID; $iMaxQID = Question::model()->getMaxId('qid', true); // Always refresh as we insert new qid's $iNewQID = $iMaxQID + 1; // Not sure we can do this in MSSQL ? $sQuery = "UPDATE {{questions}} SET qid={$iNewQID} WHERE qid={$iQuestionID}"; Yii::app()->db->createCommand($sQuery)->query(); // Update subquestions $sQuery = "UPDATE {{questions}} SET parent_qid={$iNewQID} WHERE parent_qid={$iQuestionID}"; Yii::app()->db->createCommand($sQuery)->query(); //Update conditions.. firstly conditions FOR this question $sQuery = "UPDATE {{conditions}} SET qid={$iNewQID} WHERE qid={$iQuestionID}"; Yii::app()->db->createCommand($sQuery)->query(); //Update default values $sQuery = "UPDATE {{defaultvalues}} SET qid={$iNewQID} WHERE qid={$iQuestionID}"; Yii::app()->db->createCommand($sQuery)->query(); $sQuery = "UPDATE {{defaultvalues}} SET sqid={$iNewQID} WHERE sqid={$iQuestionID}"; Yii::app()->db->createCommand($sQuery)->query(); //Update quotas $sQuery = "UPDATE {{quota_members}} SET qid={$iNewQID} WHERE qid={$iQuestionID}"; Yii::app()->db->createCommand($sQuery)->query(); //Update url params $sQuery = "UPDATE {{survey_url_parameters}} SET targetqid={$iNewQID} WHERE targetqid={$iQuestionID}"; Yii::app()->db->createCommand($sQuery)->query(); $sQuery = "UPDATE {{survey_url_parameters}} SET targetsqid={$iNewQID} WHERE targetsqid={$iQuestionID}"; Yii::app()->db->createCommand($sQuery)->query(); //Now conditions based upon this question $sQuery = "SELECT cqid, cfieldname FROM {{conditions}} WHERE cqid={$iQuestionID}"; $sResult = Yii::app()->db->createCommand($sQuery)->query(); foreach ($sResult->readAll() as $row) { $aSwitcher[] = array("cqid" => $row['cqid'], "cfieldname" => $row['cfieldname']); } if (isset($aSwitcher)) { foreach ($aSwitcher as $aSwitch) { $sQuery = "UPDATE {{conditions}}\n SET cqid={$iNewQID},\n cfieldname='" . str_replace("X" . $iQuestionID, "X" . $iNewQID, $aSwitch['cfieldname']) . "'\n WHERE cqid={$iQuestionID}"; $sResult = db_execute_assosc($sQuery); } } //Now question_attributes $sQuery = "UPDATE {{question_attributes}} SET qid={$iNewQID} WHERE qid={$iQuestionID}"; Yii::app()->db->createCommand($sQuery)->query(); //Now answers $sQuery = "UPDATE {{answers}} SET qid={$iNewQID} WHERE qid={$iQuestionID}"; Yii::app()->db->createCommand($sQuery)->query(); LimeExpressionManager::UpgradeConditionsToRelevance($iSurveyID); }
/** * fixes the numbering of questions * @param <type> $fixnumbering */ function fixNumbering($fixnumbering, $iSurveyID) { Yii::app()->loadHelper("database"); LimeExpressionManager::RevertUpgradeConditionsToRelevance($iSurveyID); //Fix a question id - requires renumbering a question $oldqid = $fixnumbering; $query = "SELECT qid FROM {{questions}} ORDER BY qid DESC"; $result = dbSelectLimitAssoc($query, 1); foreach ($result->readAll() as $row) { $lastqid = $row['qid']; } $newqid = $lastqid + 1; $query = "UPDATE {{questions}} SET qid={$newqid} WHERE qid={$oldqid}"; $result = db_execute_assosc($query); // Update subquestions $query = "UPDATE {{questions}} SET parent_qid={$newqid} WHERE parent_qid={$oldqid}"; $result = db_execute_assosc($query); //Update conditions.. firstly conditions FOR this question $query = "UPDATE {{conditions}} SET qid={$newqid} WHERE qid={$oldqid}"; $result = db_execute_assosc($query); //Now conditions based upon this question $query = "SELECT cqid, cfieldname FROM {{conditions}} WHERE cqid={$oldqid}"; $result = dbExecuteAssoc($query); foreach ($result->readAll() as $row) { $switcher[] = array("cqid" => $row['cqid'], "cfieldname" => $row['cfieldname']); } if (isset($switcher)) { foreach ($switcher as $switch) { $query = "UPDATE {{conditions}}\n SET cqid={$newqid},\n cfieldname='" . str_replace("X" . $oldqid, "X" . $newqid, $switch['cfieldname']) . "'\n WHERE cqid={$oldqid}"; $result = db_execute_assosc($query); } } // TMSW Conditions->Relevance: (1) Call LEM->ConvertConditionsToRelevance()when done. (2) Should relevance for old conditions be removed first? //Now question_attributes $query = "UPDATE {{question_attributes}} SET qid={$newqid} WHERE qid={$oldqid}"; $result = db_execute_assosc($query); //Now answers $query = "UPDATE {{answers}} SET qid={$newqid} WHERE qid={$oldqid}"; $result = db_execute_assosc($query); LimeExpressionManager::UpgradeConditionsToRelevance($iSurveyID); }
/** * fixes the numbering of questions * @global $dbprefix $dbprefix * @global $connect $connect * @global $clang $clang * @param <type> $fixnumbering */ function fixNumbering($fixnumbering) { global $dbprefix, $connect, $clang, $surveyid; LimeExpressionManager::RevertUpgradeConditionsToRelevance($surveyid); //Fix a question id - requires renumbering a question $oldqid = sanitize_int($fixnumbering); $query = "SELECT qid FROM {$dbprefix}questions ORDER BY qid DESC"; $result = db_select_limit_assoc($query, 1) or safe_die($query . "<br />" . $connect->ErrorMsg()); while ($row = $result->FetchRow()) { $lastqid = $row['qid']; } $newqid = $lastqid + 1; $query = "UPDATE {$dbprefix}questions SET qid={$newqid} WHERE qid={$oldqid}"; $result = $connect->Execute($query) or safe_die($query . "<br />" . $connect->ErrorMsg()); // Update subquestions $query = "UPDATE {$dbprefix}questions SET parent_qid={$newqid} WHERE parent_qid={$oldqid}"; $result = $connect->Execute($query) or safe_die($query . "<br />" . $connect->ErrorMsg()); //Update conditions.. firstly conditions FOR this question $query = "UPDATE {$dbprefix}conditions SET qid={$newqid} WHERE qid={$oldqid}"; $result = $connect->Execute($query) or safe_die($query . "<br />" . $connect->ErrorMsg()); //Now conditions based upon this question $query = "SELECT cqid, cfieldname FROM {$dbprefix}conditions WHERE cqid={$oldqid}"; $result = db_execute_assoc($query) or safe_die($query . "<br />" . $connect->ErrorMsg()); while ($row = $result->FetchRow()) { $switcher[] = array("cqid" => $row['cqid'], "cfieldname" => $row['cfieldname']); } if (isset($switcher)) { foreach ($switcher as $switch) { $query = "UPDATE {$dbprefix}conditions\n SET cqid={$newqid},\n cfieldname='" . str_replace("X" . $oldqid, "X" . $newqid, $switch['cfieldname']) . "'\n WHERE cqid={$oldqid}"; $result = $connect->Execute($query) or safe_die($query . "<br />" . $connect->ErrorMsg()); } } //Now question_attributes $query = "UPDATE {$dbprefix}question_attributes SET qid={$newqid} WHERE qid={$oldqid}"; $result = $connect->Execute($query) or safe_die($query . "<br />" . $connect->ErrorMsg()); //Now answers $query = "UPDATE {$dbprefix}answers SET qid={$newqid} WHERE qid={$oldqid}"; $result = $connect->Execute($query) or safe_die($query . "<br />" . $connect->ErrorMsg()); LimeExpressionManager::UpgradeConditionsToRelevance($surveyid); }
function index($subaction, $iSurveyID = null, $gid = null, $qid = null) { $iSurveyID = sanitize_int($iSurveyID); $gid = sanitize_int($gid); $qid = sanitize_int($qid); $clang = $this->getController()->lang; $imageurl = Yii::app()->getConfig("adminimageurl"); Yii::app()->loadHelper("database"); if (!empty($_POST['subaction'])) { $subaction = Yii::app()->request->getPost('subaction'); } //BEGIN Sanitizing POSTed data if (!isset($iSurveyID)) { $iSurveyID = returnGlobal('sid'); } if (!isset($qid)) { $qid = returnGlobal('qid'); } if (!isset($gid)) { $gid = returnGlobal('gid'); } if (!isset($p_scenario)) { $p_scenario = returnGlobal('scenario'); } if (!isset($p_cqid)) { $p_cqid = returnGlobal('cqid'); if ($p_cqid == '') { $p_cqid = 0; } // we are not using another question as source of condition } if (!isset($p_cid)) { $p_cid = returnGlobal('cid'); } if (!isset($p_subaction)) { if (isset($_POST['subaction'])) { $p_subaction = $_POST['subaction']; } else { $p_subaction = $subaction; } } if (!isset($p_cquestions)) { $p_cquestions = returnGlobal('cquestions'); } if (!isset($p_csrctoken)) { $p_csrctoken = returnGlobal('csrctoken'); } if (!isset($p_prevquestionsgqa)) { $p_prevquestionsgqa = returnGlobal('prevQuestionSGQA'); } if (!isset($p_canswers)) { if (isset($_POST['canswers']) && is_array($_POST['canswers'])) { foreach ($_POST['canswers'] as $key => $val) { $p_canswers[$key] = preg_replace("/[^_.a-zA-Z0-9]@/", "", $val); } } } // this array will be used soon, // to explain wich conditions is used to evaluate the question if (Yii::app()->getConfig('stringcomparizonoperators') == 1) { $method = array("<" => $clang->gT("Less than"), "<=" => $clang->gT("Less than or equal to"), "==" => $clang->gT("equals"), "!=" => $clang->gT("Not equal to"), ">=" => $clang->gT("Greater than or equal to"), ">" => $clang->gT("Greater than"), "RX" => $clang->gT("Regular expression"), "a<b" => $clang->gT("Less than (Strings)"), "a<=b" => $clang->gT("Less than or equal to (Strings)"), "a>=b" => $clang->gT("Greater than or equal to (Strings)"), "a>b" => $clang->gT("Greater than (Strings)")); } else { $method = array("<" => $clang->gT("Less than"), "<=" => $clang->gT("Less than or equal to"), "==" => $clang->gT("equals"), "!=" => $clang->gT("Not equal to"), ">=" => $clang->gT("Greater than or equal to"), ">" => $clang->gT("Greater than"), "RX" => $clang->gT("Regular expression")); } if (isset($_POST['method'])) { if (!in_array($_POST['method'], array_keys($method))) { $p_method = "=="; } else { $p_method = trim($_POST['method']); } } if (isset($_POST['newscenarionum'])) { $p_newscenarionum = sanitize_int($_POST['newscenarionum']); } //END Sanitizing POSTed data //include_once("login_check.php"); include_once "database.php"; // Caution (lemeur): database.php uses autoUnescape on all entries in $_POST // Take care to not use autoUnescape on $_POST variables after this $br = CHtml::openTag('br /'); //MAKE SURE THAT THERE IS A SID if (!isset($iSurveyID) || !$iSurveyID) { $conditionsoutput = $clang->gT("You have not selected a survey") . str_repeat($br, 2); $conditionsoutput .= CHtml::submitButton($clang->gT("Main admin screen"), array('onclick' => "window.open('" . $this->getController()->createUrl("admin/") . "', '_top')")) . $br; safeDie($conditionsoutput); return; } if (isset($p_subaction) && $p_subaction == "resetsurveylogic") { $clang = $this->getController()->lang; $resetsurveylogicoutput = $br; $resetsurveylogicoutput .= CHtml::openTag('table', array('class' => 'alertbox')); $resetsurveylogicoutput .= CHtml::openTag('tr') . CHtml::openTag('td', array('colspan' => '2')); $resetsurveylogicoutput .= CHtml::tag('font', array('size' => '1'), CHtml::tag('strong', array(), $clang->gT("Reset Survey Logic"))); $resetsurveylogicoutput .= CHtml::closeTag('td') . CHtml::closeTag('tr'); if (!isset($_GET['ok'])) { $button_yes = CHtml::submitButton($clang->gT("Yes"), array('onclick' => "window.open('" . $this->getController()->createUrl("admin/conditions/sa/index/subaction/resetsurveylogic/surveyid/{$iSurveyID}") . "?ok=Y" . "', '_top')")); $button_cancel = CHtml::submitButton($clang->gT("Cancel"), array('onclick' => "window.open('" . $this->getController()->createUrl("admin/survey/sa/view/surveyid/{$iSurveyID}") . "', '_top')")); $messagebox_content = $clang->gT("You are about to delete all conditions on this survey's questions") . "({$iSurveyID})" . $br . $clang->gT("We recommend that before you proceed, you export the entire survey from the main administration screen.") . $br . $clang->gT("Continue?") . $br . $button_yes . $button_cancel; $this->_renderWrappedTemplate('conditions', array('message' => array('title' => $clang->gT("Warning"), 'message' => $messagebox_content))); exit; } else { LimeExpressionManager::RevertUpgradeConditionsToRelevance($iSurveyID); Conditions::model()->deleteRecords("qid in (select qid from {{questions}} where sid={$iSurveyID})"); Yii::app()->session['flashmessage'] = $clang->gT("All conditions in this survey have been deleted."); $this->getController()->redirect($this->getController()->createUrl('admin/survey/sa/view/surveyid/' . $iSurveyID)); } } // MAKE SURE THAT THERE IS A QID if (!isset($qid) || !$qid) { $conditionsoutput = $clang->gT("You have not selected a question") . str_repeat($br, 2); $conditionsoutput .= CHtml::submitButton($clang->gT("Main admin screen"), array('onclick' => "window.open('" . $this->getController()->createUrl("admin/") . "', '_top')")) . $br; safeDie($conditionsoutput); return; } // If we made it this far, then lets develop the menu items // add the conditions container table $extraGetParams = ""; if (isset($qid) && isset($gid)) { $extraGetParams = "/gid/{$gid}/qid/{$qid}"; } $conditionsoutput_action_error = ""; // defined during the actions $markcidarray = array(); if (isset($_GET['markcid'])) { $markcidarray = explode("-", $_GET['markcid']); } //BEGIN PROCESS ACTIONS // ADD NEW ENTRY IF THIS IS AN ADD if (isset($p_subaction) && $p_subaction == "insertcondition") { if (!isset($p_canswers) && !isset($_POST['ConditionConst']) && !isset($_POST['prevQuestionSGQA']) && !isset($_POST['tokenAttr']) && !isset($_POST['ConditionRegexp']) || !isset($p_cquestions) && !isset($p_csrctoken)) { $conditionsoutput_action_error .= CHtml::script("\n<!--\n alert(\"" . $clang->gT("Your condition could not be added! It did not include the question and/or answer upon which the condition was based. Please ensure you have selected a question and an answer.", "js") . "\")\n //-->\n"); } else { if (isset($p_cquestions) && $p_cquestions != '') { $conditionCfieldname = $p_cquestions; } elseif (isset($p_csrctoken) && $p_csrctoken != '') { $conditionCfieldname = $p_csrctoken; } $condition_data = array('qid' => $qid, 'scenario' => $p_scenario, 'cqid' => $p_cqid, 'cfieldname' => $conditionCfieldname, 'method' => $p_method); if (isset($p_canswers)) { foreach ($p_canswers as $ca) { //First lets make sure there isn't already an exact replica of this condition $condition_data['value'] = $ca; $result = Conditions::model()->findAllByAttributes($condition_data); $count_caseinsensitivedupes = count($result); if ($count_caseinsensitivedupes == 0) { $result = Conditions::model()->insertRecords($condition_data); } } } unset($posted_condition_value); // Please note that autoUnescape is already applied in database.php included above // so we only need to db_quote _POST variables if (isset($_POST['ConditionConst']) && isset($_POST['editTargetTab']) && $_POST['editTargetTab'] == "#CONST") { $posted_condition_value = Yii::app()->request->getPost('ConditionConst'); } elseif (isset($_POST['prevQuestionSGQA']) && isset($_POST['editTargetTab']) && $_POST['editTargetTab'] == "#PREVQUESTIONS") { $posted_condition_value = Yii::app()->request->getPost('prevQuestionSGQA'); } elseif (isset($_POST['tokenAttr']) && isset($_POST['editTargetTab']) && $_POST['editTargetTab'] == "#TOKENATTRS") { $posted_condition_value = Yii::app()->request->getPost('tokenAttr'); } elseif (isset($_POST['ConditionRegexp']) && isset($_POST['editTargetTab']) && $_POST['editTargetTab'] == "#REGEXP") { $posted_condition_value = Yii::app()->request->getPost('ConditionRegexp'); } if (isset($posted_condition_value)) { $condition_data['value'] = $posted_condition_value; $result = Conditions::model()->insertRecords($condition_data); } } LimeExpressionManager::UpgradeConditionsToRelevance(NULL, $qid); } // UPDATE ENTRY IF THIS IS AN EDIT if (isset($p_subaction) && $p_subaction == "updatecondition") { if (!isset($p_canswers) && !isset($_POST['ConditionConst']) && !isset($_POST['prevQuestionSGQA']) && !isset($_POST['tokenAttr']) && !isset($_POST['ConditionRegexp']) || !isset($p_cquestions) && !isset($p_csrctoken)) { $conditionsoutput_action_error .= CHtml::script("\n<!--\n alert(\"" . $clang->gT("Your condition could not be added! It did not include the question and/or answer upon which the condition was based. Please ensure you have selected a question and an answer.", "js") . "\")\n //-->\n"); } else { if (isset($p_cquestions) && $p_cquestions != '') { $conditionCfieldname = $p_cquestions; } elseif (isset($p_csrctoken) && $p_csrctoken != '') { $conditionCfieldname = $p_csrctoken; } if (isset($p_canswers)) { foreach ($p_canswers as $ca) { // This is an Edit, there will only be ONE VALUE $updated_data = array('qid' => $qid, 'scenario' => $p_scenario, 'cqid' => $p_cqid, 'cfieldname' => $conditionCfieldname, 'method' => $p_method, 'value' => $ca); $result = Conditions::model()->insertRecords($updated_data, TRUE, array('cid' => $p_cid)); } } unset($posted_condition_value); // Please note that autoUnescape is already applied in database.php included above // so we only need to db_quote _POST variables if (isset($_POST['ConditionConst']) && isset($_POST['editTargetTab']) && $_POST['editTargetTab'] == "#CONST") { $posted_condition_value = Yii::app()->request->getPost('ConditionConst'); } elseif (isset($_POST['prevQuestionSGQA']) && isset($_POST['editTargetTab']) && $_POST['editTargetTab'] == "#PREVQUESTIONS") { $posted_condition_value = Yii::app()->request->getPost('prevQuestionSGQA'); } elseif (isset($_POST['tokenAttr']) && isset($_POST['editTargetTab']) && $_POST['editTargetTab'] == "#TOKENATTRS") { $posted_condition_value = Yii::app()->request->getPost('tokenAttr'); } elseif (isset($_POST['ConditionRegexp']) && isset($_POST['editTargetTab']) && $_POST['editTargetTab'] == "#REGEXP") { $posted_condition_value = Yii::app()->request->getPost('ConditionRegexp'); } if (isset($posted_condition_value)) { $updated_data = array('qid' => $qid, 'scenario' => $p_scenario, 'cqid' => $p_cqid, 'cfieldname' => $conditionCfieldname, 'method' => $p_method, 'value' => $posted_condition_value); $result = Conditions::model()->insertRecords($updated_data, TRUE, array('cid' => $p_cid)); } } LimeExpressionManager::UpgradeConditionsToRelevance(NULL, $qid); } // DELETE ENTRY IF THIS IS DELETE if (isset($p_subaction) && $p_subaction == "delete") { LimeExpressionManager::RevertUpgradeConditionsToRelevance(NULL, $qid); // in case deleted the last condition $result = Conditions::model()->deleteRecords(array('cid' => $p_cid)); LimeExpressionManager::UpgradeConditionsToRelevance(NULL, $qid); } // DELETE ALL CONDITIONS IN THIS SCENARIO if (isset($p_subaction) && $p_subaction == "deletescenario") { LimeExpressionManager::RevertUpgradeConditionsToRelevance(NULL, $qid); // in case deleted the last condition $result = Conditions::model()->deleteRecords(array('qid' => $qid, 'scenario' => $p_scenario)); LimeExpressionManager::UpgradeConditionsToRelevance(NULL, $qid); } // UPDATE SCENARIO if (isset($p_subaction) && $p_subaction == "updatescenario" && isset($p_newscenarionum)) { $result = Conditions::model()->insertRecords(array('scenario' => $p_newscenarionum), TRUE, array('qid' => $qid, 'scenario' => $p_scenario)); LimeExpressionManager::UpgradeConditionsToRelevance(NULL, $qid); } // DELETE ALL CONDITIONS FOR THIS QUESTION if (isset($p_subaction) && $p_subaction == "deleteallconditions") { LimeExpressionManager::RevertUpgradeConditionsToRelevance(NULL, $qid); // in case deleted the last condition $result = Conditions::model()->deleteRecords(array('qid' => $qid)); } // RENUMBER SCENARIOS if (isset($p_subaction) && $p_subaction == "renumberscenarios") { $query = "SELECT DISTINCT scenario FROM {{conditions}} WHERE qid=:qid ORDER BY scenario"; $result = Yii::app()->db->createCommand($query)->bindParam(":qid", $qid, PDO::PARAM_INT)->query() or safeDie("Couldn't select scenario<br />{$query}<br />"); $newindex = 1; foreach ($result->readAll() as $srow) { // new var $update_result == old var $result2 $update_result = Conditions::model()->insertRecords(array('scenario' => $newindex), TRUE, array('qid' => $qid, 'scenario' => $srow['scenario'])); $newindex++; } LimeExpressionManager::UpgradeConditionsToRelevance(NULL, $qid); Yii::app()->session['flashmessage'] = $clang->gT("All conditions scenarios were renumbered."); } // COPY CONDITIONS IF THIS IS COPY if (isset($p_subaction) && $p_subaction == "copyconditions") { $qid = returnGlobal('qid'); $copyconditionsfrom = returnGlobal('copyconditionsfrom'); $copyconditionsto = returnGlobal('copyconditionsto'); if (isset($copyconditionsto) && is_array($copyconditionsto) && isset($copyconditionsfrom) && is_array($copyconditionsfrom)) { //Get the conditions we are going to copy foreach ($copyconditionsfrom as &$entry) { $entry = Yii::app()->db->quoteValue($entry); } $query = "SELECT * FROM {{conditions}}\n" . "WHERE cid in ("; $query .= implode(", ", $copyconditionsfrom); $query .= ")"; $result = Yii::app()->db->createCommand($query)->query() or safeDie("Couldn't get conditions for copy<br />{$query}<br />"); foreach ($result->readAll() as $row) { $proformaconditions[] = array("scenario" => $row['scenario'], "cqid" => $row['cqid'], "cfieldname" => $row['cfieldname'], "method" => $row['method'], "value" => $row['value']); } // while foreach ($copyconditionsto as $copyc) { list($newsid, $newgid, $newqid) = explode("X", $copyc); foreach ($proformaconditions as $pfc) { //TIBO //First lets make sure there isn't already an exact replica of this condition $conditions_data = array('qid' => $newqid, 'scenario' => $pfc['scenario'], 'cqid' => $pfc['cqid'], 'cfieldname' => $pfc['cfieldname'], 'method' => $pfc['method'], 'value' => $pfc['value']); $result = Conditions::model()->findAllByAttributes($conditions_data); $count_caseinsensitivedupes = count($result); $countduplicates = 0; if ($count_caseinsensitivedupes != 0) { foreach ($result as $ccrow) { if ($ccrow['value'] == $pfc['value']) { $countduplicates++; } } } if ($countduplicates == 0) { $result = Conditions::model()->insertRecords($conditions_data); $conditionCopied = true; } else { $conditionDuplicated = true; } } } if (isset($conditionCopied) && $conditionCopied === true) { if (isset($conditionDuplicated) && $conditionDuplicated == true) { $CopyConditionsMessage = CHtml::tag('div', array('class' => 'partialheader'), '(' . $clang->gT("Conditions successfully copied (some were skipped because they were duplicates)") . ')'); } else { $CopyConditionsMessage = CHtml::tag('div', array('class' => 'successheader'), '(' . $clang->gT("Conditions successfully copied") . ')'); } } else { $CopyConditionsMessage = CHtml::tag('div', array('class' => 'warningheader'), '(' . $clang->gT("No conditions could be copied (due to duplicates)") . ')'); } } LimeExpressionManager::UpgradeConditionsToRelevance($iSurveyID); // do for whole survey, since don't know which questions affected. } //END PROCESS ACTIONS $cquestions = array(); $canswers = array(); //BEGIN: GATHER INFORMATION // 1: Get information for this question if (!isset($qid)) { $qid = returnGlobal('qid'); } if (!isset($iSurveyID)) { $iSurveyID = returnGlobal('sid'); } $thissurvey = getSurveyInfo($iSurveyID); $qresult = Questions::model()->with('groups')->findByAttributes(array('qid' => $qid, 'parent_qid' => 0, 'language' => Survey::model()->findByPk($iSurveyID)->language)); $questiongroupname = $qresult->groups->group_name; $questiontitle = $qresult['title']; $questiontext = $qresult['question']; $questiontype = $qresult['type']; // 2: Get all other questions that occur before this question that are pre-determined answer types // To avoid natural sort order issues, // first get all questions in natural sort order // , and find out which number in that order this question is $qresult = Questions::model()->with(array('groups' => array('condition' => 'groups.language = :lang', 'params' => array(':lang' => Survey::model()->findByPk($iSurveyID)->language))))->findAllByAttributes(array('parent_qid' => 0, 'sid' => $iSurveyID, 'language' => Survey::model()->findByPk($iSurveyID)->language)); $qrows = array(); foreach ($qresult as $k => $v) { $qrows[$k] = array_merge($v->attributes, $v->groups->attributes); } // Perform a case insensitive natural sort on group name then question title (known as "code" in the form) of a multidimensional array usort($qrows, 'groupOrderThenQuestionOrder'); $position = "before"; // Go through each question until we reach the current one foreach ($qrows as $qrow) { if ($qrow["qid"] != $qid && $position == "before") { // remember all previous questions // all question types are supported. $questionlist[] = $qrow["qid"]; } elseif ($qrow["qid"] == $qid) { break; } } // Now, using the same array which is now properly sorted by group then question // Create an array of all the questions that appear AFTER the current one $position = "before"; foreach ($qrows as $qrow) { if ($qrow["qid"] == $qid) { $position = "after"; //break; } elseif ($qrow["qid"] != $qid && $position == "after") { $postquestionlist[] = $qrow['qid']; } } $theserows = array(); $postrows = array(); if (isset($questionlist) && is_array($questionlist)) { foreach ($questionlist as $ql) { $result = Questions::model()->with(array('groups' => array('condition' => 'groups.language = :lang', 'params' => array(':lang' => Survey::model()->findByPk($iSurveyID)->language))))->findAllByAttributes(array('qid' => $ql, 'parent_qid' => 0, 'sid' => $iSurveyID, 'language' => Survey::model()->findByPk($iSurveyID)->language)); $thiscount = count($result); // And store again these questions in this array... foreach ($result as $myrows) { //key => value $theserows[] = array("qid" => $myrows['qid'], "sid" => $myrows['sid'], "gid" => $myrows['gid'], "question" => $myrows['question'], "type" => $myrows['type'], "mandatory" => $myrows['mandatory'], "other" => $myrows['other'], "title" => $myrows['title']); } } } if (isset($postquestionlist) && is_array($postquestionlist)) { foreach ($postquestionlist as $pq) { $result = Questions::model()->with(array('groups' => array('condition' => 'groups.language = :lang', 'params' => array(':lang' => Survey::model()->findByPk($iSurveyID)->language))))->findAllByAttributes(array('qid' => $pq, 'parent_qid' => 0, 'sid' => $iSurveyID, 'language' => Survey::model()->findByPk($iSurveyID)->language)); $postcount = count($result); foreach ($result as $myrows) { $postrows[] = array("qid" => $myrows['qid'], "sid" => $myrows['sid'], "gid" => $myrows['gid'], "question" => $myrows['question'], "type" => $myrows['type'], "mandatory" => $myrows['mandatory'], "other" => $myrows['other'], "title" => $myrows['title']); } // while } $postquestionscount = count($postrows); } $questionscount = count($theserows); if (isset($postquestionscount) && $postquestionscount > 0) { //Build the array used for the questionNav and copyTo select boxes foreach ($postrows as $pr) { $pquestions[] = array("text" => $pr['title'] . ": " . substr(strip_tags($pr['question']), 0, 80), "fieldname" => $pr['sid'] . "X" . $pr['gid'] . "X" . $pr['qid']); } } // Previous question parsing ==> building cquestions[] and canswers[] if ($questionscount > 0) { $X = "X"; foreach ($theserows as $rows) { $shortquestion = $rows['title'] . ": " . strip_tags($rows['question']); if ($rows['type'] == "A" || $rows['type'] == "B" || $rows['type'] == "C" || $rows['type'] == "E" || $rows['type'] == "F" || $rows['type'] == "H") { $aresult = Questions::model()->findAllByAttributes(array('parent_qid' => $rows['qid'], 'language' => Survey::model()->findByPk($iSurveyID)->language), array('order' => 'question_order ASC')); foreach ($aresult as $arows) { $shortanswer = "{$arows['title']}: [" . flattenText($arows['question']) . "]"; $shortquestion = $rows['title'] . ":{$shortanswer} " . flattenText($rows['question']); $cquestions[] = array($shortquestion, $rows['qid'], $rows['type'], $rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title']); switch ($rows['type']) { case "A": //Array 5 buttons for ($i = 1; $i <= 5; $i++) { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'], $i, $i); } break; case "B": //Array 10 buttons for ($i = 1; $i <= 10; $i++) { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'], $i, $i); } break; case "C": //Array Y/N/NA $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'], "Y", $clang->gT("Yes")); $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'], "U", $clang->gT("Uncertain")); $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'], "N", $clang->gT("No")); break; case "E": //Array >/=/< $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'], "I", $clang->gT("Increase")); $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'], "S", $clang->gT("Same")); $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'], "D", $clang->gT("Decrease")); break; case "F": //Array Flexible Row //Array Flexible Row case "H": //Array Flexible Column $fresult = Answers::model()->findAllByAttributes(array('qid' => $rows['qid'], "language" => Survey::model()->findByPk($iSurveyID)->language, 'scale_id' => 0), array('order' => 'sortorder, code')); foreach ($fresult as $frow) { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'], $frow['code'], $frow['answer']); } break; } // Only Show No-Answer if question is not mandatory if ($rows['mandatory'] != 'Y') { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'], "", $clang->gT("No answer")); } } //while } elseif ($rows['type'] == ":" || $rows['type'] == ";") { // Multiflexi //Get question attribute for $canswers $qidattributes = getQuestionAttributeValues($rows['qid'], $rows['type']); if (isset($qidattributes['multiflexible_max']) && trim($qidattributes['multiflexible_max']) != '') { $maxvalue = floatval($qidattributes['multiflexible_max']); } else { $maxvalue = 10; } if (isset($qidattributes['multiflexible_min']) && trim($qidattributes['multiflexible_min']) != '') { $minvalue = floatval($qidattributes['multiflexible_min']); } else { $minvalue = 1; } if (isset($qidattributes['multiflexible_step']) && trim($qidattributes['multiflexible_step']) != '') { $stepvalue = floatval($qidattributes['multiflexible_step']); if ($stepvalue == 0) { $stepvalue = 1; } } else { $stepvalue = 1; } if (isset($qidattributes['multiflexible_checkbox']) && $qidattributes['multiflexible_checkbox'] != 0) { $minvalue = 0; $maxvalue = 1; $stepvalue = 1; } // Get the Y-Axis $fquery = "SELECT sq.*, q.other" . " FROM {{questions sq}}, {{questions q}}" . " WHERE sq.sid={$iSurveyID} AND sq.parent_qid=q.qid " . "AND q.language=:lang" . " AND sq.language=:lang" . " AND q.qid=:qid\n AND sq.scale_id=0\n ORDER BY sq.question_order"; $sLanguage = Survey::model()->findByPk($iSurveyID)->language; $y_axis_db = Yii::app()->db->createCommand($fquery)->bindParam(":lang", $sLanguage, PDO::PARAM_STR)->bindParam(":qid", $rows['qid'], PDO::PARAM_INT)->query(); // Get the X-Axis $aquery = "SELECT sq.*\n FROM {{questions q}}, {{questions sq}}\n WHERE q.sid={$iSurveyID}\n AND sq.parent_qid=q.qid\n AND q.language=:lang\n AND sq.language=:lang\n AND q.qid=:qid\n AND sq.scale_id=1\n ORDER BY sq.question_order"; $x_axis_db = Yii::app()->db->createCommand($aquery)->bindParam(":lang", $sLanguage, PDO::PARAM_STR)->bindParam(":qid", $rows['qid'], PDO::PARAM_INT)->query() or safeDie("Couldn't get answers to Array questions<br />{$aquery}<br />"); foreach ($x_axis_db->readAll() as $frow) { $x_axis[$frow['title']] = $frow['question']; } foreach ($y_axis_db->readAll() as $yrow) { foreach ($x_axis as $key => $val) { $shortquestion = $rows['title'] . ":{$yrow['title']}:{$key}: [" . strip_tags($yrow['question']) . "][" . strip_tags($val) . "] " . flattenText($rows['question']); $cquestions[] = array($shortquestion, $rows['qid'], $rows['type'], $rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $yrow['title'] . "_" . $key); if ($rows['type'] == ":") { for ($ii = $minvalue; $ii <= $maxvalue; $ii += $stepvalue) { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $yrow['title'] . "_" . $key, $ii, $ii); } } } } unset($x_axis); } elseif ($rows['type'] == "1") { $aresult = Questions::model()->findAllByAttributes(array('parent_qid' => $rows['qid'], 'language' => Survey::model()->findByPk($iSurveyID)->language), array('order' => 'question_order desc')); foreach ($aresult as $arows) { $attr = getQuestionAttributeValues($rows['qid']); $label1 = isset($attr['dualscale_headerA']) ? $attr['dualscale_headerA'] : 'Label1'; $label2 = isset($attr['dualscale_headerB']) ? $attr['dualscale_headerB'] : 'Label2'; $shortanswer = "{$arows['title']}: [" . strip_tags($arows['question']) . "][{$label1}]"; $shortquestion = $rows['title'] . ":{$shortanswer} " . strip_tags($rows['question']); $cquestions[] = array($shortquestion, $rows['qid'], $rows['type'], $rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'] . "#0"); $shortanswer = "{$arows['title']}: [" . strip_tags($arows['question']) . "][{$label2}]"; $shortquestion = $rows['title'] . ":{$shortanswer} " . strip_tags($rows['question']); $cquestions[] = array($shortquestion, $rows['qid'], $rows['type'], $rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'] . "#1"); // first label $lresult = Answers::model()->findAllByAttributes(array('qid' => $rows['qid'], 'scale_id' => 0, 'language' => Survey::model()->findByPk($iSurveyID)->language), array('order' => 'sortorder, answer')); foreach ($lresult as $lrows) { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'] . "#0", "{$lrows['code']}", "{$lrows['code']}"); } // second label $lresult = Answers::model()->findAllByAttributes(array('qid' => $rows['qid'], 'scale_id' => 1, 'language' => Survey::model()->findByPk($iSurveyID)->language), array('order' => 'sortorder, answer')); foreach ($lresult as $lrows) { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'] . "#1", "{$lrows['code']}", "{$lrows['code']}"); } // Only Show No-Answer if question is not mandatory if ($rows['mandatory'] != 'Y') { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'] . "#0", "", $clang->gT("No answer")); $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'] . "#1", "", $clang->gT("No answer")); } } //while } elseif ($rows['type'] == "K" || $rows['type'] == "Q") { $aresult = Questions::model()->findAllByAttributes(array("parent_qid" => $rows['qid'], "language" => Survey::model()->findByPk($iSurveyID)->language), array('order' => 'question_order desc')); foreach ($aresult as $arows) { $shortanswer = "{$arows['title']}: [" . strip_tags($arows['question']) . "]"; $shortquestion = $rows['title'] . ":{$shortanswer} " . strip_tags($rows['question']); $cquestions[] = array($shortquestion, $rows['qid'], $rows['type'], $rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title']); // Only Show No-Answer if question is not mandatory if ($rows['mandatory'] != 'Y') { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'], "", $clang->gT("No answer")); } } //while } elseif ($rows['type'] == "R") { $aresult = Answers::model()->findAllByAttributes(array("qid" => $rows['qid'], "scale_id" => 0, "language" => Survey::model()->findByPk($iSurveyID)->language), array('order' => 'sortorder, answer')); $acount = count($aresult); foreach ($aresult as $arow) { $theanswer = addcslashes($arow['answer'], "'"); $quicky[] = array($arow['code'], $theanswer); } for ($i = 1; $i <= $acount; $i++) { $cquestions[] = array("{$rows['title']}: [RANK {$i}] " . strip_tags($rows['question']), $rows['qid'], $rows['type'], $rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $i); foreach ($quicky as $qck) { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $i, $qck[0], $qck[1]); } // Only Show No-Answer if question is not mandatory if ($rows['mandatory'] != 'Y') { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $i, " ", $clang->gT("No answer")); } } unset($quicky); } elseif ($rows['type'] == "M" || $rows['type'] == "P") { $shortanswer = " [" . $clang->gT("Group of checkboxes") . "]"; $shortquestion = $rows['title'] . ":{$shortanswer} " . strip_tags($rows['question']); $cquestions[] = array($shortquestion, $rows['qid'], $rows['type'], $rows['sid'] . $X . $rows['gid'] . $X . $rows['qid']); $aresult = Questions::model()->findAllByAttributes(array("parent_qid" => $rows['qid'], "language" => Survey::model()->findByPk($iSurveyID)->language), array('order' => 'question_order desc')); foreach ($aresult as $arows) { $theanswer = addcslashes($arows['question'], "'"); $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'], $arows['title'], $theanswer); $shortanswer = "{$arows['title']}: [" . strip_tags($arows['question']) . "]"; $shortanswer .= "[" . $clang->gT("Single checkbox") . "]"; $shortquestion = $rows['title'] . ":{$shortanswer} " . strip_tags($rows['question']); $cquestions[] = array($shortquestion, $rows['qid'], $rows['type'], "+" . $rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title']); $canswers[] = array("+" . $rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'], 'Y', $clang->gT("checked")); $canswers[] = array("+" . $rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'] . $arows['title'], '', $clang->gT("not checked")); } } elseif ($rows['type'] == "X") { //Just ignore this questiontype } else { $cquestions[] = array($shortquestion, $rows['qid'], $rows['type'], $rows['sid'] . $X . $rows['gid'] . $X . $rows['qid']); switch ($rows['type']) { case "Y": // Y/N/NA $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'], "Y", $clang->gT("Yes")); $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'], "N", $clang->gT("No")); // Only Show No-Answer if question is not mandatory if ($rows['mandatory'] != 'Y') { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'], " ", $clang->gT("No answer")); } break; case "G": //Gender $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'], "F", $clang->gT("Female")); $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'], "M", $clang->gT("Male")); // Only Show No-Answer if question is not mandatory if ($rows['mandatory'] != 'Y') { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'], " ", $clang->gT("No answer")); } break; case "5": // 5 choice for ($i = 1; $i <= 5; $i++) { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'], $i, $i); } // Only Show No-Answer if question is not mandatory if ($rows['mandatory'] != 'Y') { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'], " ", $clang->gT("No answer")); } break; case "N": // Simple Numerical questions // Only Show No-Answer if question is not mandatory if ($rows['mandatory'] != 'Y') { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'], " ", $clang->gT("No answer")); } break; default: $aresult = Answers::model()->findAllByAttributes(array('qid' => $rows['qid'], 'scale_id' => 0, 'language' => Survey::model()->findByPk($iSurveyID)->language), array('order' => 'sortorder, answer')); foreach ($aresult as $arows) { $theanswer = addcslashes($arows['answer'], "'"); $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'], $arows['code'], $theanswer); } if ($rows['type'] == "D") { // Only Show No-Answer if question is not mandatory if ($rows['mandatory'] != 'Y') { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'], " ", $clang->gT("No answer")); } } elseif ($rows['type'] != "M" && $rows['type'] != "P" && $rows['type'] != "J" && $rows['type'] != "I") { // For dropdown questions // optinnaly add the 'Other' answer if (($rows['type'] == "L" || $rows['type'] == "!") && $rows['other'] == "Y") { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'], "-oth-", $clang->gT("Other")); } // Only Show No-Answer if question is not mandatory if ($rows['mandatory'] != 'Y') { $canswers[] = array($rows['sid'] . $X . $rows['gid'] . $X . $rows['qid'], " ", $clang->gT("No answer")); } } break; } //switch row type } //else } //foreach theserows } //if questionscount > 0 //END Gather Information for this question $questionNavOptions = CHtml::openTag('optgroup', array('class' => 'activesurveyselect', 'label' => $clang->gT("Before", "js"))); foreach ($theserows as $row) { $question = $row['question']; $question = strip_tags($question); if (strlen($question) < 35) { $questionselecter = $question; } else { //$questionselecter = substr($question, 0, 35).".."; $questionselecter = htmlspecialchars(mb_strcut(html_entity_decode($question, ENT_QUOTES, 'UTF-8'), 0, 35, 'UTF-8')) . "..."; } $questionNavOptions .= CHtml::tag('option', array('value' => $this->getController()->createUrl("/admin/conditions/sa/index/subaction/editconditionsform/surveyid/{$iSurveyID}/gid/{$row['gid']}/qid/{$row['qid']}")), $questionselecter); } $questionNavOptions .= CHtml::closeTag('optgroup'); $questionNavOptions .= CHtml::openTag('optgroup', array('class' => 'activesurveyselect', 'label' => $clang->gT("Current", "js"))); $question = strip_tags($questiontext); if (strlen($question) < 35) { $questiontextshort = $question; } else { //$questiontextshort = substr($question, 0, 35).".."; $questiontextshort = htmlspecialchars(mb_strcut(html_entity_decode($question, ENT_QUOTES, 'UTF-8'), 0, 35, 'UTF-8')) . "..."; } $questionNavOptions .= CHtml::tag('option', array('value' => $this->getController()->createUrl("/admin/conditions/sa/index/subaction/editconditionsform/surveyid/{$iSurveyID}/gid/{$gid}/qid/{$qid}"), 'selected' => 'selected'), $questiontitle . ': ' . $questiontextshort); $questionNavOptions .= CHtml::closeTag('optgroup'); $questionNavOptions .= CHtml::openTag('optgroup', array('class' => 'activesurveyselect', 'label' => $clang->gT("After", "js"))); foreach ($postrows as $row) { $question = $row['question']; $question = strip_tags($question); if (strlen($question) < 35) { $questionselecter = $question; } else { //$questionselecter = substr($question, 0, 35).".."; $questionselecter = htmlspecialchars(mb_strcut(html_entity_decode($question, ENT_QUOTES, 'UTF-8'), 0, 35, 'UTF-8')) . "..."; } $questionNavOptions .= CHtml::tag('option', array('value' => $this->getController()->createUrl("/admin/conditions/sa/index/subaction/editconditionsform/surveyid/{$iSurveyID}/gid/{$row['gid']}/qid/{$row['qid']}")), $row['title'] . ':' . $questionselecter); } $questionNavOptions .= CHtml::closeTag('optgroup'); //Now display the information and forms //BEGIN: PREPARE JAVASCRIPT TO SHOW MATCHING ANSWERS TO SELECTED QUESTION $javascriptpre = CHtml::openTag('script', array('type' => 'text/javascript')) . "<!--\n" . "\tvar Fieldnames = new Array();\n" . "\tvar Codes = new Array();\n" . "\tvar Answers = new Array();\n" . "\tvar QFieldnames = new Array();\n" . "\tvar Qcqids = new Array();\n" . "\tvar Qtypes = new Array();\n"; $jn = 0; if (isset($canswers)) { foreach ($canswers as $can) { $an = ls_json_encode(flattenText($can[2])); $javascriptpre .= "Fieldnames[{$jn}]='{$can['0']}';\n" . "Codes[{$jn}]='{$can['1']}';\n" . "Answers[{$jn}]={$an};\n"; $jn++; } } $jn = 0; if (isset($cquestions)) { foreach ($cquestions as $cqn) { $javascriptpre .= "QFieldnames[{$jn}]='{$cqn['3']}';\n" . "Qcqids[{$jn}]='{$cqn['1']}';\n" . "Qtypes[{$jn}]='{$cqn['2']}';\n"; $jn++; } } // record a JS variable to let jQuery know if survey is Anonymous if ($thissurvey['anonymized'] == 'Y') { $javascriptpre .= "isAnonymousSurvey = true;"; } else { $javascriptpre .= "isAnonymousSurvey = false;"; } $javascriptpre .= "//-->\n" . CHtml::closeTag('script'); //END: PREPARE JAVASCRIPT TO SHOW MATCHING ANSWERS TO SELECTED QUESTION $this->getController()->_css_admin_includes(Yii::app()->getConfig("publicstyleurl") . 'jquery.multiselect.css'); $aViewUrls = array(); $aData['clang'] = $clang; $aData['surveyid'] = $iSurveyID; $aData['qid'] = $qid; $aData['gid'] = $gid; $aData['imageurl'] = $imageurl; $aData['extraGetParams'] = $extraGetParams; $aData['quesitonNavOptions'] = $questionNavOptions; $aData['conditionsoutput_action_error'] = $conditionsoutput_action_error; $aData['javascriptpre'] = $javascriptpre; $aViewUrls['conditionshead_view'][] = $aData; //BEGIN DISPLAY CONDITIONS FOR THIS QUESTION if ($subaction == 'index' || $subaction == 'editconditionsform' || $subaction == 'insertcondition' || $subaction == "editthiscondition" || $subaction == "delete" || $subaction == "updatecondition" || $subaction == "deletescenario" || $subaction == "renumberscenarios" || $subaction == "deleteallconditions" || $subaction == "updatescenario" || $subaction == 'copyconditionsform' || $subaction == 'copyconditions' || $subaction == 'conditions') { //3: Get other conditions currently set for this question $conditionscount = 0; $s = 0; $criteria = new CDbCriteria(); $criteria->select = 'scenario'; // only select the 'scenario' column $criteria->condition = 'qid=:qid'; $criteria->params = array(':qid' => $qid); $criteria->order = 'scenario'; $criteria->group = 'scenario'; $scenarioresult = Conditions::model()->findAll($criteria); $scenariocount = count($scenarioresult); $showreplace = "{$questiontitle}" . $this->_showSpeaker($questiontext); $onlyshow = sprintf($clang->gT("Only show question %s IF"), $showreplace); $aData['conditionsoutput'] = ''; $aData['extraGetParams'] = $extraGetParams; $aData['quesitonNavOptions'] = $questionNavOptions; $aData['conditionsoutput_action_error'] = $conditionsoutput_action_error; $aData['javascriptpre'] = $javascriptpre; $aData['onlyshow'] = $onlyshow; $aData['subaction'] = $subaction; $aData['scenariocount'] = $scenariocount; $aViewUrls['conditionslist_view'][] = $aData; if ($scenariocount > 0) { //self::_js_admin_includes($this->config->item("generalscripts").'jquery/jquery.checkgroup.js'); $this->getController()->_js_admin_includes(Yii::app()->getConfig("generalscripts") . 'jquery/jquery.checkgroup.js'); foreach ($scenarioresult as $scenarionr) { $scenariotext = ""; if ($s == 0 && $scenariocount > 1) { $scenariotext = " -------- <i>Scenario {$scenarionr['scenario']}</i> --------"; } if ($s > 0) { $scenariotext = " -------- <i>" . $clang->gT("OR") . " Scenario {$scenarionr['scenario']}</i> --------"; } if ($subaction == "copyconditionsform" || $subaction == "copyconditions") { $initialCheckbox = "<td><input type='checkbox' id='scenarioCbx{$scenarionr['scenario']}' checked='checked'/>\n" . "<script type='text/javascript'>\$(document).ready(function () { \$('#scenarioCbx{$scenarionr['scenario']}').checkgroup({ groupName:'aConditionFromScenario{$scenarionr['scenario']}'}); });</script>" . "</td><td> </td>\n"; } else { $initialCheckbox = ""; } if ($scenariotext != "" && ($subaction == "editconditionsform" || $subaction == "insertcondition" || $subaction == "updatecondition" || $subaction == "editthiscondition" || $subaction == "renumberscenarios" || $subaction == "updatescenario" || $subaction == "deletescenario" || $subaction == "delete")) { $img_tag = CHtml::image($imageurl . '/scenario_delete.png', $clang->gT("Delete this scenario"), array('name' => 'DeleteWholeGroup')); $additional_main_content = CHtml::link($img_tag, '#', array('onclick' => "if ( confirm('" . $clang->gT("Are you sure you want to delete all conditions set in this scenario?", "js") . "')) { document.getElementById('deletescenario{$scenarionr['scenario']}').submit();}")); $img_tag = CHtml::image($imageurl . '/scenario_edit.png', $clang->gT("Edit scenario"), array('name' => 'DeleteWholeGroup')); $additional_main_content .= CHtml::link($img_tag, '#', array('id' => 'editscenariobtn' . $scenarionr['scenario'], 'onclick' => "\$('#editscenario{$scenarionr['scenario']}').toggle('slow');")); $aData['additional_content'] = $additional_main_content; } $aData['initialCheckbox'] = $initialCheckbox; $aData['scenariotext'] = $scenariotext; $aData['scenarionr'] = $scenarionr; if (!isset($aViewUrls['output'])) { $aViewUrls['output'] = ''; } $aViewUrls['output'] .= $this->getController()->render('/admin/conditions/includes/conditions_scenario', $aData, TRUE); unset($currentfield); $query = "SELECT count(*) as recordcount\n FROM {{conditions}} c, {{questions}} q, {{groups}} g\n WHERE c.cqid=q.qid " . "AND q.gid=g.gid " . "AND q.parent_qid=0 " . "AND q.language=:lang1 " . "AND g.language=:lang2 " . "AND c.qid=:qid " . "AND c.scenario=:scenario " . "AND c.cfieldname NOT LIKE '{%' "; // avoid catching SRCtokenAttr conditions $sLanguage = Survey::model()->findByPk($iSurveyID)->language; $result = Yii::app()->db->createCommand($query)->bindValue(":scenario", $scenarionr['scenario'])->bindValue(":qid", $qid, PDO::PARAM_INT)->bindValue(":lang1", $sLanguage, PDO::PARAM_STR)->bindValue(":lang2", $sLanguage, PDO::PARAM_STR)->queryRow(); $conditionscount = (int) $result['recordcount']; $query = "SELECT c.cid, c.scenario, c.cqid, c.cfieldname, c.method, c.value, q.type\n FROM {{conditions}} c, {{questions}} q, {{groups}} g\n WHERE c.cqid=q.qid " . "AND q.gid=g.gid " . "AND q.parent_qid=0 " . "AND q.language=:lang1 " . "AND g.language=:lang2 " . "AND c.qid=:qid " . "AND c.scenario=:scenario " . "AND c.cfieldname NOT LIKE '{%' " . "ORDER BY g.group_order, q.question_order, c.cfieldname"; $sLanguage = Survey::model()->findByPk($iSurveyID)->language; $result = Yii::app()->db->createCommand($query)->bindValue(":scenario", $scenarionr['scenario'])->bindValue(":qid", $qid, PDO::PARAM_INT)->bindValue(":lang1", $sLanguage, PDO::PARAM_STR)->bindValue(":lang2", $sLanguage, PDO::PARAM_STR)->query() or safeDie("Couldn't get other conditions for question {$qid}<br />{$query}<br />"); $querytoken = "SELECT count(*) as recordcount " . "FROM {{conditions}} " . "WHERE " . " {{conditions}}.qid=:qid " . "AND {{conditions}}.scenario=:scenario " . "AND {{conditions}}.cfieldname LIKE '{%' "; // only catching SRCtokenAttr conditions $resulttoken = Yii::app()->db->createCommand($querytoken)->bindValue(":scenario", $scenarionr['scenario'], PDO::PARAM_INT)->bindValue(":qid", $qid, PDO::PARAM_INT)->queryRow() or safeDie("Couldn't get other conditions for question {$qid}<br />{$query}<br />"); $conditionscounttoken = (int) $resulttoken['recordcount']; $querytoken = "SELECT {{conditions}}.cid, " . "{{conditions}}.scenario, " . "{{conditions}}.cqid, " . "{{conditions}}.cfieldname, " . "{{conditions}}.method, " . "{{conditions}}.value, " . "'' AS type " . "FROM {{conditions}} " . "WHERE " . " {{conditions}}.qid=:qid " . "AND {{conditions}}.scenario=:scenario " . "AND {{conditions}}.cfieldname LIKE '{%' " . "ORDER BY {{conditions}}.cfieldname"; $resulttoken = Yii::app()->db->createCommand($querytoken)->bindValue(":scenario", $scenarionr['scenario'], PDO::PARAM_INT)->bindValue(":qid", $qid, PDO::PARAM_INT)->query() or safeDie("Couldn't get other conditions for question {$qid}<br />{$query}<br />"); $conditionscount = $conditionscount + $conditionscounttoken; if ($conditionscount > 0) { $aConditionsMerged = array(); foreach ($resulttoken->readAll() as $arow) { $aConditionsMerged[] = $arow; } foreach ($result->readAll() as $arow) { $aConditionsMerged[] = $arow; } foreach ($aConditionsMerged as $rows) { if ($rows['method'] == "") { $rows['method'] = "=="; } //Fill in the empty method from previous versions $markcidstyle = "oddrow"; if (array_search($rows['cid'], $markcidarray) !== FALSE) { // This is the style used when the condition editor is called // in order to check which conditions prevent a question deletion $markcidstyle = "markedrow"; } if ($subaction == "editthiscondition" && isset($p_cid) && $rows['cid'] === $p_cid) { // Style used when editing a condition $markcidstyle = "editedrow"; } if (isset($currentfield) && $currentfield != $rows['cfieldname']) { $aViewUrls['output'] .= "<tr class='evenrow'>\n" . "\t<td colspan='2'>\n" . "<span><strong>" . $clang->gT("and") . "</strong></span></td></tr>"; } elseif (isset($currentfield)) { $aViewUrls['output'] .= "<tr class='evenrow'>\n" . "\t<td colspan='2'>\n" . "<span><strong>" . $clang->gT("or") . "</strong></span></td></tr>"; } $aViewUrls['output'] .= "\t<tr class='{$markcidstyle}'>\n" . "\t<td colspan='2'>" . CHtml::form(array("/admin/conditions/sa/index/subaction/{$subaction}/surveyid/{$iSurveyID}/gid/{$gid}/qid/{$qid}/"), 'post', array('id' => "conditionaction{$rows['cid']}", 'name' => "conditionaction{$rows['cid']}")) . "<table>\n" . "\t<tr>\n"; if ($subaction == "copyconditionsform" || $subaction == "copyconditions") { $aViewUrls['output'] .= "<td> </td>" . "<td>\n" . "\t<input type='checkbox' name='aConditionFromScenario{$scenarionr['scenario']}' id='cbox{$rows['cid']}' value='{$rows['cid']}' checked='checked'/>\n" . "</td>\n"; } $aViewUrls['output'] .= "" . "<td>\n" . "\t<span>\n"; $leftOperandType = 'unknown'; // prevquestion, tokenattr if ($thissurvey['anonymized'] != 'Y' && preg_match('/^{TOKEN:([^}]*)}$/', $rows['cfieldname'], $extractedTokenAttr) > 0) { $leftOperandType = 'tokenattr'; $aTokenAttrNames = getTokenFieldsAndNames($iSurveyID); if (count($aTokenAttrNames) != 0) { $thisAttrName = HTMLEscape($aTokenAttrNames[strtolower($extractedTokenAttr[1])]['description']) . " [" . $clang->gT("From token table") . "]"; } else { $thisAttrName = HTMLEscape($extractedTokenAttr[1]) . " [" . $clang->gT("Inexistant token table") . "]"; } $aViewUrls['output'] .= "\t{$thisAttrName}\n"; // TIBO not sure this is used anymore !! $conditionsList[] = array("cid" => $rows['cid'], "text" => $thisAttrName); } else { $leftOperandType = 'prevquestion'; foreach ($cquestions as $cqn) { if ($cqn[3] == $rows['cfieldname']) { $aViewUrls['output'] .= "\t{$cqn['0']} (qid{$rows['cqid']})\n"; $conditionsList[] = array("cid" => $rows['cid'], "text" => $cqn[0] . " ({$rows['value']})"); } else { //$aViewUrls['output'] .= "\t<font color='red'>ERROR: Delete this condition. It is out of order.</font>\n"; } } } $aViewUrls['output'] .= "\t</span></td>\n" . "\t<td>\n" . "<span>\n" . $method[trim($rows['method'])] . "</span>\n" . "\t</td>\n" . "\n" . "\t<td>\n" . "<span>\n"; // let's read the condition's right operand // determine its type and display it $rightOperandType = 'unknown'; // predefinedAnsw,constantVal, prevQsgqa, tokenAttr, regexp if ($rows['method'] == 'RX') { $rightOperandType = 'regexp'; $aViewUrls['output'] .= "" . HTMLEscape($rows['value']) . "\n"; } elseif (preg_match('/^@([0-9]+X[0-9]+X[^@]*)@$/', $rows['value'], $matchedSGQA) > 0) { // SGQA $rightOperandType = 'prevQsgqa'; $textfound = false; foreach ($cquestions as $cqn) { if ($cqn[3] == $matchedSGQA[1]) { $matchedSGQAText = $cqn[0]; $textfound = true; break; } } if ($textfound === false) { $matchedSGQAText = $rows['value'] . ' (' . $clang->gT("Not found") . ')'; } $aViewUrls['output'] .= "" . HTMLEscape($matchedSGQAText) . "\n"; } elseif ($thissurvey['anonymized'] != 'Y' && preg_match('/^{TOKEN:([^}]*)}$/', $rows['value'], $extractedTokenAttr) > 0) { $rightOperandType = 'tokenAttr'; $aTokenAttrNames = getTokenFieldsAndNames($iSurveyID); if (count($aTokenAttrNames) != 0) { $thisAttrName = HTMLEscape($aTokenAttrNames[strtolower($extractedTokenAttr[1])]['description']) . " [" . $clang->gT("From token table") . "]"; } else { $thisAttrName = HTMLEscape($extractedTokenAttr[1]) . " [" . $clang->gT("Inexistant token table") . "]"; } $aViewUrls['output'] .= "\t{$thisAttrName}\n"; } elseif (isset($canswers)) { foreach ($canswers as $can) { if ($can[0] == $rows['cfieldname'] && $can[1] == $rows['value']) { $aViewUrls['output'] .= "{$can['2']} ({$can['1']})\n"; $rightOperandType = 'predefinedAnsw'; } } } // if $rightOperandType is still unkown then it is a simple constant if ($rightOperandType == 'unknown') { $rightOperandType = 'constantVal'; if ($rows['value'] == ' ' || $rows['value'] == '') { $aViewUrls['output'] .= "" . $clang->gT("No answer") . "\n"; } else { $aViewUrls['output'] .= "" . HTMLEscape($rows['value']) . "\n"; } } $aViewUrls['output'] .= "\t</span></td>\n" . "\t<td>\n"; if ($subaction == "editconditionsform" || $subaction == "insertcondition" || $subaction == "updatecondition" || $subaction == "editthiscondition" || $subaction == "renumberscenarios" || $subaction == "deleteallconditions" || $subaction == "updatescenario" || $subaction == "deletescenario" || $subaction == "delete") { // show single condition action buttons in edit mode $aData['rows'] = $rows; $aData['sImageURL'] = Yii::app()->getConfig('adminimageurl'); //$aViewUrls['includes/conditions_edit'][] = $aData; $aViewUrls['output'] .= $this->getController()->render('/admin/conditions/includes/conditions_edit', $aData, TRUE); // now sets e corresponding hidden input field // depending on the leftOperandType if ($leftOperandType == 'tokenattr') { $aViewUrls['output'] .= CHtml::hiddenField('csrctoken', HTMLEscape($rows['cfieldname']), array('id' => 'csrctoken' . $rows['cid'])); } else { $aViewUrls['output'] .= CHtml::hiddenField('cquestions', HTMLEscape($rows['cfieldname']), array('id' => 'cquestions' . $rows['cid'])); } // now set the corresponding hidden input field // depending on the rightOperandType // This is used when Editting a condition if ($rightOperandType == 'predefinedAnsw') { $aViewUrls['output'] .= CHtml::hiddenField('EDITcanswers[]', HTMLEscape($rows['value']), array('id' => 'editModeTargetVal' . $rows['cid'])); } elseif ($rightOperandType == 'prevQsgqa') { $aViewUrls['output'] .= CHtml::hiddenField('EDITprevQuestionSGQA', HTMLEscape($rows['value']), array('id' => 'editModeTargetVal' . $rows['cid'])); } elseif ($rightOperandType == 'tokenAttr') { $aViewUrls['output'] .= CHtml::hiddenField('EDITtokenAttr', HTMLEscape($rows['value']), array('id' => 'editModeTargetVal' . $rows['cid'])); } elseif ($rightOperandType == 'regexp') { $aViewUrls['output'] .= CHtml::hiddenField('EDITConditionRegexp', HTMLEscape($rows['value']), array('id' => 'editModeTargetVal' . $rows['cid'])); } else { $aViewUrls['output'] .= CHtml::hiddenField('EDITConditionConst', HTMLEscape($rows['value']), array('id' => 'editModeTargetVal' . $rows['cid'])); } } $aViewUrls['output'] .= CHtml::closeTag('td') . CHtml::closeTag('tr') . CHtml::closeTag('table') . CHtml::closeTag('form') . CHtml::closeTag('td') . CHtml::closeTag('tr'); $currentfield = $rows['cfieldname']; } } $s++; } } else { // no condition ==> disable delete all conditions button, and display a simple comment $aViewUrls['output'] = CHtml::openTag('tr') . CHtml::tag('td', array(), $clang->gT("This question is always shown.")) . CHtml::tag('td', array(), ' ') . CHtml::closeTag('tr'); } $aViewUrls['output'] .= CHtml::closeTag('table'); } //END DISPLAY CONDITIONS FOR THIS QUESTION // BEGIN: DISPLAY THE COPY CONDITIONS FORM if ($subaction == "copyconditionsform" || $subaction == "copyconditions") { $aViewUrls['output'] .= "<tr class=''><td colspan='3'>\n" . CHtml::form(array("/admin/conditions/sa/index/subaction/copyconditions/surveyid/{$iSurveyID}/gid/{$gid}/qid/{$qid}/"), 'post', array('id' => "copyconditions", 'name' => "copyconditions")) . "<div class='header ui-widget-header'>" . $clang->gT("Copy conditions") . "</div>\n"; //CopyConditionsMessage if (isset($CopyConditionsMessage)) { $aViewUrls['output'] .= "<div class='messagebox ui-corner-all'>\n" . "{$CopyConditionsMessage}\n" . "</div>\n"; } if (isset($conditionsList) && is_array($conditionsList)) { //TIBO $this->getController()->_js_admin_includes(Yii::app()->getConfig("generalscripts") . 'jquery/jquery.multiselect.min.js'); // TODO $aViewUrls['output'] .= "<script type='text/javascript'>\$(document).ready(function () { \$('#copytomultiselect').multiselect( { autoOpen: true, noneSelectedText: '" . $clang->gT("No questions selected") . "', checkAllText: '" . $clang->gT("Check all") . "', uncheckAllText: '" . $clang->gT("Uncheck all") . "', selectedText: '# " . $clang->gT("selected") . "', beforeclose: function(){ return false;},height: 200 } ); });</script>"; $aViewUrls['output'] .= "\t<div class='conditioncopy-tbl-row'>\n" . "\t<div class='condition-tbl-left'>" . $clang->gT("Copy the selected conditions to") . ":</div>\n" . "\t<div class='condition-tbl-right'>\n" . "\t\t<select name='copyconditionsto[]' id='copytomultiselect' multiple='multiple' >\n"; if (isset($pquestions) && count($pquestions) != 0) { foreach ($pquestions as $pq) { $aViewUrls['output'] .= "\t\t<option value='{$pq['fieldname']}'>" . $pq['text'] . "</option>\n"; } } $aViewUrls['output'] .= "\t\t</select>\n" . "\t</div>\n" . "\t</div>\n"; if (!isset($pquestions) || count($pquestions) == 0) { $disableCopyCondition = " disabled='disabled'"; } else { $disableCopyCondition = " "; } $aViewUrls['output'] .= "\t<div class='condition-tbl-full'>\n" . "\t\t<input type='submit' value='" . $clang->gT("Copy conditions") . "' onclick=\"prepareCopyconditions(); return true;\" {$disableCopyCondition}/>\n" . "<input type='hidden' name='subaction' value='copyconditions' />\n" . "<input type='hidden' name='sid' value='{$iSurveyID}' />\n" . "<input type='hidden' name='gid' value='{$gid}' />\n" . "<input type='hidden' name='qid' value='{$qid}' />\n" . "</div>\n"; $aViewUrls['output'] .= "<script type=\"text/javascript\">\n" . "function prepareCopyconditions()\n" . "{\n" . "\t\$(\"input:checked[name^='aConditionFromScenario']\").each(function(i,val)\n" . "\t{\n" . "var thecid = val.value;\n" . "var theform = document.getElementById('copyconditions');\n" . "addHiddenElement(theform,'copyconditionsfrom[]',thecid);\n" . "return true;\n" . "\t});\n" . "}\n" . "</script>\n"; } else { $aViewUrls['output'] .= "<div class='messagebox ui-corner-all'>\n" . "<div class='partialheader'>" . $clang->gT("There are no existing conditions in this survey.") . "</div><br />\n" . "</div>\n"; } $aViewUrls['output'] .= "</form></td></tr>\n"; } // END: DISPLAY THE COPY CONDITIONS FORM if (isset($cquestions)) { if (count($cquestions) > 0 && count($cquestions) <= 10) { $qcount = count($cquestions); } else { $qcount = 9; } } else { $qcount = 0; } //BEGIN: DISPLAY THE ADD or EDIT CONDITION FORM if ($subaction == "editconditionsform" || $subaction == "insertcondition" || $subaction == "updatecondition" || $subaction == "deletescenario" || $subaction == "renumberscenarios" || $subaction == "deleteallconditions" || $subaction == "updatescenario" || $subaction == "editthiscondition" || $subaction == "delete") { $aViewUrls['output'] .= CHtml::form(array("/admin/conditions/sa/index/subaction/{$subaction}/surveyid/{$iSurveyID}/gid/{$gid}/qid/{$qid}/"), 'post', array('id' => "editconditions", 'name' => "editconditions")); if ($subaction == "editthiscondition" && isset($p_cid)) { $mytitle = $clang->gT("Edit condition"); } else { $mytitle = $clang->gT("Add condition"); } $aViewUrls['output'] .= "<div class='header ui-widget-header'>" . $mytitle . "</div>\n"; /////////////////////////////////////////////////////////////////////////////////////////// // Begin "Scenario" row if ($subaction != "editthiscondition" && isset($scenariocount) && ($scenariocount == 1 || $scenariocount == 0) || $subaction == "editthiscondition" && isset($scenario) && $scenario == 1) { $scenarioAddBtn = "\t<a id='scenarioaddbtn' href='#' onclick=\"\$('#scenarioaddbtn').hide();\$('#defaultscenariotxt').hide('slow');\$('#scenario').show('slow');\">" . "<img src='{$imageurl}/plus.png' alt='" . $clang->gT('Add scenario') . "' /></a>\n"; $scenarioTxt = "<span id='defaultscenariotxt'>" . $clang->gT("Default scenario") . "</span>"; $scenarioInputStyle = "style = 'display: none;'"; } else { $scenarioAddBtn = ""; $scenarioTxt = ""; $scenarioInputStyle = "style = ''"; } $aViewUrls['output'] .= "<div class='condition-tbl-row'>\n" . "<div class='condition-tbl-left'>{$scenarioAddBtn} " . $clang->gT("Scenario") . "</div>\n" . "<div class='condition-tbl-right'><input type='text' name='scenario' id='scenario' value='1' size='2' {$scenarioInputStyle}/>" . "{$scenarioTxt}\n" . "</div>\n" . "</div>\n"; // Begin "Question" row $aViewUrls['output'] .= "<div class='condition-tbl-row'>\n" . "<div class='condition-tbl-left'>" . $clang->gT("Question") . "</div>\n" . "<div class='condition-tbl-right'>\n" . "\t<div id=\"conditionsource\" class=\"tabs-nav\">\n" . "\t<ul>\n" . "\t<li><a href=\"#SRCPREVQUEST\"><span>" . $clang->gT("Previous questions") . "</span></a></li>\n" . "\t<li><a href=\"#SRCTOKENATTRS\"><span>" . $clang->gT("Token fields") . "</span></a></li>\n" . "\t</ul>\n"; // Previous question tab $aViewUrls['output'] .= "<div id='SRCPREVQUEST'><select name='cquestions' id='cquestions' size='" . ($qcount + 1) . "' >\n"; if (isset($cquestions)) { $js_getAnswers_onload = ""; foreach ($cquestions as $cqn) { $aViewUrls['output'] .= "<option value='{$cqn['3']}' title=\"" . htmlspecialchars($cqn[0]) . "\""; if (isset($p_cquestions) && $cqn[3] == $p_cquestions) { $aViewUrls['output'] .= " selected"; if (isset($p_canswers)) { $canswersToSelect = ""; foreach ($p_canswers as $checkval) { $canswersToSelect .= ";{$checkval}"; } $canswersToSelect = substr($canswersToSelect, 1); $js_getAnswers_onload .= "\$('#canswersToSelect').val('{$canswersToSelect}');\n"; } } $aViewUrls['output'] .= ">{$cqn['0']}</option>\n"; } } $aViewUrls['output'] .= "</select>\n" . "</div>\n"; // Source token Tab $aViewUrls['output'] .= "<div id='SRCTOKENATTRS'><select name='csrctoken' id='csrctoken' size='" . ($qcount + 1) . "' >\n"; foreach (getTokenFieldsAndNames($iSurveyID) as $tokenattr => $tokenattrName) { // Check to select if (isset($p_csrctoken) && $p_csrctoken == '{TOKEN:' . strtoupper($tokenattr) . '}') { $selectThisSrcTokenAttr = "selected=\"selected\""; } else { $selectThisSrcTokenAttr = ""; } $aViewUrls['output'] .= "<option value='{TOKEN:" . strtoupper($tokenattr) . "}' {$selectThisSrcTokenAttr}>" . HTMLEscape($tokenattrName['description']) . "</option>\n"; } $aViewUrls['output'] .= "</select>\n" . "</div>\n\n"; $aViewUrls['output'] .= "\t</div>\n"; // end conditionsource div $aViewUrls['output'] .= "</div>\n" . "</div>\n"; // Begin "Comparison operator" row $aViewUrls['output'] .= "<div class='condition-tbl-row'>\n" . "<div class='condition-tbl-left'>" . $clang->gT("Comparison operator") . "</div>\n" . "<div class='condition-tbl-right'>\n" . "<select name='method' id='method'>\n"; foreach ($method as $methodCode => $methodTxt) { $selected = $methodCode == "==" ? " selected='selected'" : ""; $aViewUrls['output'] .= "\t<option value='" . $methodCode . "'{$selected}>" . $methodTxt . "</option>\n"; } $aViewUrls['output'] .= "</select>\n" . "</div>\n" . "</div>\n"; // Begin "Answer" row $aViewUrls['output'] .= "<div class='condition-tbl-row'>\n" . "<div class='condition-tbl-left'>" . $clang->gT("Answer") . "</div>\n"; if ($subaction == "editthiscondition") { $multipletext = ""; if (isset($_POST['EDITConditionConst']) && $_POST['EDITConditionConst'] != '') { $EDITConditionConst = HTMLEscape($_POST['EDITConditionConst']); } else { $EDITConditionConst = ""; } if (isset($_POST['EDITConditionRegexp']) && $_POST['EDITConditionRegexp'] != '') { $EDITConditionRegexp = HTMLEscape($_POST['EDITConditionRegexp']); } else { $EDITConditionRegexp = ""; } } else { $multipletext = "multiple"; if (isset($_POST['ConditionConst']) && $_POST['ConditionConst'] != '') { $EDITConditionConst = HTMLEscape($_POST['ConditionConst']); } else { $EDITConditionConst = ""; } if (isset($_POST['ConditionRegexp']) && $_POST['ConditionRegexp'] != '') { $EDITConditionRegexp = HTMLEscape($_POST['ConditionRegexp']); } else { $EDITConditionRegexp = ""; } } $aViewUrls['output'] .= "" . "<div class='condition-tbl-right'>\n" . "<div id=\"conditiontarget\" class=\"tabs-nav\">\n" . "\t<ul>\n" . "\t\t<li><a href=\"#CANSWERSTAB\"><span>" . $clang->gT("Predefined") . "</span></a></li>\n" . "\t\t<li><a href=\"#CONST\"><span>" . $clang->gT("Constant") . "</span></a></li>\n" . "\t\t<li><a href=\"#PREVQUESTIONS\"><span>" . $clang->gT("Questions") . "</span></a></li>\n" . "\t\t<li><a href=\"#TOKENATTRS\"><span>" . $clang->gT("Token fields") . "</span></a></li>\n" . "\t\t<li><a href=\"#REGEXP\"><span>" . $clang->gT("RegExp") . "</span></a></li>\n" . "\t</ul>\n"; // Predefined answers tab $aViewUrls['output'] .= "\t<div id='CANSWERSTAB'>\n" . "\t\t<select name='canswers[]' {$multipletext} id='canswers' size='7'>\n" . "\t\t</select>\n" . "\t\t<br /><span id='canswersLabel'>" . $clang->gT("Predefined answer options for this question") . "</span>\n" . "\t</div>\n"; // Constant tab $aViewUrls['output'] .= "\t<div id='CONST' style='display:block;' >\n" . "\t\t<textarea name='ConditionConst' id='ConditionConst' rows='5' cols='113'>{$EDITConditionConst}</textarea>\n" . "\t\t<br /><div id='ConditionConstLabel'>" . $clang->gT("Constant value") . "</div>\n" . "\t</div>\n"; // Previous answers tab @SGQA@ placeholders $aViewUrls['output'] .= "\t<div id='PREVQUESTIONS'>\n" . "\t\t<select name='prevQuestionSGQA' id='prevQuestionSGQA' size='7'>\n"; foreach ($cquestions as $cqn) { // building the @SGQA@ placeholders options if ($cqn[2] != 'M' && $cqn[2] != 'P') { // Type M or P aren't real fieldnames and thus can't be used in @SGQA@ placehodlers $aViewUrls['output'] .= "\t\t<option value='@{$cqn['3']}@' title=\"" . htmlspecialchars($cqn[0]) . "\""; if (isset($p_prevquestionsgqa) && $p_prevquestionsgqa == "@" . $cqn[3] . "@") { $aViewUrls['output'] .= " selected='selected'"; } $aViewUrls['output'] .= ">{$cqn['0']}</option>\n"; } } $aViewUrls['output'] .= "\t\t</select>\n" . "\t\t<br /><span id='prevQuestionSGQALabel'>" . $clang->gT("Answers from previous questions") . "</span>\n" . "\t</div>\n"; // Token tab $aViewUrls['output'] .= "\t<div id='TOKENATTRS'>\n" . "\t\t<select name='tokenAttr' id='tokenAttr' size='7'>\n"; foreach (getTokenFieldsAndNames($iSurveyID) as $tokenattr => $tokenattrName) { $aViewUrls['output'] .= "\t\t<option value='{TOKEN:" . strtoupper($tokenattr) . "}'>" . HTMLEscape($tokenattrName['description']) . "</option>\n"; } $aViewUrls['output'] .= "\t\t</select>\n" . "\t\t<br /><span id='tokenAttrLabel'>" . $clang->gT("Attributes values from the participant's token") . "</span>\n" . "\t</div>\n"; // Regexp Tab $aViewUrls['output'] .= "\t<div id='REGEXP' style='display:block;'>\n" . "\t\t<textarea name='ConditionRegexp' id='ConditionRegexp' rows='5' cols='113'>{$EDITConditionRegexp}</textarea>\n" . "\t\t<br /><div id='ConditionRegexpLabel'><a href=\"http://docs.limesurvey.org/tiki-index.php?page=Using+Regular+Expressions\" target=\"_blank\">" . $clang->gT("Regular expression") . "</a></div>\n" . "\t</div>\n"; $aViewUrls['output'] .= "</div>\n"; // end conditiontarget div $this->getController()->_js_admin_includes(Yii::app()->getConfig("adminscripts") . 'conditions.js'); $this->getController()->_js_admin_includes(Yii::app()->getConfig("generalscripts") . 'jquery/lime-conditions-tabs.js'); if ($subaction == "editthiscondition" && isset($p_cid)) { $submitLabel = $clang->gT("Update condition"); $submitSubaction = "updatecondition"; $submitcid = sanitize_int($p_cid); } else { $submitLabel = $clang->gT("Add condition"); $submitSubaction = "insertcondition"; $submitcid = ""; } $aViewUrls['output'] .= "</div>\n" . "</div>\n"; // Begin buttons row $aViewUrls['output'] .= "<div class='condition-tbl-full'>\n" . "\t<input type='reset' id='resetForm' value='" . $clang->gT("Clear") . "' />\n" . "\t<input type='submit' value='" . $submitLabel . "' />\n" . "<input type='hidden' name='sid' value='{$iSurveyID}' />\n" . "<input type='hidden' name='gid' value='{$gid}' />\n" . "<input type='hidden' name='qid' value='{$qid}' />\n" . "<input type='hidden' name='subaction' value='{$submitSubaction}' />\n" . "<input type='hidden' name='cqid' id='cqid' value='' />\n" . "<input type='hidden' name='cid' id='cid' value='" . $submitcid . "' />\n" . "<input type='hidden' name='editTargetTab' id='editTargetTab' value='' />\n" . "<input type='hidden' name='editSourceTab' id='editSourceTab' value='' />\n" . "<input type='hidden' name='canswersToSelect' id='canswersToSelect' value='' />\n" . "</div>\n" . "</form>\n"; if (!isset($js_getAnswers_onload)) { $js_getAnswers_onload = ''; } $aViewUrls['output'] .= "<script type='text/javascript'>\n" . "<!--\n" . "\t" . $js_getAnswers_onload . "\n"; if (isset($p_method)) { $aViewUrls['output'] .= "\tdocument.getElementById('method').value='" . $p_method . "';\n"; } if ($subaction == "editthiscondition") { // in edit mode we read previous values in order to dusplay them in the corresponding inputs if (isset($_POST['EDITConditionConst']) && $_POST['EDITConditionConst'] != '') { // In order to avoid issues with backslash escaping, I don't use javascript to set the value // Thus the value is directly set when creating the Textarea element //$aViewUrls['output'] .= "\tdocument.getElementById('ConditionConst').value='".HTMLEscape($_POST['EDITConditionConst'])."';\n"; $aViewUrls['output'] .= "\tdocument.getElementById('editTargetTab').value='#CONST';\n"; } elseif (isset($_POST['EDITprevQuestionSGQA']) && $_POST['EDITprevQuestionSGQA'] != '') { $aViewUrls['output'] .= "\tdocument.getElementById('prevQuestionSGQA').value='" . HTMLEscape($_POST['EDITprevQuestionSGQA']) . "';\n"; $aViewUrls['output'] .= "\tdocument.getElementById('editTargetTab').value='#PREVQUESTIONS';\n"; } elseif (isset($_POST['EDITtokenAttr']) && $_POST['EDITtokenAttr'] != '') { $aViewUrls['output'] .= "\tdocument.getElementById('tokenAttr').value='" . HTMLEscape($_POST['EDITtokenAttr']) . "';\n"; $aViewUrls['output'] .= "\tdocument.getElementById('editTargetTab').value='#TOKENATTRS';\n"; } elseif (isset($_POST['EDITConditionRegexp']) && $_POST['EDITConditionRegexp'] != '') { // In order to avoid issues with backslash escaping, I don't use javascript to set the value // Thus the value is directly set when creating the Textarea element //$aViewUrls['output'] .= "\tdocument.getElementById('ConditionRegexp').value='".HTMLEscape($_POST['EDITConditionRegexp'])."';\n"; $aViewUrls['output'] .= "\tdocument.getElementById('editTargetTab').value='#REGEXP';\n"; } elseif (isset($_POST['EDITcanswers']) && is_array($_POST['EDITcanswers'])) { // was a predefined answers post $aViewUrls['output'] .= "\tdocument.getElementById('editTargetTab').value='#CANSWERSTAB';\n"; $aViewUrls['output'] .= "\t\$('#canswersToSelect').val('" . $_POST['EDITcanswers'][0] . "');\n"; } if (isset($_POST['csrctoken']) && $_POST['csrctoken'] != '') { $aViewUrls['output'] .= "\tdocument.getElementById('csrctoken').value='" . HTMLEscape($_POST['csrctoken']) . "';\n"; $aViewUrls['output'] .= "\tdocument.getElementById('editSourceTab').value='#SRCTOKENATTRS';\n"; } else { if (isset($_POST['cquestions']) && $_POST['cquestions'] != '') { $aViewUrls['output'] .= "\tdocument.getElementById('cquestions').value='" . HTMLEscape($_POST['cquestions']) . "';\n"; $aViewUrls['output'] .= "\tdocument.getElementById('editSourceTab').value='#SRCPREVQUEST';\n"; } } } else { // in other modes, for the moment we do the same as for edit mode if (isset($_POST['ConditionConst']) && $_POST['ConditionConst'] != '') { // In order to avoid issues with backslash escaping, I don't use javascript to set the value // Thus the value is directly set when creating the Textarea element //$aViewUrls['output'] .= "\tdocument.getElementById('ConditionConst').value='".HTMLEscape($_POST['ConditionConst'])."';\n"; $aViewUrls['output'] .= "\tdocument.getElementById('editTargetTab').value='#CONST';\n"; } elseif (isset($_POST['prevQuestionSGQA']) && $_POST['prevQuestionSGQA'] != '') { $aViewUrls['output'] .= "\tdocument.getElementById('prevQuestionSGQA').value='" . HTMLEscape($_POST['prevQuestionSGQA']) . "';\n"; $aViewUrls['output'] .= "\tdocument.getElementById('editTargetTab').value='#PREVQUESTIONS';\n"; } elseif (isset($_POST['tokenAttr']) && $_POST['tokenAttr'] != '') { $aViewUrls['output'] .= "\tdocument.getElementById('tokenAttr').value='" . HTMLEscape($_POST['tokenAttr']) . "';\n"; $aViewUrls['output'] .= "\tdocument.getElementById('editTargetTab').value='#TOKENATTRS';\n"; } elseif (isset($_POST['ConditionRegexp']) && $_POST['ConditionRegexp'] != '') { // In order to avoid issues with backslash escaping, I don't use javascript to set the value // Thus the value is directly set when creating the Textarea element //$aViewUrls['output'] .= "\tdocument.getElementById('ConditionRegexp').value='".HTMLEscape($_POST['ConditionRegexp'])."';\n"; $aViewUrls['output'] .= "\tdocument.getElementById('editTargetTab').value='#REGEXP';\n"; } else { // was a predefined answers post if (isset($_POST['cquestions'])) { $aViewUrls['output'] .= "\tdocument.getElementById('cquestions').value='" . HTMLEscape($_POST['cquestions']) . "';\n"; } $aViewUrls['output'] .= "\tdocument.getElementById('editTargetTab').value='#CANSWERSTAB';\n"; } if (isset($_POST['csrctoken']) && $_POST['csrctoken'] != '') { $aViewUrls['output'] .= "\tdocument.getElementById('csrctoken').value='" . HTMLEscape($_POST['csrctoken']) . "';\n"; $aViewUrls['output'] .= "\tdocument.getElementById('editSourceTab').value='#SRCTOKENATTRS';\n"; } else { if (isset($_POST['cquestions'])) { $aViewUrls['output'] .= "\tdocument.getElementById('cquestions').value='" . javascriptEscape($_POST['cquestions']) . "';\n"; } $aViewUrls['output'] .= "\tdocument.getElementById('editSourceTab').value='#SRCPREVQUEST';\n"; } } if (isset($p_scenario)) { $aViewUrls['output'] .= "\tdocument.getElementById('scenario').value='" . $p_scenario . "';\n"; } $aViewUrls['output'] .= "-->\n" . "</script>\n"; } //END: DISPLAY THE ADD or EDIT CONDITION FORM $conditionsoutput = $aViewUrls['output']; $aData['conditionsoutput'] = $conditionsoutput; $this->_renderWrappedTemplate('conditions', $aViewUrls, $aData); // TMSW Conditions->Relevance: Must call LEM->ConvertConditionsToRelevance() whenever Condition is added or updated - what is best location for that action? }
/** * Action to delete a question group. * * @access public * @return void */ public function delete($iSurveyId, $iGroupId) { $iSurveyId = sanitize_int($iSurveyId); if (Permission::model()->hasSurveyPermission($iSurveyId, 'surveycontent', 'delete')) { LimeExpressionManager::RevertUpgradeConditionsToRelevance($iSurveyId); $iGroupId = sanitize_int($iGroupId); $iGroupsDeleted = QuestionGroup::deleteWithDependency($iGroupId, $iSurveyId); if ($iGroupsDeleted > 0) { fixSortOrderGroups($iSurveyId); Yii::app()->setFlashMessage(gT('The question group was deleted.')); } else { Yii::app()->setFlashMessage(gT('Group could not be deleted'), 'error'); } LimeExpressionManager::UpgradeConditionsToRelevance($iSurveyId); $this->getController()->redirect(array('admin/survey/sa/view/surveyid/' . $iSurveyId)); } }
/** * Function responsible for deleting a question. * * @access public * @param string $action * @param int $surveyid * @param int $gid * @param int $qid * @return void */ public function delete($surveyid, $gid, $qid) { $clang = $this->getController()->lang; $surveyid = sanitize_int($surveyid); $gid = sanitize_int($gid); $qid = sanitize_int($qid); if (hasSurveyPermission($surveyid, 'surveycontent', 'delete')) { if (!isset($qid)) { $qid = returnGlobal('qid'); } LimeExpressionManager::RevertUpgradeConditionsToRelevance(NULL, $qid); // Check if any other questions have conditions which rely on this question. Don't delete if there are. // TMSW Conditions->Relevance: Allow such deletes - can warn about missing relevance separately. $ccresult = Conditions::model()->findAllByAttributes(array('cqid' => $qid)); $cccount = count($ccresult); // There are conditions dependent on this question if ($cccount) { foreach ($ccresult as $ccr) { $qidarray[] = $ccr->qid; } if (isset($qidarray)) { $qidlist = implode(", ", $qidarray); } $message = $clang->gT("Question could not be deleted. There are conditions for other questions that rely on this question. You cannot delete this question until those conditions are removed."); $message .= "<br /><a href='" . $this->getController()->createUrl("admin/expressions/sa/survey_logic_file/sid/{$surveyid}") . "' >" . $clang->gT("Look at survey logic files") . "</a>."; $this->getController()->error($message, $this->getController()->createUrl("admin/survey/sa/view/surveyid/{$surveyid}/gid/{$gid}/qid/{$qid}")); } else { $row = Questions::model()->findByAttributes(array('qid' => $qid))->attributes; $gid = $row['gid']; // See if there are any conditions/attributes/answers/defaultvalues for this question, // and delete them now as well Conditions::model()->deleteAllByAttributes(array('qid' => $qid)); Question_attributes::model()->deleteAllByAttributes(array('qid' => $qid)); Answers::model()->deleteAllByAttributes(array('qid' => $qid)); $criteria = new CDbCriteria(); $criteria->addCondition('qid = :qid1 or parent_qid = :qid2'); $criteria->params[':qid1'] = $qid; $criteria->params[':qid2'] = $qid; Questions::model()->deleteAll($criteria); Defaultvalues::model()->deleteAllByAttributes(array('qid' => $qid)); Quota_members::model()->deleteAllByAttributes(array('qid' => $qid)); Questions::model()->updateQuestionOrder($gid, $surveyid); $qid = ""; $postqid = ""; $_GET['qid'] = ""; } Yii::app()->session['flashmessage'] = $clang->gT("Question was successfully deleted."); $this->getController()->redirect($this->getController()->createUrl('admin/survey/sa/view/surveyid/' . $surveyid . '/gid/' . $gid)); } else { Yii::app()->session['flashmessage'] = $clang->gT("You are not authorized to delete questions."); $this->getController()->redirect($this->getController()->createUrl('admin/survey/sa/view/surveyid/' . $surveyid . '/gid/' . $gid)); } }
} $sortorderid--; $_SESSION['flashmessage'] = $clang->gT("Answer options were successfully saved."); $action = 'editansweroptions'; } elseif ($action == "updatesubquestions" && bHasSurveyPermission($surveyid, 'surveycontent', 'update')) { $anslangs = GetAdditionalLanguagesFromSurveyID($surveyid); $baselang = GetBaseLanguageFromSurveyID($surveyid); array_unshift($anslangs, $baselang); $query = "select type from " . db_table_name('questions') . " where qid={$qid}"; $questiontype = $connect->GetOne($query); // Checked $qtypes = getqtypelist('', 'array'); $scalecount = $qtypes[$questiontype]['subquestions']; // First delete any deleted ids $deletedqids = explode(' ', trim($_POST['deletedqids'])); LimeExpressionManager::RevertUpgradeConditionsToRelevance($surveyid); foreach ($deletedqids as $deletedqid) { $deletedqid = (int) $deletedqid; if ($deletedqid > 0) { // don't remove undefined $query = "DELETE FROM " . db_table_name('questions') . " WHERE qid='{$deletedqid}'"; // Checked if (!($result = $connect->Execute($query))) { $databaseoutput .= "<script type=\"text/javascript\">\n<!--\n alert(\"" . $clang->gT("Failed to delete answer", "js") . " - " . $query . " - " . $connect->ErrorMsg() . "\")\n //-->\n</script>\n"; } } } //Determine ids by evaluating the hidden field $rows = array(); $codes = array(); $oldcodes = array();
<?php $data = LimeExpressionManager::RevertUpgradeConditionsToRelevance(); if (is_null($data)) { echo "No conditions found in database. Nothing to revert."; } else { echo "Found and removed relevance for " . $data . " question(s)"; }
/** * This function imports a LimeSurvey .lss survey XML file * * @param mixed $sFullFilepath The full filepath of the uploaded file */ function XMLImportSurvey($sFullFilepath, $sXMLdata = NULL, $sNewSurveyName = NULL, $iDesiredSurveyId = NULL, $bTranslateInsertansTags = true) { Yii::app()->loadHelper('database'); $clang = Yii::app()->lang; $aGIDReplacements = array(); if ($sXMLdata == NULL) { $xml = simplexml_load_file($sFullFilepath); } else { $xml = simplexml_load_string($sXMLdata); } if ($xml->LimeSurveyDocType != 'Survey') { $results['error'] = $clang->gT("This is not a valid LimeSurvey survey structure XML file."); return $results; } $iDBVersion = (int) $xml->DBVersion; $aQIDReplacements = array(); $aQuotaReplacements = array(); $results['defaultvalues'] = 0; $results['answers'] = 0; $results['surveys'] = 0; $results['questions'] = 0; $results['subquestions'] = 0; $results['question_attributes'] = 0; $results['groups'] = 0; $results['assessments'] = 0; $results['quota'] = 0; $results['quotals'] = 0; $results['quotamembers'] = 0; $results['survey_url_parameters'] = 0; $results['importwarnings'] = array(); $aLanguagesSupported = array(); foreach ($xml->languages->language as $language) { $aLanguagesSupported[] = (string) $language; } $results['languages'] = count($aLanguagesSupported); // Import surveys table ==================================================== foreach ($xml->surveys->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $iOldSID = $results['oldsid'] = $insertdata['sid']; if ($iDesiredSurveyId != NULL) { $insertdata['wishSID'] = GetNewSurveyID($iDesiredSurveyId); } if ($iDBVersion <= 143) { if (isset($insertdata['private'])) { $insertdata['anonymized'] = $insertdata['private']; } unset($insertdata['private']); unset($insertdata['notification']); } unset($insertdata['expires']); unset($insertdata['startdate']); //Make sure it is not set active $insertdata['active'] = 'N'; //Set current user to be the owner $insertdata['owner_id'] = Yii::app()->session['loginID']; if (isset($insertdata['bouncetime']) && $insertdata['bouncetime'] == '') { $insertdata['bouncetime'] = NULL; } if (isset($insertdata['showXquestions'])) { $insertdata['showxquestions'] = $insertdata['showXquestions']; unset($insertdata['showXquestions']); } $iNewSID = $results['newsid'] = Survey::model()->insertNewSurvey($insertdata) or safeDie($clang->gT("Error") . ": Failed to insert data [1]<br />"); $results['surveys']++; } // Import survey languagesettings table =================================================================================== foreach ($xml->surveys_languagesettings->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } if (!in_array($insertdata['surveyls_language'], $aLanguagesSupported)) { continue; } $insertdata['surveyls_survey_id'] = $iNewSID; if ($bTranslateInsertansTags) { if ($sNewSurveyName == NULL) { $insertdata['surveyls_title'] = translateLinks('survey', $iOldSID, $iNewSID, $insertdata['surveyls_title']); } else { $insertdata['surveyls_title'] = translateLinks('survey', $iOldSID, $iNewSID, $sNewSurveyName); } if (isset($insertdata['surveyls_description'])) { $insertdata['surveyls_description'] = translateLinks('survey', $iOldSID, $iNewSID, $insertdata['surveyls_description']); } if (isset($insertdata['surveyls_welcometext'])) { $insertdata['surveyls_welcometext'] = translateLinks('survey', $iOldSID, $iNewSID, $insertdata['surveyls_welcometext']); } if (isset($insertdata['surveyls_urldescription'])) { $insertdata['surveyls_urldescription'] = translateLinks('survey', $iOldSID, $iNewSID, $insertdata['surveyls_urldescription']); } if (isset($insertdata['surveyls_email_invite'])) { $insertdata['surveyls_email_invite'] = translateLinks('survey', $iOldSID, $iNewSID, $insertdata['surveyls_email_invite']); } if (isset($insertdata['surveyls_email_remind'])) { $insertdata['surveyls_email_remind'] = translateLinks('survey', $iOldSID, $iNewSID, $insertdata['surveyls_email_remind']); } if (isset($insertdata['surveyls_email_register'])) { $insertdata['surveyls_email_register'] = translateLinks('survey', $iOldSID, $iNewSID, $insertdata['surveyls_email_register']); } if (isset($insertdata['surveyls_email_confirm'])) { $insertdata['surveyls_email_confirm'] = translateLinks('survey', $iOldSID, $iNewSID, $insertdata['surveyls_email_confirm']); } } $result = Surveys_languagesettings::model()->insertNewSurvey($insertdata) or safeDie($clang->gT("Error") . ": Failed to insert data [2]<br />"); } // Import groups table =================================================================================== if (isset($xml->groups->rows->row)) { foreach ($xml->groups->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } if (!in_array($insertdata['language'], $aLanguagesSupported)) { continue; } $iOldSID = $insertdata['sid']; $insertdata['sid'] = $iNewSID; $oldgid = $insertdata['gid']; unset($insertdata['gid']); // save the old qid // now translate any links if ($bTranslateInsertansTags) { $insertdata['group_name'] = translateLinks('survey', $iOldSID, $iNewSID, $insertdata['group_name']); $insertdata['description'] = translateLinks('survey', $iOldSID, $iNewSID, $insertdata['description']); } // Insert the new group if (isset($aGIDReplacements[$oldgid])) { switchMSSQLIdentityInsert('groups', true); $insertdata['gid'] = $aGIDReplacements[$oldgid]; } $newgid = Groups::model()->insertRecords($insertdata) or safeDie($clang->gT("Error") . ": Failed to insert data [3]<br />"); $results['groups']++; if (!isset($aGIDReplacements[$oldgid])) { $aGIDReplacements[$oldgid] = $newgid; // add old and new qid to the mapping array } else { switchMSSQLIdentityInsert('groups', false); } } } // Import questions table =================================================================================== // We have to run the question table data two times - first to find all main questions // then for subquestions (because we need to determine the new qids for the main questions first) if (isset($xml->questions)) { foreach ($xml->questions->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } if (!in_array($insertdata['language'], $aLanguagesSupported) || $insertdata['gid'] == 0) { continue; } $iOldSID = $insertdata['sid']; $insertdata['sid'] = $iNewSID; $insertdata['gid'] = $aGIDReplacements[$insertdata['gid']]; $oldqid = $insertdata['qid']; unset($insertdata['qid']); // save the old qid // now translate any links if ($bTranslateInsertansTags) { $insertdata['question'] = translateLinks('survey', $iOldSID, $iNewSID, $insertdata['question']); $insertdata['help'] = translateLinks('survey', $iOldSID, $iNewSID, $insertdata['help']); } // Insert the new question if (isset($aQIDReplacements[$oldqid])) { $insertdata['qid'] = $aQIDReplacements[$oldqid]; switchMSSQLIdentityInsert('questions', true); } if ($insertdata) { XSSFilterArray($insertdata); } $newqid = Questions::model()->insertRecords($insertdata) or safeDie($clang->gT("Error") . ": Failed to insert data [4]<br />"); if (!isset($aQIDReplacements[$oldqid])) { $aQIDReplacements[$oldqid] = $newqid; $results['questions']++; } else { switchMSSQLIdentityInsert('questions', false); } } } // Import subquestions ------------------------------------------------------- if (isset($xml->subquestions)) { foreach ($xml->subquestions->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } if (!in_array($insertdata['language'], $aLanguagesSupported) || $insertdata['gid'] == 0) { continue; } if (!isset($insertdata['mandatory']) || trim($insertdata['mandatory']) == '') { $insertdata['mandatory'] = 'N'; } $insertdata['sid'] = $iNewSID; $insertdata['gid'] = $aGIDReplacements[(int) $insertdata['gid']]; $oldsqid = (int) $insertdata['qid']; unset($insertdata['qid']); // save the old qid $insertdata['parent_qid'] = $aQIDReplacements[(int) $insertdata['parent_qid']]; // remap the parent_qid // now translate any links if ($bTranslateInsertansTags) { $insertdata['question'] = translateLinks('survey', $iOldSID, $iNewSID, $insertdata['question']); if (isset($insertdata['help'])) { $insertdata['help'] = translateLinks('survey', $iOldSID, $iNewSID, $insertdata['help']); } } if (isset($aQIDReplacements[$oldsqid])) { $insertdata['qid'] = $aQIDReplacements[$oldsqid]; switchMSSQLIdentityInsert('questions', true); } if ($insertdata) { XSSFilterArray($insertdata); } $newsqid = Questions::model()->insertRecords($insertdata) or safeDie($clang->gT("Error") . ": Failed to insert data [5]<br />"); if (!isset($insertdata['qid'])) { $aQIDReplacements[$oldsqid] = $newsqid; // add old and new qid to the mapping array } else { switchMSSQLIdentityInsert('questions', false); } $results['subquestions']++; } } // Import answers ------------------------------------------------------------ if (isset($xml->answers)) { foreach ($xml->answers->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } if (!in_array($insertdata['language'], $aLanguagesSupported) || !isset($aQIDReplacements[(int) $insertdata['qid']])) { continue; } $insertdata['qid'] = $aQIDReplacements[(int) $insertdata['qid']]; // remap the parent_qid // now translate any links if ($bTranslateInsertansTags) { $insertdata['answer'] = translateLinks('survey', $iOldSID, $iNewSID, $insertdata['answer']); } if ($insertdata) { XSSFilterArray($insertdata); } $result = Answers::model()->insertRecords($insertdata) or safeDie($clang->gT("Error") . ": Failed to insert data<br />"); $results['answers']++; } } // Import questionattributes ------------------------------------------------- if (isset($xml->question_attributes)) { $aAllAttributes = questionAttributes(true); foreach ($xml->question_attributes->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } unset($insertdata['qaid']); if (!isset($aQIDReplacements[(int) $insertdata['qid']])) { continue; } $insertdata['qid'] = $aQIDReplacements[(int) $insertdata['qid']]; // remap the qid if ($iDBVersion < 148 && isset($aAllAttributes[$insertdata['attribute']]['i18n']) && $aAllAttributes[$insertdata['attribute']]['i18n']) { foreach ($aLanguagesSupported as $sLanguage) { $insertdata['language'] = $sLanguage; if ($insertdata) { XSSFilterArray($insertdata); } $result = Question_attributes::model()->insertRecords($insertdata) or safeDie($clang->gT("Error") . ": Failed to insert data<br />"); } } else { $result = Question_attributes::model()->insertRecords($insertdata) or safeDie($clang->gT("Error") . ": Failed to insert data<br />"); } $results['question_attributes']++; } } // Import defaultvalues ------------------------------------------------------ if (isset($xml->defaultvalues)) { $results['defaultvalues'] = 0; foreach ($xml->defaultvalues->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $insertdata['qid'] = $aQIDReplacements[(int) $insertdata['qid']]; // remap the qid if (isset($aQIDReplacements[(int) $insertdata['sqid']])) { $insertdata['sqid'] = $aQIDReplacements[(int) $insertdata['sqid']]; } // remap the subquestion id if ($insertdata) { XSSFilterArray($insertdata); } // now translate any links $result = Defaultvalues::model()->insertRecords($insertdata) or safeDie($clang->gT("Error") . ": Failed to insert data<br />"); $results['defaultvalues']++; } } $aOldNewFieldmap = reverseTranslateFieldNames($iOldSID, $iNewSID, $aGIDReplacements, $aQIDReplacements); // Import conditions --------------------------------------------------------- if (isset($xml->conditions)) { $results['conditions'] = 0; foreach ($xml->conditions->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } // replace the qid for the new one (if there is no new qid in the $aQIDReplacements array it mean that this condition is orphan -> error, skip this record) if (isset($aQIDReplacements[$insertdata['qid']])) { $insertdata['qid'] = $aQIDReplacements[$insertdata['qid']]; // remap the qid } else { continue; } // a problem with this answer record -> don't consider if ($insertdata['cqid'] != 0) { if (isset($aQIDReplacements[$insertdata['cqid']])) { $oldcqid = $insertdata['cqid']; //Save for cfield transformation $insertdata['cqid'] = $aQIDReplacements[$insertdata['cqid']]; // remap the qid } else { continue; } // a problem with this answer record -> don't consider list($oldcsid, $oldcgid, $oldqidanscode) = explode("X", $insertdata["cfieldname"], 3); // replace the gid for the new one in the cfieldname(if there is no new gid in the $aGIDReplacements array it means that this condition is orphan -> error, skip this record) if (!isset($aGIDReplacements[$oldcgid])) { continue; } } unset($insertdata["cid"]); // recreate the cfieldname with the new IDs if ($insertdata['cqid'] != 0) { if (preg_match("/^\\+/", $oldcsid)) { $newcfieldname = '+' . $iNewSID . "X" . $aGIDReplacements[$oldcgid] . "X" . $insertdata["cqid"] . substr($oldqidanscode, strlen($oldcqid)); } else { $newcfieldname = $iNewSID . "X" . $aGIDReplacements[$oldcgid] . "X" . $insertdata["cqid"] . substr($oldqidanscode, strlen($oldcqid)); } } else { // The cfieldname is a not a previous question cfield but a {XXXX} replacement field $newcfieldname = $insertdata["cfieldname"]; } $insertdata["cfieldname"] = $newcfieldname; if (trim($insertdata["method"]) == '') { $insertdata["method"] = '=='; } // Now process the value and replace @sgqa@ codes if (preg_match("/^@(.*)@\$/", $insertdata["value"], $cfieldnameInCondValue)) { if (isset($aOldNewFieldmap[$cfieldnameInCondValue[1]])) { $newvalue = '@' . $aOldNewFieldmap[$cfieldnameInCondValue[1]] . '@'; $insertdata["value"] = $newvalue; } } // now translate any links $result = Conditions::model()->insertRecords($insertdata) or safeDie($clang->gT("Error") . ": Failed to insert data<br />"); $results['conditions']++; } } // TMSW Conditions->Relevance: Call LEM->ConvertConditionsToRelevance // Import assessments -------------------------------------------------------- if (isset($xml->assessments)) { foreach ($xml->assessments->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } if ($insertdata['gid'] > 0) { $insertdata['gid'] = $aGIDReplacements[(int) $insertdata['gid']]; // remap the qid } $insertdata['sid'] = $iNewSID; // remap the survey id // now translate any links $result = Assessment::model()->insertRecords($insertdata) or safeDie($clang->gT("Error") . ": Failed to insert data<br />"); $results['assessments']++; } } // Import quota -------------------------------------------------------------- if (isset($xml->quota)) { foreach ($xml->quota->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $insertdata['sid'] = $iNewSID; // remap the survey id $oldid = $insertdata['id']; unset($insertdata['id']); // now translate any links $result = Quota::model()->insertRecords($insertdata) or safeDie($clang->gT("Error") . ": Failed to insert data<br />"); $aQuotaReplacements[$oldid] = Yii::app()->db->getCommandBuilder()->getLastInsertID('{{quota}}'); $results['quota']++; } } // Import quota_members ------------------------------------------------------ if (isset($xml->quota_members)) { foreach ($xml->quota_members->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $insertdata['sid'] = $iNewSID; // remap the survey id $insertdata['qid'] = $aQIDReplacements[(int) $insertdata['qid']]; // remap the qid $insertdata['quota_id'] = $aQuotaReplacements[(int) $insertdata['quota_id']]; // remap the qid unset($insertdata['id']); // now translate any links $result = Quota_members::model()->insertRecords($insertdata) or safeDie($clang->gT("Error") . ": Failed to insert data<br />"); $results['quotamembers']++; } } // Import quota_languagesettings---------------------------------------------- if (isset($xml->quota_languagesettings)) { foreach ($xml->quota_languagesettings->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $insertdata['quotals_quota_id'] = $aQuotaReplacements[(int) $insertdata['quotals_quota_id']]; // remap the qid unset($insertdata['quotals_id']); $result = Quota_languagesettings::model()->insertRecords($insertdata) or safeDie($clang->gT("Error") . ": Failed to insert data<br />"); $results['quotals']++; } } // Import survey_url_parameters ---------------------------------------------- if (isset($xml->survey_url_parameters)) { foreach ($xml->survey_url_parameters->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $insertdata['sid'] = $iNewSID; // remap the survey id if (isset($insertdata['targetsqid']) && $insertdata['targetsqid'] != '') { $insertdata['targetsqid'] = $aSQIDReplacements[(int) $insertdata['targetsqid']]; // remap the qid } if (isset($insertdata['targetqid']) && $insertdata['targetqid'] != '') { $insertdata['targetqid'] = $aQIDReplacements[(int) $insertdata['targetqid']]; // remap the qid } unset($insertdata['id']); $result = Survey_url_parameters::model()->insertRecord($insertdata) or safeDie($clang->gT("Error") . ": Failed to insert data<br />"); $results['survey_url_parameters']++; } } // Set survey rights Survey_permissions::model()->giveAllSurveyPermissions(Yii::app()->session['loginID'], $iNewSID); $aOldNewFieldmap = reverseTranslateFieldNames($iOldSID, $iNewSID, $aGIDReplacements, $aQIDReplacements); $results['FieldReMap'] = $aOldNewFieldmap; LimeExpressionManager::SetSurveyId($iNewSID); translateInsertansTags($iNewSID, $iOldSID, $aOldNewFieldmap); LimeExpressionManager::RevertUpgradeConditionsToRelevance($iNewSID); LimeExpressionManager::UpgradeConditionsToRelevance($iNewSID); return $results; }
/** * RPC Routine to delete a question of a survey . * Returns the id of the deleted question. * * @access public * @param string $sSessionKey Auth credentials * @param int iQuestionID Id of the question to delete * @return array|int Id of the deleted Question or status */ public function delete_question($sSessionKey, $iQuestionID) { if ($this->_checkSessionKey($sSessionKey)) { $oQuestion = Question::model()->findByAttributes(array('qid' => $iQuestionID)); if (!isset($oQuestion)) { return array('status' => 'Error: Invalid question ID'); } $iSurveyID = $oQuestion['sid']; if (Permission::model()->hasSurveyPermission($iSurveyID, 'surveycontent', 'delete')) { $oSurvey = Survey::model()->findByPk($iSurveyID); if ($oSurvey['active'] == 'Y') { return array('status' => 'Survey is active and not editable'); } $iGroupID = $oQuestion['gid']; $oCondition = Condition::model()->findAllByAttributes(array('cqid' => $iQuestionID)); if (count($oCondition) > 0) { return array('status' => 'Cannot delete Question. Others rely on this question'); } LimeExpressionManager::RevertUpgradeConditionsToRelevance(NULL, $iQuestionID); try { Condition::model()->deleteAllByAttributes(array('qid' => $iQuestionID)); QuestionAttribute::model()->deleteAllByAttributes(array('qid' => $iQuestionID)); Answer::model()->deleteAllByAttributes(array('qid' => $iQuestionID)); $sCriteria = new CDbCriteria(); $sCriteria->addCondition('qid = :qid or parent_qid = :qid'); $sCriteria->params[':qid'] = $iQuestionID; Question::model()->deleteAll($sCriteria); DefaultValue::model()->deleteAllByAttributes(array('qid' => $iQuestionID)); QuotaMember::model()->deleteAllByAttributes(array('qid' => $iQuestionID)); Question::updateSortOrder($iGroupID, $iSurveyID); return (int) $iQuestionID; } catch (Exception $e) { return array('status' => 'Error'); } } else { return array('status' => 'No permission'); } } else { return array('status' => 'Invalid session key'); } }
public function set_question_sub_questions($sSessionKey, $iSurveyID, $iQuestionID, $data) { $data_array = unserialize($data); 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($data)); $aDeletedQIDs = explode('+', $data_array['deletedqids']); $iQuestionGroupID = $data_array['gid']; 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) { return "Failed to delete answer"; } } } //Determine ids by evaluating the hidden field $aRows = array(); $aCodes = array(); $aOldCodes = array(); foreach ($data_array as $key => $value) { $key = explode('_', $key); if ($key[0] == 'answer') { $aRows[$key[3]][$key[1]][$key[2]] = $value; } if ($key[0] == 'code') { $aCodes[$key[2]][] = $value; } if ($key[0] == 'oldcode') { $aOldCodes[$key[2]][] = $value; } } $aInsertQID = array(); for ($iScaleID = 0; $iScaleID < $iScaleCount; $iScaleID++) { foreach ($aSurveyLanguages as $sLanguage) { $iPosition = 0; $test = ''; foreach ($aRows[$iScaleID][$sLanguage] as $subquestionkey => $subquestionvalue) { $test .= $subquestionvalue . ', '; // create a new sub question 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; // update the old sub questions } 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; // update old sub questions } 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->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)) { foreach ($aErrors as $sAttribute => $aStringErrors) { foreach ($aStringErrors as $sStringErrors) { return sprintf("Error on %s for subquestion %s: %s", $sAttribute, $aCodes[$iScaleID][$iPosition], $sStringErrors); } } } else { return sprintf("Subquestions %s could not be updated.", $aCodes[$iScaleID][$iPosition]); } } $iPosition++; } } } LimeExpressionManager::UpgradeConditionsToRelevance($iSurveyID); // Do it only if there are no error ? //return "Sub-questions were successfully saved"; return "(" . $test . ")"; }
/** * This function imports a LimeSurvey .lsg question group XML file * * @param mixed $sFullFilepath The full filepath of the uploaded file * @param mixed $newsid The new survey id - the group will always be added after the last group in the survey */ function XMLImportGroup($sFullFilepath, $newsid) { global $connect, $dbprefix, $clang; $aLanguagesSupported = array(); // this array will keep all the languages supported for the survey $sBaseLanguage = GetBaseLanguageFromSurveyID($newsid); $aLanguagesSupported[] = $sBaseLanguage; // adds the base language to the list of supported languages $aLanguagesSupported = array_merge($aLanguagesSupported, GetAdditionalLanguagesFromSurveyID($newsid)); $xml = @simplexml_load_file($sFullFilepath); if ($xml == false || $xml->LimeSurveyDocType != 'Group') { safe_die('This is not a valid LimeSurvey group structure XML file.'); } $dbversion = (double) $xml->DBVersion; $aQIDReplacements = array(); $results['defaultvalues'] = 0; $results['answers'] = 0; $results['question_attributes'] = 0; $results['subquestions'] = 0; $results['conditions'] = 0; $results['groups'] = 0; $importlanguages = array(); foreach ($xml->languages->language as $language) { $importlanguages[] = (string) $language; } if (!in_array($sBaseLanguage, $importlanguages)) { $results['fatalerror'] = $clang->gT("The languages of the imported group file must at least include the base language of this survey."); return $results; } // First get an overview of fieldnames - it's not useful for the moment but might be with newer versions /* $fieldnames=array(); foreach ($xml->questions->fields->fieldname as $fieldname ) { $fieldnames[]=(string)$fieldname; };*/ // Import group table =================================================================================== $tablename = $dbprefix . 'groups'; $newgrouporder = $connect->GetOne("SELECT MAX(group_order) AS maxqo FROM " . db_table_name('groups') . " WHERE sid={$newsid}"); if (is_null($newgrouporder)) { $newgrouporder = 0; } else { $newgrouporder++; } foreach ($xml->groups->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $oldsid = $insertdata['sid']; $insertdata['sid'] = $newsid; $insertdata['group_order'] = $newgrouporder; $oldgid = $insertdata['gid']; unset($insertdata['gid']); // save the old qid // now translate any links $insertdata['group_name'] = translink('survey', $oldsid, $newsid, $insertdata['group_name']); $insertdata['description'] = translink('survey', $oldsid, $newsid, $insertdata['description']); // Insert the new question if (isset($aGIDReplacements[$oldgid])) { $insertdata['gid'] = $aGIDReplacements[$oldgid]; db_switchIDInsert('groups', true); } $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />{$query}<br />\n" . $connect->ErrorMsg()); $results['groups']++; if (!isset($aGIDReplacements[$oldgid])) { $newgid = $connect->Insert_ID($tablename, "gid"); // save this for later $aGIDReplacements[$oldgid] = $newgid; // add old and new qid to the mapping array } else { db_switchIDInsert('groups', false); } } // Import questions table =================================================================================== // We have to run the question table data two times - first to find all main questions // then for subquestions (because we need to determine the new qids for the main questions first) $tablename = $dbprefix . 'questions'; $results['questions'] = 0; if (isset($xml->questions)) { foreach ($xml->questions->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $oldsid = $insertdata['sid']; $insertdata['sid'] = $newsid; if (!isset($aGIDReplacements[$insertdata['gid']]) || trim($insertdata['title']) == '') { continue; } // Skip questions with invalid group id $insertdata['gid'] = $aGIDReplacements[$insertdata['gid']]; $oldqid = $insertdata['qid']; unset($insertdata['qid']); // save the old qid // now translate any links $insertdata['title'] = translink('survey', $oldsid, $newsid, $insertdata['title']); $insertdata['question'] = translink('survey', $oldsid, $newsid, $insertdata['question']); $insertdata['help'] = translink('survey', $oldsid, $newsid, $insertdata['help']); // Insert the new question if (isset($aQIDReplacements[$oldqid])) { $insertdata['qid'] = $aQIDReplacements[$oldqid]; db_switchIDInsert('questions', true); } $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />{$query}<br />\n" . $connect->ErrorMsg()); if (!isset($aQIDReplacements[$oldqid])) { $newqid = $connect->Insert_ID($tablename, "qid"); // save this for later $aQIDReplacements[$oldqid] = $newqid; // add old and new qid to the mapping array $results['questions']++; } else { db_switchIDInsert('questions', false); } } } // Import subquestions -------------------------------------------------------------- if (isset($xml->subquestions)) { foreach ($xml->subquestions->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $insertdata['sid'] = $newsid; if (!isset($aGIDReplacements[$insertdata['gid']])) { continue; } // Skip questions with invalid group id $insertdata['gid'] = $aGIDReplacements[(int) $insertdata['gid']]; $oldsqid = (int) $insertdata['qid']; unset($insertdata['qid']); // save the old qid if (!isset($aQIDReplacements[(int) $insertdata['parent_qid']])) { continue; } // Skip subquestions with invalid parent_qids $insertdata['parent_qid'] = $aQIDReplacements[(int) $insertdata['parent_qid']]; // remap the parent_qid // now translate any links $insertdata['title'] = translink('survey', $oldsid, $newsid, $insertdata['title']); $insertdata['question'] = translink('survey', $oldsid, $newsid, $insertdata['question']); $insertdata['help'] = isset($insertdata['help']) ? translink('survey', $oldsid, $newsid, $insertdata['help']) : ''; if (isset($aQIDReplacements[$oldsqid])) { $insertdata['qid'] = $aQIDReplacements[$oldsqid]; db_switchIDInsert('questions', true); } $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />{$query}<br />\n" . $connect->ErrorMsg()); $newsqid = $connect->Insert_ID($tablename, "qid"); // save this for later if (!isset($insertdata['qid'])) { $aQIDReplacements[$oldsqid] = $newsqid; // add old and new qid to the mapping array } else { db_switchIDInsert('questions', false); } $results['subquestions']++; } } // Import answers -------------------------------------------------------------- if (isset($xml->answers)) { $tablename = $dbprefix . 'answers'; foreach ($xml->answers->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } if (!isset($aQIDReplacements[(int) $insertdata['qid']])) { continue; } // Skip questions with invalid group id $insertdata['qid'] = $aQIDReplacements[(int) $insertdata['qid']]; // remap the parent_qid // now translate any links $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />{$query}<br />\n" . $connect->ErrorMsg()); $results['answers']++; } } // Import questionattributes -------------------------------------------------------------- if (isset($xml->question_attributes)) { $tablename = $dbprefix . 'question_attributes'; foreach ($xml->question_attributes->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } unset($insertdata['qaid']); if (!isset($aQIDReplacements[(int) $insertdata['qid']])) { continue; } // Skip questions with invalid group id $insertdata['qid'] = $aQIDReplacements[(int) $insertdata['qid']]; // remap the parent_qid // now translate any links $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />{$query}<br />\n" . $connect->ErrorMsg()); $results['question_attributes']++; } } // Import defaultvalues -------------------------------------------------------------- if (isset($xml->defaultvalues)) { $tablename = $dbprefix . 'defaultvalues'; $results['defaultvalues'] = 0; foreach ($xml->defaultvalues->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $insertdata['qid'] = $aQIDReplacements[(int) $insertdata['qid']]; // remap the qid if (!isset($aQIDReplacements[(int) $insertdata['sqid']]) || is_null($aQIDReplacements[(int) $insertdata['sqid']])) { $insertdata['sqid'] = 0; // defaults for non-array types } else { $insertdata['sqid'] = $aQIDReplacements[(int) $insertdata['sqid']]; // remap the subqeustion id } // now translate any links $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />" . $query . "<br />\n" . $connect->ErrorMsg()); $results['defaultvalues']++; } } // Import conditions -------------------------------------------------------------- if (isset($xml->conditions)) { $tablename = $dbprefix . 'conditions'; foreach ($xml->conditions->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } // replace the qid for the new one (if there is no new qid in the $aQIDReplacements array it mean that this condition is orphan -> error, skip this record) if (isset($aQIDReplacements[$insertdata['qid']])) { $insertdata['qid'] = $aQIDReplacements[$insertdata['qid']]; // remap the qid } else { continue; } // a problem with this answer record -> don't consider if (isset($aQIDReplacements[$insertdata['cqid']])) { $insertdata['cqid'] = $aQIDReplacements[$insertdata['cqid']]; // remap the qid } else { continue; } // a problem with this answer record -> don't consider list($oldcsid, $oldcgid, $oldqidanscode) = explode("X", $insertdata["cfieldname"], 3); if ($oldcgid != $oldgid) { // this means that the condition is in another group (so it should not have to be been exported -> skip it continue; } unset($insertdata["cid"]); // recreate the cfieldname with the new IDs if (preg_match("/^\\+/", $oldcsid)) { $newcfieldname = '+' . $newsid . "X" . $newgid . "X" . $insertdata["cqid"] . substr($oldqidanscode, strlen($oldqid)); } else { $newcfieldname = $newsid . "X" . $newgid . "X" . $insertdata["cqid"] . substr($oldqidanscode, strlen($oldqid)); } $insertdata["cfieldname"] = $newcfieldname; if (trim($insertdata["method"]) == '') { $insertdata["method"] = '=='; } // now translate any links $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />\$query<br />\n" . $connect->ErrorMsg()); $results['conditions']++; } } LimeExpressionManager::RevertUpgradeConditionsToRelevance($newsid); LimeExpressionManager::UpgradeConditionsToRelevance($newsid); $results['newgid'] = $newgid; $results['labelsets'] = 0; $results['labels'] = 0; return $results; }
/** * This function imports a LimeSurvey .lss survey XML file * * @param mixed $sFullFilepath The full filepath of the uploaded file */ function XMLImportSurvey($sFullFilepath, $sXMLdata = NULL, $sNewSurveyName = NULL, $iDesiredSurveyId = NULL, $bTranslateInsertansTags = true) { global $connect, $dbprefix, $clang, $timeadjust; $iDesiredSurveyId = intval($iDesiredSurveyId); $results['error'] = false; if ($sXMLdata == NULL) { $xml = simplexml_load_file($sFullFilepath); } else { $xml = simplexml_load_string($sXMLdata); } if ($xml->LimeSurveyDocType != 'Survey') { $results['error'] = $clang->gT("This is not a valid LimeSurvey survey structure XML file."); return $results; } else { //$results['error'] = $clang->gT("This is VALID LimeSurvey survey structure XML file."); //echo $clang->gT("This is VALID LimeSurvey survey structure XML file."); //return $results; } $dbversion = (double) $xml->DBVersion; $aQIDReplacements = array(); $aQuotaReplacements = array(); $results['defaultvalues'] = 0; $results['answers'] = 0; $results['surveys'] = 0; $results['questions'] = 0; $results['subquestions'] = 0; $results['question_attributes'] = 0; $results['groups'] = 0; $results['assessments'] = 0; $results['quota'] = 0; $results['quotals'] = 0; $results['quotamembers'] = 0; $results['importwarnings'] = array(); $aLanguagesSupported = array(); foreach ($xml->languages->language as $language) { $aLanguagesSupported[] = (string) $language; } $results['languages'] = count($aLanguagesSupported); // First get an overview of fieldnames - it's not useful for the moment but might be with newer versions /* $fieldnames=array(); foreach ($xml->questions->fields->fieldname as $fieldname ) { $fieldnames[]=(string)$fieldname; };*/ // Import surveys table =================================================================================== $tablename = $dbprefix . 'surveys'; foreach ($xml->surveys->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $oldsid = $insertdata['sid']; if ($iDesiredSurveyId != NULL) { $newsid = GetNewSurveyID($iDesiredSurveyId); } else { $newsid = GetNewSurveyID($oldsid); } if ($dbversion <= 143) { $insertdata['anonymized'] = $insertdata['private']; unset($insertdata['private']); unset($insertdata['notification']); } $insertdata['startdate'] = NULL; //Now insert the new SID and change some values $insertdata['sid'] = $newsid; //Make sure it is not set active $insertdata['active'] = 'N'; //Set current user to be the owner $insertdata['owner_id'] = $_SESSION['loginID']; //Change creation date to import date $insertdata['datecreated'] = $connect->BindTimeStamp(date_shift(date("Y-m-d H:i:s"), "Y-m-d", $timeadjust)); db_switchIDInsert('surveys', true); $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />{$query}<br />\n" . $connect->ErrorMsg()); $results['surveys']++; db_switchIDInsert('surveys', false); } $results['newsid'] = $newsid; // Import survey languagesettings table =================================================================================== $tablename = $dbprefix . 'surveys_languagesettings'; foreach ($xml->surveys_languagesettings->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $insertdata['surveyls_survey_id'] = $newsid; if ($sNewSurveyName == NULL) { $insertdata['surveyls_title'] = translink('survey', $oldsid, $newsid, $insertdata['surveyls_title']); } else { $insertdata['surveyls_title'] = translink('survey', $oldsid, $newsid, $sNewSurveyName); } $insertdata['surveyls_description'] = translink('survey', $oldsid, $newsid, $insertdata['surveyls_description']); $insertdata['surveyls_welcometext'] = translink('survey', $oldsid, $newsid, $insertdata['surveyls_welcometext']); $insertdata['surveyls_urldescription'] = translink('survey', $oldsid, $newsid, $insertdata['surveyls_urldescription']); $insertdata['surveyls_email_invite'] = translink('survey', $oldsid, $newsid, $insertdata['surveyls_email_invite']); $insertdata['surveyls_email_remind'] = translink('survey', $oldsid, $newsid, $insertdata['surveyls_email_remind']); $insertdata['surveyls_email_register'] = translink('survey', $oldsid, $newsid, $insertdata['surveyls_email_register']); $insertdata['surveyls_email_confirm'] = translink('survey', $oldsid, $newsid, $insertdata['surveyls_email_confirm']); $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />{$query}<br />\n" . $connect->ErrorMsg()); } // Import groups table =================================================================================== $tablename = $dbprefix . 'groups'; foreach ($xml->groups->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $oldsid = $insertdata['sid']; $insertdata['sid'] = $newsid; $oldgid = $insertdata['gid']; unset($insertdata['gid']); // save the old qid // now translate any links $insertdata['group_name'] = translink('survey', $oldsid, $newsid, $insertdata['group_name']); $insertdata['description'] = translink('survey', $oldsid, $newsid, $insertdata['description']); // Insert the new group if (isset($aGIDReplacements[$oldgid])) { db_switchIDInsert('groups', true); $insertdata['gid'] = $aGIDReplacements[$oldgid]; } $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />{$query}<br />\n" . $connect->ErrorMsg()); $results['groups']++; if (!isset($aGIDReplacements[$oldgid])) { $newgid = $connect->Insert_ID($tablename, "gid"); // save this for later $aGIDReplacements[$oldgid] = $newgid; // add old and new qid to the mapping array } else { db_switchIDInsert('groups', false); } } // Import questions table =================================================================================== // We have to run the question table data two times - first to find all main questions // then for subquestions (because we need to determine the new qids for the main questions first) if (isset($xml->questions)) { $tablename = $dbprefix . 'questions'; foreach ($xml->questions->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $oldsid = $insertdata['sid']; $insertdata['sid'] = $newsid; $insertdata['gid'] = $aGIDReplacements[$insertdata['gid']]; $oldqid = $insertdata['qid']; unset($insertdata['qid']); // save the old qid // now translate any links $insertdata['title'] = translink('survey', $oldsid, $newsid, $insertdata['title']); $insertdata['question'] = translink('survey', $oldsid, $newsid, $insertdata['question']); $insertdata['help'] = translink('survey', $oldsid, $newsid, $insertdata['help']); // Insert the new question if (isset($aQIDReplacements[$oldqid])) { $insertdata['qid'] = $aQIDReplacements[$oldqid]; db_switchIDInsert('questions', true); } $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />{$query}<br />\n" . $connect->ErrorMsg()); if (!isset($aQIDReplacements[$oldqid])) { $newqid = $connect->Insert_ID($tablename, "qid"); // save this for later $aQIDReplacements[$oldqid] = $newqid; // add old and new qid to the mapping array $results['questions']++; } else { db_switchIDInsert('questions', false); } } } // Import subquestions -------------------------------------------------------------- if (isset($xml->subquestions)) { $tablename = $dbprefix . 'questions'; foreach ($xml->subquestions->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $insertdata['sid'] = $newsid; $insertdata['gid'] = $aGIDReplacements[(int) $insertdata['gid']]; $oldsqid = (int) $insertdata['qid']; unset($insertdata['qid']); // save the old qid $insertdata['parent_qid'] = $aQIDReplacements[(int) $insertdata['parent_qid']]; // remap the parent_qid // now translate any links $insertdata['title'] = translink('survey', $oldsid, $newsid, $insertdata['title']); $insertdata['question'] = translink('survey', $oldsid, $newsid, $insertdata['question']); $insertdata['help'] = translink('survey', $oldsid, $newsid, $insertdata['help']); if (isset($aQIDReplacements[$oldsqid])) { $insertdata['qid'] = $aQIDReplacements[$oldsqid]; db_switchIDInsert('questions', true); } $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />{$query}<br />\n" . $connect->ErrorMsg()); $newsqid = $connect->Insert_ID($tablename, "qid"); // save this for later if (!isset($insertdata['qid'])) { $aQIDReplacements[$oldsqid] = $newsqid; // add old and new qid to the mapping array } else { db_switchIDInsert('questions', false); } $results['subquestions']++; } } // Import answers -------------------------------------------------------------- if (isset($xml->answers)) { $tablename = $dbprefix . 'answers'; foreach ($xml->answers->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $insertdata['qid'] = $aQIDReplacements[(int) $insertdata['qid']]; // remap the parent_qid // now translate any links $insertdata['answer'] = translink('survey', $oldsid, $newsid, $insertdata['answer']); $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />{$query}<br />\n" . $connect->ErrorMsg()); $results['answers']++; } } // Import questionattributes -------------------------------------------------------------- if (isset($xml->question_attributes)) { $tablename = $dbprefix . 'question_attributes'; foreach ($xml->question_attributes->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } unset($insertdata['qaid']); $insertdata['qid'] = $aQIDReplacements[(int) $insertdata['qid']]; // remap the parent_qid // now translate any links $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />{$query}<br />\n" . $connect->ErrorMsg()); $results['question_attributes']++; } } // Import defaultvalues -------------------------------------------------------------- if (isset($xml->defaultvalues)) { $tablename = $dbprefix . 'defaultvalues'; $results['defaultvalues'] = 0; foreach ($xml->defaultvalues->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $insertdata['qid'] = $aQIDReplacements[(int) $insertdata['qid']]; // remap the qid if (isset($aQIDReplacements[(int) $insertdata['sqid']])) { $insertdata['sqid'] = $aQIDReplacements[(int) $insertdata['sqid']]; } // remap the subquestion id // now translate any links $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />{$query}<br />\n" . $connect->ErrorMsg()); $results['defaultvalues']++; } } $aOldNewFieldmap = aReverseTranslateFieldnames($oldsid, $newsid, $aGIDReplacements, $aQIDReplacements); // Import conditions -------------------------------------------------------------- if (isset($xml->conditions)) { $tablename = $dbprefix . 'conditions'; $results['conditions'] = 0; foreach ($xml->conditions->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } // replace the qid for the new one (if there is no new qid in the $aQIDReplacements array it mean that this condition is orphan -> error, skip this record) if (isset($aQIDReplacements[$insertdata['qid']])) { $insertdata['qid'] = $aQIDReplacements[$insertdata['qid']]; // remap the qid } else { continue; } // a problem with this answer record -> don't consider if ($insertdata['cqid'] != 0) { if (isset($aQIDReplacements[$insertdata['cqid']])) { $oldcqid = $insertdata['cqid']; //Save for cfield transformation $insertdata['cqid'] = $aQIDReplacements[$insertdata['cqid']]; // remap the qid } else { continue; } // a problem with this answer record -> don't consider list($oldcsid, $oldcgid, $oldqidanscode) = explode("X", $insertdata["cfieldname"], 3); // replace the gid for the new one in the cfieldname(if there is no new gid in the $aGIDReplacements array it means that this condition is orphan -> error, skip this record) if (!isset($aGIDReplacements[$oldcgid])) { continue; } } unset($insertdata["cid"]); // recreate the cfieldname with the new IDs if ($insertdata['cqid'] != 0) { if (preg_match("/^\\+/", $oldcsid)) { $newcfieldname = '+' . $newsid . "X" . $aGIDReplacements[$oldcgid] . "X" . $insertdata["cqid"] . substr($oldqidanscode, strlen($oldcqid)); } else { $newcfieldname = $newsid . "X" . $aGIDReplacements[$oldcgid] . "X" . $insertdata["cqid"] . substr($oldqidanscode, strlen($oldcqid)); } } else { // The cfieldname is a not a previous question cfield but a {XXXX} replacement field $newcfieldname = $insertdata["cfieldname"]; } $insertdata["cfieldname"] = $newcfieldname; if (trim($insertdata["method"]) == '') { $insertdata["method"] = '=='; } // Now process the value and replace @sgqa@ codes TIBO if (preg_match("/^@(.*)@\$/", $insertdata["value"], $cfieldnameInCondValue)) { if (isset($aOldNewFieldmap[$cfieldnameInCondValue[1]])) { $newvalue = '@' . $aOldNewFieldmap[$cfieldnameInCondValue[1]] . '@'; $insertdata["value"] = $newvalue; } } // now translate any links $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />{$query}<br />\n" . $connect->ErrorMsg()); $results['conditions']++; } } // Import assessments -------------------------------------------------------------- if (isset($xml->assessments)) { $tablename = $dbprefix . 'assessments'; foreach ($xml->assessments->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } if ($insertdata['gid'] > 0) { $insertdata['gid'] = $aGIDReplacements[(int) $insertdata['gid']]; // remap the qid } $insertdata['sid'] = $newsid; // remap the survey id unset($insertdata['id']); // now translate any links $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />{$query}<br />\n" . $connect->ErrorMsg()); $results['assessments']++; } } // Import quota -------------------------------------------------------------- if (isset($xml->quota)) { $tablename = $dbprefix . 'quota'; foreach ($xml->quota->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $insertdata['sid'] = $newsid; // remap the survey id $oldid = $insertdata['id']; unset($insertdata['id']); // now translate any links $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />{$query}<br />\n" . $connect->ErrorMsg()); $aQuotaReplacements[$oldid] = $connect->Insert_ID(db_table_name_nq('quota'), "id"); $results['quota']++; } } // Import quota_members -------------------------------------------------------------- if (isset($xml->quota_members)) { $tablename = $dbprefix . 'quota_members'; foreach ($xml->quota_members->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $insertdata['sid'] = $newsid; // remap the survey id $insertdata['qid'] = $aQIDReplacements[(int) $insertdata['qid']]; // remap the qid $insertdata['quota_id'] = $aQuotaReplacements[(int) $insertdata['quota_id']]; // remap the qid unset($insertdata['id']); // now translate any links $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />{$query}<br />\n" . $connect->ErrorMsg()); $results['quotamembers']++; } } // Import quota_languagesettings -------------------------------------------------------------- if (isset($xml->quota_languagesettings)) { $tablename = $dbprefix . 'quota_languagesettings'; foreach ($xml->quota_languagesettings->rows->row as $row) { $insertdata = array(); foreach ($row as $key => $value) { $insertdata[(string) $key] = (string) $value; } $insertdata['quotals_quota_id'] = $aQuotaReplacements[(int) $insertdata['quotals_quota_id']]; // remap the qid unset($insertdata['quotals_id']); // now translate any links $query = $connect->GetInsertSQL($tablename, $insertdata); $result = $connect->Execute($query) or safe_die($clang->gT("Error") . ": Failed to insert data<br />{$query}<br />\n" . $connect->ErrorMsg()); $results['quotals']++; } } // Set survey rights GiveAllSurveyPermissions($_SESSION['loginID'], $newsid); if ($bTranslateInsertansTags) { TranslateInsertansTags($newsid, $oldsid, $aOldNewFieldmap); } LimeExpressionManager::RevertUpgradeConditionsToRelevance($newsid); LimeExpressionManager::UpgradeConditionsToRelevance($newsid); LimeExpressionManager::SetSurveyId($newsid); return $results; }
/** * Function responsible for deleting a question. * * @access public * @param string $action * @param int $surveyid * @param int $gid * @param int $qid * @return void */ public function delete($surveyid, $gid, $qid) { $surveyid = sanitize_int($surveyid); $gid = sanitize_int($gid); $qid = sanitize_int($qid); $rqid = $qid; if (Permission::model()->hasSurveyPermission($surveyid, 'surveycontent', 'delete')) { if (!isset($qid)) { $qid = returnGlobal('qid'); } LimeExpressionManager::RevertUpgradeConditionsToRelevance(NULL, $qid); // Check if any other questions have conditions which rely on this question. Don't delete if there are. // TMSW Condition->Relevance: Allow such deletes - can warn about missing relevance separately. $ccresult = Condition::model()->findAllByAttributes(array('cqid' => $qid)); $cccount = count($ccresult); // There are conditions dependent on this question if ($cccount) { foreach ($ccresult as $ccr) { $qidarray[] = $ccr->qid; } if (isset($qidarray)) { $qidlist = implode(", ", $qidarray); } $message = gT("Question could not be deleted. There are conditions for other questions that rely on this question. You cannot delete this question until those conditions are removed."); Yii::app()->setFlashMessage($message, 'error'); $this->getController()->redirect(array('admin/survey/sa/listquestions/surveyid/' . $surveyid)); } else { $row = Question::model()->findByAttributes(array('qid' => $qid))->attributes; $gid = $row['gid']; // See if there are any conditions/attributes/answers/defaultvalues for this question, // and delete them now as well Condition::model()->deleteAllByAttributes(array('qid' => $qid)); QuestionAttribute::model()->deleteAllByAttributes(array('qid' => $qid)); Answer::model()->deleteAllByAttributes(array('qid' => $qid)); $criteria = new CDbCriteria(); $criteria->addCondition('qid = :qid1 or parent_qid = :qid2'); $criteria->params[':qid1'] = $qid; $criteria->params[':qid2'] = $qid; Question::model()->deleteAll($criteria); DefaultValue::model()->deleteAllByAttributes(array('qid' => $qid)); QuotaMember::model()->deleteAllByAttributes(array('qid' => $qid)); Question::model()->updateQuestionOrder($gid, $surveyid); $qid = ""; $postqid = ""; $_GET['qid'] = ""; } Yii::app()->session['flashmessage'] = gT("Question was successfully deleted."); // remove question from lastVisited $oCriteria = new CDbCriteria(); $oCriteria->compare('stg_name', 'last_question_%', true, 'AND', false); $oCriteria->compare('stg_value', $rqid, false, 'AND'); SettingGlobal::model()->deleteAll($oCriteria); $this->getController()->redirect(array('admin/survey/sa/listquestions/surveyid/' . $surveyid)); } else { Yii::app()->session['flashmessage'] = gT("You are not authorized to delete questions."); $this->getController()->redirect(array('admin/survey/sa/listquestions/surveyid/' . $surveyid)); } }
/** * 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"); } }
/** * Import survey from an TSV file template that does not require or allow assigning of GID or QID values. * NOTE: This currently only supports import of one language * @global type $connect * @global type $dbprefix * @global type $clang * @global type $timeadjust * @param type $sFullFilePath * @return type * * @author TMSWhite */ function TSVImportSurvey($sFullFilePath) { $clang = Yii::app()->lang; $insertdata = array(); $results = array(); $results['error'] = false; $baselang = 'en'; // TODO set proper default $encoding = ''; $handle = fopen($sFullFilePath, 'r'); $bom = fread($handle, 2); rewind($handle); $aAttributeList = questionAttributes(); // Excel tends to save CSV as UTF-16, which PHP does not properly detect if ($bom === chr(0xff) . chr(0xfe) || $bom === chr(0xfe) . chr(0xff)) { // UTF16 Byte Order Mark present $encoding = 'UTF-16'; } else { $file_sample = fread($handle, 1000) + 'e'; //read first 1000 bytes // + e is a workaround for mb_string bug rewind($handle); $encoding = mb_detect_encoding($file_sample, 'UTF-8, UTF-7, ASCII, EUC-JP,SJIS, eucJP-win, SJIS-win, JIS, ISO-2022-JP'); } if ($encoding && $encoding != 'UTF-8') { stream_filter_append($handle, 'convert.iconv.' . $encoding . '/UTF-8'); } $file = stream_get_contents($handle); fclose($handle); // fix Excel non-breaking space $file = str_replace("0xC20xA0", ' ', $file); $filelines = explode("\n", $file); $row = array_shift($filelines); $headers = explode("\t", $row); $rowheaders = array(); foreach ($headers as $header) { $rowheaders[] = trim($header); } // remove BOM from the first header cell, if needed $rowheaders[0] = preg_replace("/^\\W+/", "", $rowheaders[0]); if (preg_match('/class$/', $rowheaders[0])) { $rowheaders[0] = 'class'; // second attempt to remove BOM } $adata = array(); foreach ($filelines as $rowline) { $rowarray = array(); $row = explode("\t", $rowline); for ($i = 0; $i < count($rowheaders); ++$i) { $val = isset($row[$i]) ? $row[$i] : ''; // if Excel was used, it surrounds strings with quotes and doubles internal double quotes. Fix that. if (preg_match('/^".*"$/', $val)) { $val = str_replace('""', '"', substr($val, 1, -1)); } $rowarray[$rowheaders[$i]] = $val; } $adata[] = $rowarray; } $results['defaultvalues'] = 0; $results['answers'] = 0; $results['surveys'] = 0; $results['languages'] = 0; $results['questions'] = 0; $results['subquestions'] = 0; $results['question_attributes'] = 0; $results['groups'] = 0; $results['importwarnings'] = array(); // these aren't used here, but are needed to avoid errors in post-import display $results['assessments'] = 0; $results['quota'] = 0; $results['quotamembers'] = 0; $results['quotals'] = 0; // collect information about survey and its language settings $surveyinfo = array(); $surveyls = array(); foreach ($adata as $row) { switch ($row['class']) { case 'S': if (isset($row['text']) && $row['name'] != 'datecreated') { $surveyinfo[$row['name']] = $row['text']; } break; case 'SL': if (!isset($surveyls[$row['language']])) { $surveyls[$row['language']] = array(); } if (isset($row['text'])) { $surveyls[$row['language']][$row['name']] = $row['text']; } break; } } $iOldSID = 1; if (isset($surveyinfo['sid'])) { $iOldSID = (int) $surveyinfo['sid']; } // Create the survey entry $surveyinfo['startdate'] = NULL; $surveyinfo['active'] = 'N'; // unset($surveyinfo['datecreated']); $iNewSID = Survey::model()->insertNewSurvey($surveyinfo); //or safeDie($clang->gT("Error").": Failed to insert survey<br />"); if (!$iNewSID) { $results['error'] = Survey::model()->getErrors(); $results['bFailed'] = true; return $results; } $surveyinfo['sid'] = $iNewSID; $results['surveys']++; $results['newsid'] = $iNewSID; $gid = 0; $gseq = 0; // group_order $qid = 0; $qseq = 0; // question_order $qtype = 'T'; $aseq = 0; // answer sortorder // set the language for the survey $_title = 'Missing Title'; foreach ($surveyls as $_lang => $insertdata) { $insertdata['surveyls_survey_id'] = $iNewSID; $insertdata['surveyls_language'] = $_lang; if (isset($insertdata['surveyls_title'])) { $_title = $insertdata['surveyls_title']; } else { $insertdata['surveyls_title'] = $_title; } $result = SurveyLanguageSetting::model()->insertNewSurvey($insertdata); // if (!$result) { $results['error'][] = $clang->gT("Error") . " : " . $clang->gT("Failed to insert survey language"); break; } $results['languages']++; } $ginfo = array(); $qinfo = array(); $sqinfo = array(); if (isset($surveyinfo['language'])) { $baselang = $surveyinfo['language']; // the base language } $rownumber = 1; $lastglang = ''; foreach ($adata as $row) { $rownumber += 1; switch ($row['class']) { case 'G': // insert group $insertdata = array(); $insertdata['sid'] = $iNewSID; $gname = !empty($row['name']) ? $row['name'] : 'G' . $gseq; $glang = !empty($row['language']) ? $row['language'] : $baselang; // when a multi-lang tsv-file without information on the group id/number (old style) is imported, // we make up this information by giving a number 0..[numberofgroups-1] per language. // the number and order of groups per language should be the same, so we can also import these files if ($lastglang != $glang) { $iGroupcounter = 0; } $lastglang = $glang; //use group id/number from file. if missing, use an increasing number (s.a.) $sGroupseq = !empty($row['type/scale']) ? $row['type/scale'] : 'G' . $iGroupcounter++; $insertdata['group_name'] = $gname; $insertdata['grelevance'] = isset($row['relevance']) ? $row['relevance'] : ''; $insertdata['description'] = isset($row['text']) ? $row['text'] : ''; $insertdata['language'] = $glang; // For multi language survey: same gid/sort order across all languages if (isset($ginfo[$sGroupseq])) { $gid = $ginfo[$sGroupseq]['gid']; $insertdata['gid'] = $gid; $insertdata['group_order'] = $ginfo[$sGroupseq]['group_order']; } else { $insertdata['group_order'] = $gseq; } $newgid = QuestionGroup::model()->insertRecords($insertdata); if (!$newgid) { $results['error'][] = $clang->gT("Error") . " : " . $clang->gT("Failed to insert group") . ". " . $clang->gT("Text file row number ") . $rownumber . " (" . $gname . ")"; break; } if (!isset($ginfo[$sGroupseq])) { $results['groups']++; $gid = $newgid; $ginfo[$sGroupseq]['gid'] = $gid; $ginfo[$sGroupseq]['group_order'] = $gseq++; } $qseq = 0; // reset the question_order break; case 'Q': // insert question $insertdata = array(); $insertdata['sid'] = $iNewSID; $qtype = isset($row['type/scale']) ? $row['type/scale'] : 'T'; $qname = isset($row['name']) ? $row['name'] : 'Q' . $qseq; $insertdata['gid'] = $gid; $insertdata['type'] = $qtype; $insertdata['title'] = $qname; $insertdata['question'] = isset($row['text']) ? $row['text'] : ''; $insertdata['relevance'] = isset($row['relevance']) ? $row['relevance'] : ''; $insertdata['preg'] = isset($row['validation']) ? $row['validation'] : ''; $insertdata['help'] = isset($row['help']) ? $row['help'] : ''; $insertdata['language'] = isset($row['language']) ? $row['language'] : $baselang; $insertdata['mandatory'] = isset($row['mandatory']) ? $row['mandatory'] : ''; $lastother = $insertdata['other'] = isset($row['other']) ? $row['other'] : 'N'; // Keep trace of other settings for sub question $insertdata['same_default'] = isset($row['same_default']) ? $row['same_default'] : 0; $insertdata['parent_qid'] = 0; // For multi numeric survey : same name, add the gid to have same name on different gid. Bad for EM. $fullqname = "G{$gid}_" . $qname; if (isset($qinfo[$fullqname])) { $qseq = $qinfo[$fullqname]['question_order']; $qid = $qinfo[$fullqname]['qid']; $insertdata['qid'] = $qid; $insertdata['question_order'] = $qseq; } else { $insertdata['question_order'] = $qseq; } // Insert question and keep the qid for multi language survey $result = Question::model()->insertRecords($insertdata); if (!$result) { $results['error'][] = $clang->gT("Error") . " : " . $clang->gT("Could not insert question") . ". " . $clang->gT("Text file row number ") . $rownumber . " (" . $qname . ")"; break; } $newqid = $result; if (!isset($qinfo[$fullqname])) { $results['questions']++; $qid = $newqid; // save this for later $qinfo[$fullqname]['qid'] = $qid; $qinfo[$fullqname]['question_order'] = $qseq++; } $aseq = 0; //reset the answer sortorder $sqseq = 0; //reset the sub question sortorder // insert question attributes foreach ($row as $key => $val) { switch ($key) { case 'class': case 'type/scale': case 'name': case 'text': case 'validation': case 'relevance': case 'help': case 'language': case 'mandatory': case 'other': case 'same_default': case 'default': break; default: if ($key != '' && $val != '') { $insertdata = array(); $insertdata['qid'] = $qid; // check if attribute is a i18n attribute. If yes, set language, else set language to null in attribute table if (isset($aAttributeList[$qtype][$key]['i18n']) && $aAttributeList[$qtype][$key]['i18n'] == 1) { $insertdata['language'] = isset($row['language']) ? $row['language'] : $baselang; } else { $insertdata['language'] = NULL; } $insertdata['attribute'] = $key; $insertdata['value'] = $val; $result = QuestionAttribute::model()->insertRecords($insertdata); // if (!$result) { $results['importwarnings'][] = $clang->gT("Warning") . " : " . $clang->gT("Failed to insert question attribute") . ". " . $clang->gT("Text file row number ") . $rownumber . " ({$key})"; break; } $results['question_attributes']++; } break; } } // insert default value if (isset($row['default'])) { $insertdata = array(); $insertdata['qid'] = $qid; $insertdata['language'] = isset($row['language']) ? $row['language'] : $baselang; $insertdata['defaultvalue'] = $row['default']; $result = DefaultValue::model()->insertRecords($insertdata); if (!$result) { $results['importwarnings'][] = $clang->gT("Warning") . " : " . $clang->gT("Failed to insert default value") . ". " . $clang->gT("Text file row number ") . $rownumber; break; } $results['defaultvalues']++; } break; case 'SQ': $sqname = isset($row['name']) ? $row['name'] : 'SQ' . $sqseq; if ($qtype == 'O' || $qtype == '|') { // these are fake rows to show naming of comment and filecount fields } elseif ($sqname == 'other' && $lastother == "Y") { if ($qtype == "!" || $qtype == "L") { // only used to set default value for 'other' in these cases if (isset($row['default'])) { $insertdata = array(); $insertdata['qid'] = $qid; $insertdata['specialtype'] = 'other'; $insertdata['language'] = isset($row['language']) ? $row['language'] : $baselang; $insertdata['defaultvalue'] = $row['default']; $result = DefaultValue::model()->insertRecords($insertdata); if (!$result) { $results['importwarnings'][] = $clang->gT("Warning") . " : " . $clang->gT("Failed to insert default value") . ". " . $clang->gT("Text file row number ") . $rownumber; break; } $results['defaultvalues']++; } } } else { $insertdata = array(); $scale_id = isset($row['type/scale']) ? $row['type/scale'] : 0; $insertdata['sid'] = $iNewSID; $insertdata['gid'] = $gid; $insertdata['parent_qid'] = $qid; $insertdata['type'] = $qtype; $insertdata['title'] = $sqname; $insertdata['question'] = isset($row['text']) ? $row['text'] : ''; $insertdata['relevance'] = isset($row['relevance']) ? $row['relevance'] : ''; $insertdata['preg'] = isset($row['validation']) ? $row['validation'] : ''; $insertdata['help'] = isset($row['help']) ? $row['help'] : ''; $insertdata['language'] = isset($row['language']) ? $row['language'] : $baselang; $insertdata['mandatory'] = isset($row['mandatory']) ? $row['mandatory'] : ''; $insertdata['scale_id'] = $scale_id; // For multi nueric language, qid is needed, why not gid. name is not unique. $fullsqname = "G{$gid}Q{$qid}_{$scale_id}_{$sqname}"; if (isset($sqinfo[$fullsqname])) { $qseq = $sqinfo[$fullsqname]['question_order']; $sqid = $sqinfo[$fullsqname]['sqid']; $insertdata['question_order'] = $qseq; $insertdata['qid'] = $sqid; } else { $insertdata['question_order'] = $qseq; } // Insert sub question and keep the sqid for multi language survey $newsqid = Question::model()->insertRecords($insertdata); if (!$newsqid) { $results['error'][] = $clang->gT("Error") . " : " . $clang->gT("Could not insert subquestion") . ". " . $clang->gT("Text file row number ") . $rownumber . " (" . $qname . ")"; break; } if (!isset($sqinfo[$fullsqname])) { $sqinfo[$fullsqname]['question_order'] = $qseq++; $sqid = $newsqid; // save this for later $sqinfo[$fullsqname]['sqid'] = $sqid; $results['subquestions']++; } // insert default value if (isset($row['default'])) { $insertdata = array(); $insertdata['qid'] = $qid; $insertdata['sqid'] = $sqid; $insertdata['scale_id'] = $scale_id; $insertdata['language'] = isset($row['language']) ? $row['language'] : $baselang; $insertdata['defaultvalue'] = $row['default']; $result = DefaultValue::model()->insertRecords($insertdata); if (!$result) { $results['importwarnings'][] = $clang->gT("Warning") . " : " . $clang->gT("Failed to insert default value") . ". " . $clang->gT("Text file row number ") . $rownumber; break; } $results['defaultvalues']++; } } break; case 'A': $insertdata = array(); $insertdata['qid'] = $qid; $insertdata['code'] = isset($row['name']) ? $row['name'] : 'A' . $aseq; $insertdata['answer'] = isset($row['text']) ? $row['text'] : ''; $insertdata['scale_id'] = isset($row['type/scale']) ? $row['type/scale'] : 0; $insertdata['language'] = isset($row['language']) ? $row['language'] : $baselang; $insertdata['assessment_value'] = (int) (isset($row['relevance']) ? $row['relevance'] : ''); $insertdata['sortorder'] = ++$aseq; $result = Answer::model()->insertRecords($insertdata); // or safeDie("Error: Failed to insert answer<br />"); if (!$result) { $results['error'][] = $clang->gT("Error") . " : " . $clang->gT("Could not insert answer") . ". " . $clang->gT("Text file row number ") . $rownumber; } $results['answers']++; break; } } // Delete the survey if error found if (is_array($results['error'])) { $result = Survey::model()->deleteSurvey($iNewSID); } else { LimeExpressionManager::SetSurveyId($iNewSID); LimeExpressionManager::RevertUpgradeConditionsToRelevance($iNewSID); LimeExpressionManager::UpgradeConditionsToRelevance($iNewSID); } return $results; }
/** * 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"); }
if (isset($p_subaction) && $p_subaction == "deletescenario") { LimeExpressionManager::RevertUpgradeConditionsToRelevance(NULL, $qid); // in case deleted the last condition $query = "DELETE FROM {$dbprefix}conditions WHERE qid={$qid} AND scenario={$p_scenario}"; $result = $connect->Execute($query) or safe_die("Couldn't delete scenario<br />{$query}<br />" . $connect->ErrorMsg()); LimeExpressionManager::UpgradeConditionsToRelevance(NULL, $qid); } // UPDATE SCENARIO if (isset($p_subaction) && $p_subaction == "updatescenario" && isset($p_newscenarionum)) { $query = "UPDATE {$dbprefix}conditions SET scenario={$p_newscenarionum} WHERE qid={$qid} AND scenario={$p_scenario}"; $result = $connect->Execute($query) or safe_die("Couldn't update scenario<br />{$query}<br />" . $connect->ErrorMsg()); LimeExpressionManager::UpgradeConditionsToRelevance(NULL, $qid); } // DELETE ALL CONDITIONS FOR THIS QUESTION if (isset($p_subaction) && $p_subaction == "deleteallconditions") { LimeExpressionManager::RevertUpgradeConditionsToRelevance(NULL, $qid); $query = "DELETE FROM {$dbprefix}conditions WHERE qid={$qid}"; $result = $connect->Execute($query) or safe_die("Couldn't delete scenario<br />{$query}<br />" . $connect->ErrorMsg()); } // RENUMBER SCENARIOS if (isset($p_subaction) && $p_subaction == "renumberscenarios") { $query = "SELECT DISTINCT scenario FROM {$dbprefix}conditions WHERE qid={$qid} ORDER BY scenario"; $result = $connect->Execute($query) or safe_die("Couldn't select scenario<br />{$query}<br />" . $connect->ErrorMsg()); $newindex = 1; while ($srow = $result->FetchRow()) { $query2 = "UPDATE {$dbprefix}conditions set scenario={$newindex} WHERE qid={$qid} AND scenario=" . $srow['scenario'] . ";"; $result2 = $connect->Execute($query2) or safe_die("Couldn't renumber scenario<br />{$query}<br />" . $connect->ErrorMsg()); $newindex++; } LimeExpressionManager::UpgradeConditionsToRelevance(NULL, $qid); }
/** * 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"); }
/** * Action to delete a question group. * * @access public * @return void */ public function delete($iSurveyId, $iGroupId) { $iSurveyId = sanitize_int($iSurveyId); if (hasSurveyPermission($iSurveyId, 'surveycontent', 'delete')) { LimeExpressionManager::RevertUpgradeConditionsToRelevance($iSurveyId); $iGroupId = sanitize_int($iGroupId); $clang = $this->getController()->lang; $iGroupsDeleted = Groups::deleteWithDependency($iGroupId, $iSurveyId); if ($iGroupsDeleted !== 1) { fixSortOrderGroups($iSurveyId); Yii::app()->user->setFlash('flashmessage', $clang->gT('The question group was deleted.')); } else { Yii::app()->user->setFlash('flashmessage', $clang->gT('Group could not be deleted')); } $this->getController()->redirect($this->getController()->createUrl('admin/survey/sa/view/surveyid/' . $iSurveyId)); LimeExpressionManager::UpgradeConditionsToRelevance($iSurveyId); } }
/** * 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"); } }