From: <gem...@li...> - 2012-11-15 15:37:10
|
Revision: 1018 http://gemstracker.svn.sourceforge.net/gemstracker/?rev=1018&view=rev Author: matijsdejong Date: 2012-11-15 15:37:03 +0000 (Thu, 15 Nov 2012) Log Message: ----------- Token/ask is now token language and organization aware Modified Paths: -------------- trunk/library/classes/Gems/Default/AskAction.php trunk/library/classes/Gems/Tracker/RespondentTrack.php trunk/library/classes/Gems/Tracker/Token.php trunk/library/classes/MUtil/Controller/Action.php Modified: trunk/library/classes/Gems/Default/AskAction.php =================================================================== --- trunk/library/classes/Gems/Default/AskAction.php 2012-11-15 14:18:41 UTC (rev 1017) +++ trunk/library/classes/Gems/Default/AskAction.php 2012-11-15 15:37:03 UTC (rev 1018) @@ -65,6 +65,39 @@ protected $labelWidthFactor = 0.8; /** + * + * @var Zend_Locale + */ + public $locale; + + /** + * The current token ID + * + * set by _initToken() + * + * @var Gems_Tracker + */ + protected $tokenId; + + /** + * The current token + * + * set by _initToken() + * + * @var Gems_Tracker_Token + */ + protected $token; + + /** + * The tracker + * + * set by _initToken() + * + * @var Gems_Tracker + */ + protected $tracker; + + /** * Set to true in child class for automatic creation of $this->html. * * To initiate the use of $this->html from the code call $this->initHtml() @@ -77,6 +110,52 @@ public $useHtmlView = true; /** + * Common handler utility to initialize tokens from parameters + * + * @return boolean True if there is a real token specified in the request + */ + protected function _initToken() + { + if ($this->tracker) { + return $this->token && $this->token->exists; + } + + $this->tracker = $this->loader->getTracker(); + $this->tokenId = $this->tracker->filterToken($this->_getParam(MUtil_Model::REQUEST_ID)); + + if (! $this->tokenId) { + return false; + } + + $this->token = $this->tracker->getToken($this->tokenId); + + if (! $this->token->exists) { + return false; + } + + if (! $this->loader->getCurrentUser()->isActive()) { + $tokenLang = strtolower($this->token->getRespondentLanguage()); + // MUtil_Echo::track($tokenLang, $this->locale->getLanguage()); + if ($tokenLang != $this->locale->getLanguage()) { + $this->locale->setLocale($tokenLang); + $this->translate->getAdapter()->setLocale($this->locale); + $this->session->user_locale = $tokenLang; + Gems_Cookies::setLocale($tokenLang, $this->basepath->getBasePath()); + } + + $currentOrg = $this->loader->getOrganization(); + $tokenOrgId = $this->token->getOrganizationId(); + + if ($tokenOrgId != $currentOrg->getId()) { + $this->loader->getOrganization($tokenOrgId) + ->setAsCurrentOrganization(); + } + } + + return true; + } + + /** * Function for overruling the display of the login form. * * @param Gems_Tracker_Form_AskTokenForm $form @@ -113,40 +192,47 @@ * Find token * **************/ - if ($tokenId = $this->_getParam(MUtil_Model::REQUEST_ID)) { - $tracker = $this->loader->getTracker(); - $tokenId = $tracker->filterToken($tokenId); - $token = $tracker->getToken($tokenId); + if (! $this->_initToken()) { + if ($this->tokenId) { + // There is a token but is incorrect + $this->addMessage(sprintf( + $this->_('The token %s does not exist (any more).'), + strtoupper($this->tokenId) + )); + } + $this->_forward('index'); + return; + } - if ($token->exists) { + /**************************** + * Update open tokens first * + ****************************/ + $this->tracker->processCompletedTokens( + $this->token->getRespondentId(), + $this->token->getChangedBy(), + $this->token->getOrganizationId() + ); - /**************************** - * Update open tokens first * - ****************************/ - $respId = $token->getRespondentId(); - $tracker->processCompletedTokens($respId, $token->getChangedBy()); + // Display token when possible + if ($this->html->snippet($this->forwardSnippets, 'token', $this->token)) { + return; + } - // Display token when possible - if ($this->html->snippet($this->forwardSnippets, 'token', $token)) { - return; - } - - // Snippet had nothing to display, because of an answer - if ($this->getRequest()->getActionName() == 'return') { - $this->addMessage(sprintf($this->_('Thank you for answering. At the moment we have no further surveys for you to take.'), strtoupper($tokenId))); - } else { - $this->addMessage(sprintf($this->_('The survey for token %s has been answered and no further surveys are open.'), strtoupper($tokenId))); - } - - // Do not enter a loop!! Reroute! - $this->_reroute(array('controller' => 'ask', 'action' => 'index'), true); - - } else { - $this->addMessage(sprintf($this->_('The token %s does not exist (any more).'), strtoupper($tokenId))); - } + // Snippet had nothing to display, because of an answer + if ($this->getRequest()->getActionName() == 'return') { + $this->addMessage(sprintf( + $this->_('Thank you for answering. At the moment we have no further surveys for you to take.'), + strtoupper($this->tokenId) + )); + } else { + $this->addMessage(sprintf( + $this->_('The survey for token %s has been answered and no further surveys are open.'), + strtoupper($this->tokenId) + )); } - $this->_forward('index'); + // Do not enter a loop!! Reroute! + $this->_reroute(array('controller' => 'ask', 'action' => 'index'), true); } /** @@ -161,7 +247,10 @@ $request = $this->getRequest(); $tracker = $this->loader->getTracker(); - $form = $tracker->getAskTokenForm(array('displayOrder' => array('element', 'description', 'errors'), 'labelWidthFactor' => 0.8)); + $form = $tracker->getAskTokenForm(array( + 'displayOrder' => array('element', 'description', 'errors'), + 'labelWidthFactor' => 0.8 + )); if ($request->isPost() && $form->isValid($request->getParams())) { $this->_forward('forward'); @@ -173,58 +262,51 @@ } /** - * Common handler utility to initialize tokens from parameters - */ - protected function initToken() - { - $this->tracker = $this->loader->getTracker(); - $this->tokenId = $this->tracker->filterToken($this->_getParam(MUtil_Model::REQUEST_ID)); - $this->token = $this->tracker->getToken($this->tokenId); - } - - /** * The action where survey sources should return to after survey completion */ public function returnAction() { - $tracker = $this->loader->getTracker(); + if (! $this->_initToken()) { + // In all other cases: the action that generates meaningfull warnings and is reachable for everyone + $this->_forward('forward'); + return; + } - if ($tokenId = $this->_getParam(MUtil_Model::REQUEST_ID)) { - $tokenId = $tracker->filterToken($tokenId); - $token = $tracker->getToken($tokenId); + if ($url = $this->token->getReturnUrl()) { + // Check for completed tokens + $this->tracker->processCompletedTokens( + $this->token->getRespondentId(), + $this->token->getChangedBy(), + $this->token->getOrganizationId() + ); - if ($url = $token->getReturnUrl()) { - // Check for completed tokens - $this->loader->getTracker()->processCompletedTokens($token->getRespondentId(), $token->getChangedBy()); + // Redirect at once, might be another site url + header('Location: ' . $url); + exit(); + } - // Redirect at once, might be another site url - header('Location: ' . $url); - exit(); - } + // No return? Check for old style user based return + $user = $this->loader->getCurrentUser(); - // Nor return? Check for old style user based return - $user = $this->loader->getCurrentUser(); + if (! $user->isActive()) { + $this->_forward('forward'); + return; + } - if ($user->isActive() && ($parameters = $user->getSurveyReturn())) { + // Check for completed tokens + $this->tracker->processCompletedTokens($this->token->getRespondentId(), $user->getUserId()); - // Check for completed tokens - $this->loader->getTracker()->processCompletedTokens($token->getRespondentId(), $user->getUserId()); - - if (! $parameters) { - // Default - $request = $this->getRequest(); - $parameters[$request->getControllerKey()] = 'respondent'; - $parameters[$request->getActionKey()] = 'show'; - $parameters[MUtil_Model::REQUEST_ID] = $token->getPatientNumber(); - } - - $this->_reroute($parameters, true); - return; - } + // Get return route parameters + $parameters = $user->getSurveyReturn(); + if (! $parameters) { + // Default fallback for the fallback + $request = $this->getRequest(); + $parameters[$request->getControllerKey()] = 'respondent'; + $parameters[$request->getActionKey()] = 'show'; + $parameters[MUtil_Model::REQUEST_ID] = $this->token->getPatientNumber(); } - // In all other cases: the action that generates meaningfull warnings as is reachable for everyone - $this->_forward('forward'); + $this->_reroute($parameters, true); } /** @@ -248,34 +330,39 @@ */ public function toSurveyAction() { - $tracker = $this->loader->getTracker(); - if ($tokenId = $this->_getParam(MUtil_Model::REQUEST_ID)) { - $tokenId = $tracker->filterToken($tokenId); + if (! $this->_initToken()) { + // Default option + $this->_forward('index'); + } - if ($token = $tracker->getToken($tokenId)) { - $language = $this->locale->getLanguage(); - $user = $this->loader->getCurrentUser(); + $language = $this->locale->getLanguage(); + $user = $this->loader->getCurrentUser(); - try { - $url = $token->getUrl($language, $user->getUserId() ? $user->getUserId() : $token->getRespondentId()); + try { + $url = $this->token->getUrl( + $language, + $user->getUserId() ? $user->getUserId() : $this->token->getRespondentId() + ); - /************************ - * Optional user logout * - ************************/ - if ($user->isLogoutOnSurvey()) { - $user->unsetAsCurrentUser(); - } + /************************ + * Optional user logout * + ************************/ + if ($user->isLogoutOnSurvey()) { + $user->unsetAsCurrentUser(); + } - // Redirect at once - header('Location: ' . $url); - exit(); - } catch (Gems_Tracker_Source_SurveyNotFoundException $e) { - $this->addMessage(sprintf($this->_('The survey for token %s is no longer active.'), $tokenId)); - } - } + // Redirect at once + header('Location: ' . $url); + exit(); + + } catch (Gems_Tracker_Source_SurveyNotFoundException $e) { + $this->addMessage(sprintf( + $this->_('The survey for token %s is no longer active.'), + strtoupper($this->tokenId) + )); + + // Default option + $this->_forward('index'); } - - // Default option - $this->_forward('index'); } } Modified: trunk/library/classes/Gems/Tracker/RespondentTrack.php =================================================================== --- trunk/library/classes/Gems/Tracker/RespondentTrack.php 2012-11-15 14:18:41 UTC (rev 1017) +++ trunk/library/classes/Gems/Tracker/RespondentTrack.php 2012-11-15 15:37:03 UTC (rev 1018) @@ -94,6 +94,12 @@ /** * + * @var Zend_Locale + */ + protected $locale; + + /** + * * @var Gems_Tracker */ protected $tracker; @@ -511,13 +517,32 @@ } /** + * Return the default language for the respondent + * + * @return string Two letter language code + */ + public function getRespondentLanguage() + { + if (! isset($this->_respTrackData['grs_iso_lang'])) { + $this->_ensureRespondentData(); + + if (! isset($this->_respTrackData['grs_iso_lang'])) { + // Still not set in a project? The it is single language + $this->_respTrackData['grs_iso_lang'] = $this->locale->getLanguage(); + } + } + + return $this->_respTrackData['grs_iso_lang']; + } + + /** * Return the name of the respondent * * @return string The respondents name */ public function getRespondentName() { - if (! isset($this->_respTrackData['grs_first_name'], $this->_respTrackData['grs_surname_prefix'], $this->_respTrackData['grs_last_name'])) { + if (! isset($this->_respTrackData['grs_first_name'], $this->_respTrackData['grs_last_name'])) { $this->_ensureRespondentData(); } Modified: trunk/library/classes/Gems/Tracker/Token.php =================================================================== --- trunk/library/classes/Gems/Tracker/Token.php 2012-11-15 14:18:41 UTC (rev 1017) +++ trunk/library/classes/Gems/Tracker/Token.php 2012-11-15 15:37:03 UTC (rev 1018) @@ -120,6 +120,12 @@ /** * + * @var Zend_Locale + */ + protected $locale; + + /** + * * @var Gems_Tracker_Survey */ protected $survey; @@ -132,7 +138,7 @@ /** * - * @var Zend_Translate_Adapter + * @var Zend_Translate */ public $translate; @@ -195,6 +201,7 @@ $respId = $this->_gemsData['gto_id_respondent']; $orgId = $this->_gemsData['gto_id_organization']; + MUtil_Echo::track($this->_gemsData); if ($row = $this->db->fetchRow($sql, array($respId, $orgId))) { $this->_gemsData = $this->_gemsData + $row; @@ -887,7 +894,26 @@ } /** + * Return the default language for the respondent * + * @return string Two letter language code + */ + public function getRespondentLanguage() + { + if (! isset($this->_gemsData['grs_iso_lang'])) { + $this->_ensureRespondentData(); + + if (! isset($this->_gemsData['grs_iso_lang'])) { + // Still not set in a project? The it is single language + $this->_gemsData['grs_iso_lang'] = $this->locale->getLanguage(); + } + } + + return $this->_gemsData['grs_iso_lang']; + } + + /** + * * @return string */ public function getRespondentLastName() @@ -989,24 +1015,27 @@ * Returns a string that tells if the token is open, completed or any other * status you might like. This will not be interpreted by the tracker it is * for display purposes only + * + * @return string Token status description */ public function getStatus() { $today = new Zend_Date(); - $status = $this->translate->_('Open'); if ($this->isCompleted()) { - $status = $this->translate->_('Completed'); + $status = $this->translate->getAdapter()->_('Completed'); } else { $validFrom = $this->getValidFrom(); $validUntil = $this->getValidUntil(); - if (!empty($validUntil) && $validUntil->isEarlier($today)) { - $status = $this->translate->_('Missed'); - } else if (!empty($validFrom) && $validFrom->isLater($today)) { - $status = $this->translate->_('Future'); - } else if (empty($validFrom) && empty($validUntil)) { - $status = $this->translate->_('Future'); + if (! empty($validUntil) && $validUntil->isEarlier($today)) { + $status = $this->translate->getAdapter()->_('Missed'); + } elseif (! empty($validFrom) && $validFrom->isLater($today)) { + $status = $this->translate->getAdapter()->_('Future'); + } elseif (empty($validFrom) && empty($validUntil)) { + $status = $this->translate->getAdapter()->_('Future'); + } else { + $status = $this->translate->getAdapter()->_('Open'); } } Modified: trunk/library/classes/MUtil/Controller/Action.php =================================================================== --- trunk/library/classes/MUtil/Controller/Action.php 2012-11-15 14:18:41 UTC (rev 1017) +++ trunk/library/classes/MUtil/Controller/Action.php 2012-11-15 15:37:03 UTC (rev 1018) @@ -88,7 +88,7 @@ * The code will use a Potemkin Translate adapter when Zend_Translate is not set in the registry, so * the code will still work, it just will not translate. * - * @var Zend_Translate $translate + * @var Zend_Translate */ public $translate; @@ -372,9 +372,9 @@ public function getTranslate() { if (! $this->translate) { - $translate = Zend_Registry::get('Zend_Translate'); - - if (null === $translate) { + if (Zend_Registry::isRegistered('Zend_Translate')) { + $translate = Zend_Registry::get('Zend_Translate'); + } else { // Make sure there always is a translator $translate = new MUtil_Translate_Adapter_Potemkin(); Zend_Registry::set('Zend_Translate', $translate); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |