|
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.
|