public function actionSaveResponse() { $competition_user_id = isset(Yii::app()->session['competition_user_id']) ? Yii::app()->session['competition_user_id'] : 0; if ($competition_user_id == 0) { self::reponseJSON(array('success' => false, 'error' => Yii::t('app', 'User is not authenticated.'))); } $competitionUser = CompetitionUser::model()->findByPk($competition_user_id); if ($competitionUser != null) { if ($competitionUser == null) { $competitionUser = new CompetitionUser(); } if ($competitionUser->finished == 1 || $competitionUser->finish_time != null) { self::reponseJSON(array('success' => false, 'errorCode' => 999, 'error' => Yii::t('app', 'You already finished competition. You cannot save answer anymore.'))); } if ($competitionUser->start_time != null) { $duration = $competitionUser->competition->duration * 60; $starttime = strtotime($competitionUser->start_time); $endtime = $starttime + $duration; if ($endtime < time()) { self::reponseJSON(array('success' => false, 'errorCode' => 999, 'error' => Yii::t('app', 'Time is up. Answer cannot be saved!'))); } } else { self::reponseJSON(array('success' => false, 'error' => Yii::t('app', 'User did not authenticate competition!'))); } } else { self::reponseJSON(array('success' => false, 'error' => Yii::t('app', 'User is not authenticated.'))); } $question_id = Yii::app()->getRequest()->getPost('q', 0); if ($question_id == 0) { self::reponseJSON(array('success' => false, 'error' => Yii::t('app', 'Empty Question ID!'))); } $answer = Yii::app()->getRequest()->getPost('a', ''); $competition_user_question = CompetitionUserQuestion::model()->with('competitionQuestion')->find('competitionQuestion.question_id=:question_id and t.competition_user_id=:competition_user_id', array(':question_id' => $question_id, ':competition_user_id' => $competition_user_id)); if ($competition_user_question != null) { // DUMPING DATA TO DISK if (Yii::app()->params['dump_answers_to_disk']) { $dataToLog = $competition_user_id . ";" . $question_id . ";" . $answer . ";" . date("Y-m-d H:i:s") . "\n"; if (file_put_contents(dirname(__FILE__) . "/../data/" . $competition_user_id . ".txt", $dataToLog, FILE_APPEND) === FALSE) { self::reponseJSON(array('success' => false, 'error' => Yii::t('app', 'Error saving question answer into a file!'))); } else { self::reponseJSON(array('success' => true)); } } else { // END OF DUMPING DATA TO DISK if ($competition_user_question->custom_answer != $answer) { $competition_user_question->custom_answer = $answer; $competition_user_question->last_change = date('Y-m-d H:i:s'); if ($competition_user_question->save(true, array('custom_answer', 'last_change'))) { self::reponseJSON(array('success' => true)); } else { self::reponseJSON(array('success' => false, 'error' => Yii::t('app', 'Error saving question answer!'))); } } else { self::reponseJSON(array('success' => true, 'same_in_db' => true, 'error' => Yii::t('app', 'Nothing changed!'))); } } } else { self::reponseJSON(array('success' => false, 'error' => Yii::t('app', 'You submited answer for question you don\'t have!'))); } }
public function actionGet() { $starttime = microtime(true); if ($this->CanAccess('get')) { $keys = array_keys($_GET); if (count($keys) == 0) { die; } $question_id = $keys[0]; $superuser = Generic::isSuperAdmin(); $user_role = Generic::getUserRole(); $allow = false; if ($superuser || $user_role >= 10) { $allow = true; } $competition_user_id = isset(Yii::app()->session['competition_user_id']) ? Yii::app()->session['competition_user_id'] : 0; Yii::app()->session->close(); $criteria = new CDbCriteria(); $criteria->limit = 1; $criteria->join = 'INNER JOIN competition_question on t.competition_question_id = competition_question.id'; $criteria->condition = 't.competition_user_id = :competition_user_id AND competition_question.question_id = :question_id'; $criteria->params = array(':question_id' => $question_id, ':competition_user_id' => $competition_user_id); $competition_user_question = CompetitionUserQuestion::model()->find($criteria); //$competition_user_question = CompetitionUserQuestion::model()->with('competitionQuestion')->find('competitionQuestion.question_id=:question_id and t.competition_user_id=:competition_user_id', array(':question_id' => $question_id, ':competition_user_id' => $competition_user_id)); if ($competition_user_question != null) { $allow = true; } if ($allow) { $path = ''; foreach ($_GET as $key => $value) { $path .= $key . '/'; if ($value != '') { $path .= $value . '/'; } } $path = trim(mb_substr($path, mb_strpos($path, '/', 0, 'UTF-8') + 1, mb_strlen($path, 'UTF-8'), 'UTF-8'), '/'); $filename = trim(mb_substr($path, mb_strrpos($path, '/', 0, 'UTF-8'), mb_strlen($path, 'UTF-8'), 'UTF-8'), '/'); $language_code = mb_substr($path, 0, mb_strpos($path, '/', 0, 'UTF-8'), 'UTF-8'); $path = ltrim(mb_substr($path, mb_strpos($path, '/', 0, 'UTF-8'), mb_strrpos($path, '/', 0, 'UTF-8') - mb_strpos($path, '/', 0, 'UTF-8'), 'UTF-8'), '/'); if ($path != '') { $path .= '/'; } /* echo "<pre>"; echo "Question ID: "; print_r($question_id); echo "\n"; echo "Language code: "; print_r($language_code); echo "\n"; var_dump($path); echo "\n"; print_r($filename); echo "</pre>"; die(); */ $cache_id = 'bober-' . $question_id . '-' . $language_code . '-' . $path . '-' . $filename; $questionResourceArray = Yii::app()->cache->get($cache_id); if ($questionResourceArray === false) { $questionResource = QuestionResource::model()->with('language')->find('question_id=:question_id and language.short=:language_code and path=:path and filename=:filename', array(':question_id' => $question_id, ':filename' => $filename, ':path' => $path, ':language_code' => $language_code)); if ($questionResource == null) { $questionResource = new QuestionResource(); die; } $questionResourceArray = array('data' => $questionResource->data, 'file_type' => $questionResource->file_type, 'length' => strlen($questionResource->data)); if ($questionResourceArray['length'] > 1000000) { // cannot go to memcache } else { Yii::app()->cache->set($cache_id, $questionResourceArray, 1800); } } if (isset($questionResourceArray['length'])) { header('Pragma: public'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Content-Transfer-Encoding: binary'); header('Content-length: ' . $questionResourceArray['length']); header('Content-Type: ' . $questionResourceArray['file_type']); header('X-Content-Type-Options: nosniff'); header('X-Frame-Options: SAMEORIGIN'); header('Connection: close'); echo $questionResourceArray['data']; } die; } else { die; } } else { die; } }