From 410ef007ee7f0f3fe26db6479b048a6addc1d1b5 Mon Sep 17 00:00:00 2001 From: kfegert Date: Fri, 30 Aug 2013 15:56:48 +0200 Subject: [PATCH] New feature update_response function for LSRC2 --- .../remotecontrol/remotecontrol_handle.php | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/application/helpers/remotecontrol/remotecontrol_handle.php b/application/helpers/remotecontrol/remotecontrol_handle.php index d59a3c21f8d..1b24301dd44 100644 --- a/application/helpers/remotecontrol/remotecontrol_handle.php +++ b/application/helpers/remotecontrol/remotecontrol_handle.php @@ -2184,6 +2184,83 @@ public function add_response($sSessionKey, $iSurveyID, $aResponseData) return array('status' => 'No permission'); } + + /** + * RPC Routine to update a response in a given survey. + * Routine supports only single response updates. + * Response to update will be identified either by the response id, or the token if response id is missing. + * Routine is only applicable for active surveys with alloweditaftercompletion = Y. + * + * @access public + * @param string $sSessionKey Auth credentials + * @param int $iSurveyID Id of the Survey to update response + * @param struct $aResponseData The actual response + * @return mixed TRUE(bool) on success. errormessage on error + */ + public function update_response($sSessionKey, $iSurveyID, $aResponseData) + { + if (!$this->_checkSessionKey($sSessionKey)) return 'Invalid session key'; + $oSurvey=Survey::model()->findByPk($iSurveyID); + if (is_null($oSurvey)) + { + return 'Error: Invalid survey ID'; + } + if ($oSurvey->getAttribute('active') !== 'Y') { + return 'Error: Survey is not active.'; + } + + if ($oSurvey->getAttribute('alloweditaftercompletion') !== 'Y') { + return 'Error: Survey does not allow edit after completion.'; + } + + if (Permission::model()->hasSurveyPermission($iSurveyID, 'responses', 'update')) + { + if (!Yii::app()->db->schema->getTable('{{survey_' . $iSurveyID . '}}')) + return 'Error: No survey response table'; + + if ( + !isset($aResponseData['id']) + && ! isset($aResponseData['token']) + ) { + return 'Error: Missing response identifier (id|token).'; + } + + SurveyDynamic::sid($iSurveyID); + $oSurveyDynamic = new SurveyDynamic; + + if (isset($aResponseData['id'])) { + $aResponses = $oSurveyDynamic->findAllByPk($aResponseData['id']); + } else { + $aResponses = $oSurveyDynamic->findAllByAttributes(array('token' => $aResponseData['token'])); + } + + if(empty($aResponses)) + return 'Error: No matching Response.'; + if(count($aResponses) > 1) + return 'Error: More then one matching response, updateing multiple responses at once is not supported.'; + + $aBasicDestinationFields=$oSurveyDynamic->tableSchema->columnNames; + $aInvalidFields= array_diff_key($aResponseData, array_flip($aBasicDestinationFields)); + if(count($aInvalidFields) > 0) + return 'Error: Invalid Column names supplied: ' . implode(', ', array_keys($aInvalidFields)); + + unset($aResponseData['token']); + + foreach ($aResponseData as $sAtributeName => $value) { + $aResponses[0]->setAttribute($sAtributeName, $value); + } + + $bResult = $aResponses[0]->save(true); + + if ($bResult) { + return $bResult; + } else { + return 'Unable to edit response'; + } + } else { + return 'No permission'; + } + } /** * RPC Routine to export responses.