Ejemplo n.º 1
0
    public function do_create_or_update_response($create_response = true)
    {
        $app = JFactory::getApplication();
        $user = JFactory::getUser();
        $config = JComponentHelper::getParams(S_APP_NAME);
        $sid = $app->input->getInt('id', 0);
        $key = trim($app->input->getCmd('key', null));
        $skey = trim($app->input->getCmd('skey', null));
        $response_id = 0;
        $obj_response = null;
        $survey = new stdClass();
        $survey->error = false;
        $user_id = $user->id;
        if (empty($skey) && empty($sid) && empty($key)) {
            $this->setError('Error: 10301 - ' . JText::_('MSG_SURVEY_NOT_FOUND'));
            $survey->error = 1;
            return $survey;
        }
        if (!empty($key)) {
            $query = 'select survey_id, user_id from #__survey_keys where key_name=' . $this->_db->quote($key);
            $this->_db->setQuery($query);
            $keyObj = $this->_db->loadObject();
            if ($keyObj) {
                $sid = $keyObj->survey_id;
                if (!empty($keyObj->user_id)) {
                    $user_id = $keyObj->user_id;
                }
            }
        } else {
            if (!empty($skey)) {
                $query = 'select id from #__survey where survey_key=' . $this->_db->quote($skey);
                $this->_db->setQuery($query);
                $sid = $this->_db->loadResult();
            }
        }
        // Get the survey.
        $survey = $this->get_survey_details($sid, 0, false, true, true);
        $survey->error = false;
        $survey->skey = $skey;
        $survey->key = $key;
        if (empty($survey) || !$survey->id) {
            // Looks like a deleted survey or some error occurred
            $this->setError('Error: 10305 - ' . JText::_('MSG_ERROR_PROCESSING'));
            $survey = new stdClass();
            $survey->error = 2;
            return $survey;
        }
        if ($survey->published != 1) {
            $survey->error = 3;
            return $survey;
        }
        if (!$user->authorise('core.respond', S_APP_NAME . '.category.' . $survey->catid)) {
            $survey->error = $user->guest ? 4 : 5;
            return $survey;
        }
        if ($survey->private_survey == '1' && empty($key) && empty($skey)) {
            $this->setError(JText::_('MSG_PRIVATE_SURVEY_WITH_NO_KEY') . '| SKey: ' . $skey . '| Key' . $key);
            $survey->error = 6;
            return $survey;
        }
        if ($survey->publish_up != '0000-00-00 00:00:00') {
            $date = JFactory::getDate($survey->publish_up);
            $compareTo = JFactory::getDate();
            if ($compareTo->toUnix() - $date->toUnix() < 0) {
                $this->setError(JText::_('MSG_SURVEY_NOT_YET_UP'));
                $survey->error = 7;
                return $survey;
            }
        }
        if ($survey->publish_down != '0000-00-00 00:00:00') {
            $date = JFactory::getDate($survey->publish_down);
            $compareTo = JFactory::getDate();
            if ($compareTo->toUnix() - $date->toUnix() > 0) {
                $this->setError(JText::_('MSG_SURVEY_CLOSED'));
                $survey->error = 8;
                return $survey;
            }
        }
        // 		if(!$this->checkUserGroupsLimit($survey->id))
        // 		{
        // 			$survey->error = 19;
        // 			return $survey;
        // 		}
        if ($create_response == false) {
            // do not create or check for the response
            return $survey;
        }
        if (!empty($key)) {
            $query = 'select id, completed, created, completed > created as completed, survey_key, created_by ' . 'from #__survey_responses where survey_key=' . $this->_db->quote($key) . ' order by created desc';
            $this->_db->setQuery($query);
            $obj_response = $this->_db->loadObject();
            if (!empty($obj_response) && $obj_response->completed == 1) {
                $this->setError('Error: 10304 - ' . JText::_('MSG_SURVEY_ALREADY_TAKEN') . (S_DEBUG_ENABLED ? print_r($obj_response, true) : ''));
                $survey->response_id = $obj_response->id;
                $survey->error = 9;
                return $survey;
            }
        } else {
            // now let us find the response id based on the restriction method used
            if (empty($obj_response) && strpos($survey->restriction, 'cookie') !== false) {
                //now we have the sid and we need response id, first check if there is a key in cookie with the sid
                $cookieName = trim(CJFunctions::get_hash($app->getName() . S_COOKIE_PREFIX . $sid));
                $cookie_key = trim(JRequest::getVar($cookieName, null, 'COOKIE', 'CMD'));
                if (!empty($cookie_key)) {
                    $query = 'select id, completed > created as completed, survey_key, created_by from #__survey_responses where survey_key=' . $this->_db->quote($cookie_key);
                    $this->_db->setQuery($query);
                    $obj_response = $this->_db->loadObject();
                }
                if (!empty($obj_response) && $obj_response->completed == 1) {
                    $this->setError('Error: 103041 - ' . JText::_('MSG_SURVEY_ALREADY_TAKEN') . (S_DEBUG_ENABLED ? print_r($obj_response, true) : ''));
                    $survey->response_id = $obj_response->id;
                    $survey->error = 10;
                    return $survey;
                }
            }
            if (empty($obj_response) && strpos($survey->restriction, 'ip') !== false) {
                $ip_address = CJFunctions::get_user_ip_address();
                $query = '
						select
							id, completed > created as completed, survey_key, created_by
						from
							#__survey_responses
						where
							survey_id=' . $sid . ' and ip_address=' . $this->_db->quote($ip_address);
                $this->_db->setQuery($query);
                $obj_response = $this->_db->loadObject();
                if (!empty($obj_response) && $obj_response->completed == 1) {
                    $this->setError('Error: 103042 - ' . JText::_('MSG_SURVEY_ALREADY_TAKEN'));
                    $survey->error = 11;
                    return $survey;
                }
            }
            if (!$user->guest && empty($obj_response)) {
                $query = '
						select
							id, completed > created as completed, survey_key, created_by
						from
							#__survey_responses
						where
							survey_id=' . $sid . ' and created_by=' . $user->id . '
						order by
							created desc';
                $this->_db->setQuery($query);
                $obj_response = $this->_db->loadObject();
                if (!empty($obj_response) && $obj_response->completed == 1) {
                    if (strpos($survey->restriction, 'username') !== false) {
                        $this->setError('Error: 103043 - ' . JText::_('MSG_SURVEY_ALREADY_TAKEN'));
                        $survey->error = 12;
                        return $survey;
                    } else {
                        $obj_response = null;
                    }
                }
            }
        }
        if (!empty($obj_response)) {
            if ($survey->anonymous == 1 || $obj_response->created_by == $user_id) {
                $response_id = $obj_response->id;
                $key = $obj_response->survey_key;
            }
        } else {
            if (!empty($key)) {
                // new survey with created key from invite page. no response should exist with this key so new response is created next
                // check if this key is legimate
                $query = 'select count(*) from #__survey_keys where key_name = ' . $this->_db->quote($key);
                $this->_db->setQuery($query);
                $count = $this->_db->loadResult();
                if ($count <= 0) {
                    $this->setError('Error: 103044 - ' . JText::_('MSG_ERROR_PROCESSING'));
                    $survey->error = 13;
                    return $survey;
                }
            }
        }
        if (!$response_id || empty($key)) {
            // No response id, so there is no way to track if he has responded. Create a survey response now.
            $query = 'select count(*) from #__survey_responses where survey_id=' . $sid;
            $this->_db->setQuery($query);
            $max_responses = $this->_db->loadResult();
            if ($survey->max_responses > 0 && $survey->max_responses <= $max_responses) {
                $this->setError(JText::_('MSG_EXCEED_RESPONSE_LIMIT'));
                $survey->error = 14;
                return $survey;
            }
            if (!$key) {
                $key = $this->create_survey_keys($sid, 1, false, true);
            }
            if (empty($key) || count($key) == 0) {
                $this->setError(JText::_('MSG_NO_CREDITS'));
                $survey->error = 15;
                return $survey;
            } else {
                $key = is_array($key) ? $key[0] : $key;
                $cookieName = CJFunctions::get_hash($app->getName() . S_COOKIE_PREFIX . $sid);
                $expire = time() + 60 * 60 * 24 * intval($config->get('cookie_expiration_days', 365));
                setcookie($cookieName, $key, $expire, '/');
            }
            $createdate = JFactory::getDate()->toSql();
            $ip_address = CJFunctions::get_user_ip_address();
            $location = CJFunctions::get_user_location($ip_address);
            $browser = CJFunctions::get_browser();
            if ($survey->anonymous) {
                $query = 'insert into #__survey_responses(survey_id, created, survey_key, country, browser, os) ' . 'values (' . $sid . ',' . $this->_db->quote($createdate) . ',' . $this->_db->quote($key) . ',' . $this->_db->quote($location['country_code']) . ',' . $this->_db->quote($browser['name'] . ' ' . $browser['version']) . ',' . $this->_db->quote($browser['platform']) . ')';
            } else {
                $query = 'insert into #__survey_responses(survey_id, created, survey_key, country, city, created_by, ip_address, browser, os) values (' . $sid . ',' . $this->_db->quote($createdate) . ',' . $this->_db->quote($key) . ',' . $this->_db->quote($location['country_code']) . ',' . $this->_db->quote($location['city']) . ',' . $user_id . ',' . $this->_db->quote($ip_address) . ',' . $this->_db->quote($browser['name'] . ' ' . $browser['version']) . ',' . $this->_db->quote($browser['platform']) . ')';
            }
            $this->_db->setQuery($query);
            if ($this->_db->query()) {
                $response_id = $this->_db->insertid();
                $query = '
					update
						#__survey_keys
					set
						response_id=' . $response_id . ',
						response_status = 2
					where
						key_name=' . $this->_db->quote($key) . ' and survey_id=' . $sid;
                $this->_db->setQuery($query);
                if (!$this->_db->query()) {
                    $this->setError('Error: 10310 - ' . JText::_('MSG_ERROR_PROCESSING'));
                    $survey->error = 16;
                    return $survey;
                }
            } else {
                $this->setError('Error: 10311 - ' . JText::_('MSG_ERROR_PROCESSING') . (S_DEBUG_ENABLED ? $this->_db->getErrorMsg() : ''));
                $survey->error = 17;
                return $survey;
            }
        }
        $survey->response_id = $response_id;
        $survey->key = $key;
        if (!$survey->response_id || empty($survey->key)) {
            $survey->error = 18;
        }
        return $survey;
    }