public function set_question_properties($sSessionKey, $iQuestionID, $aQuestionData, $sLanguage = null) { if ($this->_checkSessionKey($sSessionKey)) { Yii::app()->loadHelper("surveytranslator"); $iQuestionID = (int) $iQuestionID; //$oQuestion = Question::model()->findByAttributes(array('qid' => $iQuestionID)); $oQuestion = Question::model()->with('questionl10ns')->findByAttributes(array('qid' => $iQuestionID)); if (is_null($oQuestion)) { return array('status' => 'Error: Invalid question ID'); } $iSurveyID = $oQuestion->sid; if (Permission::model()->hasSurveyPermission($iSurveyID, 'survey', 'update')) { $aResult = array(); // Remove fields that may not be modified unset($aQuestionData['qid']); unset($aQuestionData['gid']); unset($aQuestionData['sid']); unset($aQuestionData['parent_qid']); unset($aQuestionData['type']); // Backwards compatibility for sLanguage parameter if (is_null($sLanguage)) { $sLanguage = Survey::model()->findByPk($iSurveyID)->language; } if (!array_key_exists($sLanguage, getLanguageDataRestricted())) { return array('status' => 'Error: Invalid language'); } // Backwards compatibility for L10n data if (!empty($aQuestionData['language'])) { $language = $aQuestionData['language']; $aQuestionData['questionl10ns'][$language] = array( 'language' => $language, 'question' => !empty($aQuestionData['question']) ? $aQuestionData['question'] : '', 'help' => !empty($aQuestionData['help']) ? $aQuestionData['help'] : '', 'script' => !empty($aQuestionData['script']) ? $aQuestionData['script'] : '', ); } // Process L10n data if (!empty($aQuestionData['questionl10ns']) && is_array($aQuestionData['questionl10ns'])) { $aL10nDestinationFields = array_flip(QuestionL10n::model()->tableSchema->columnNames); foreach ($aQuestionData['questionl10ns'] as $language => $aLanguageData) { // Get existing L10n data or create new if (isset($oQuestion->questionl10ns[$language])) { $oQuestionL10n = $oQuestion->questionl10ns[$language]; } else { $oQuestionL10n = new QuestionL10n(); $oQuestionL10n->gid = $iGroupID; $oQuestionL10n->setAttribute('language', $language); $oQuestionL10n->setAttribute('question', ''); $oQuestionL10n->setAttribute('help', ''); $oQuestionL10n->setAttribute('script', ''); if (!$oQuestionL10n->save()) { $aResult['questionl10ns'][$language] = false; continue; } } // Remove invalid fields $aQuestionL10nData = array_intersect_key($aLanguageData, $aL10nDestinationFields); if (empty($aQuestionL10nData)) { $aResult['questionl10ns'][$language] = 'Empty question L10n data'; continue; } $aQuestionL10nAttributes = $oQuestionL10n->getAttributes(); foreach ($aQuestionL10nData as $sFieldName => $sValue) { $oQuestionL10n->setAttribute($sFieldName, $sValue); try { // save the change to database - one by one to allow for validation to work $bSaveResult = $oQuestionL10n->save(); $aResult['questionl10ns'][$language][$sFieldName] = $bSaveResult; //unset failed values if (!$bSaveResult) { $oQuestionL10n->$sFieldName = $aL10nAttributes[$sFieldName]; } } catch (Exception $e) { //unset values that cause exception $oQuestionL10n->$sFieldName = $aL10nAttributes[$sFieldName]; } } } } // Remove invalid fields $aDestinationFields = array_flip(Question::model()->tableSchema->columnNames); $aQuestionData = array_intersect_key($aQuestionData, $aDestinationFields); $aQuestionAttributes = $oQuestion->getAttributes(); if (empty($aQuestionData)) { if (empty($aResult)) { return array('status' => 'No valid Data'); } else { return $aResult; } } //all the dependencies that this question has to other questions $has_dependencies = getQuestDepsForConditions($oQuestion->sid, $oQuestion->gid, $iQuestionID); //all dependencies by other questions to this question $is_criteria_question = getQuestDepsForConditions($oQuestion->sid, $oQuestion->gid, "all", $iQuestionID, "by-targqid"); foreach ($aQuestionData as $sFieldName => $sValue) { //We do not allow questions with dependencies in the same group to change order - that would lead to broken dependencies if ((isset($has_dependencies) || isset($is_criteria_question)) && $sFieldName == 'question_order') { $aResult[$sFieldName] = 'Questions with dependencies - Order cannot be changed'; continue; } $oQuestion->setAttribute($sFieldName, $sValue); try { $bSaveResult = $oQuestion->save(); // save the change to database Question::model()->updateQuestionOrder($oQuestion->gid); $aResult[$sFieldName] = $bSaveResult; //unset fields that failed if (!$bSaveResult) { $oQuestion->$sFieldName = $aQuestionAttributes[$sFieldName]; } } catch (Exception $e) { //unset fields that caused exception $oQuestion->$sFieldName = $aQuestionAttributes[$sFieldName]; } } return $aResult; } else { return array('status' => 'No permission'); } } else { return array('status' => 'Invalid Session key'); } }