createFullQuestionIndexByGroup($LEMsessid); } else { $this->createFullQuestionIndexByQuestion($LEMsessid); } } protected function createFullQuestionIndexByGroup($LEMsessid) { echo "\n\n\n"; echo CHtml::openTag('div', array('id' => 'index')); echo CHtml::openTag('div', array('class' => 'container')); echo CHtml::tag('h2', array(), gT("Question index")); echo CHtml::openTag('ol'); foreach ($_SESSION[$LEMsessid]['grouplist'] as $key => $group) { // echo ''; // Better to use tracevar / if (LimeExpressionManager::GroupIsRelevant($group['gid'])) { $group['step'] = $key + 1; $stepInfo = LimeExpressionManager::singleton()->_ValidateGroup($key); $classes = implode(' ', array( 'row', $stepInfo['anyUnanswered'] ? 'missing' : '', $_SESSION[$LEMsessid]['step'] == $group['step'] ? 'current' : '' )); $sButtonSubmit=CHtml::htmlButton(gT('Go to this group'),array('type'=>'submit','value'=>$group['step'],'name'=>'move','class'=>'jshide')); echo CHtml::tag('li', array( 'data-gid' => $group['gid'], 'title' => $group['description'], 'class' => $classes, ), $group['group_name'].$sButtonSubmit); } } echo CHtml::closeTag('ol'); echo CHtml::closeTag('div'); echo CHtml::closeTag('div'); App()->getClientScript()->registerScript('manageIndex',"manageIndex()\n",CClientScript::POS_END); } protected function createFullQuestionIndexByQuestion($LEMsessid) { echo CHtml::openTag('div', array('id' => 'index')); echo CHtml::openTag('div', array('class' => 'container')); echo CHtml::tag('h2', array(), gT("Question index")); echo 'Question by question not yet supported, use incremental index.'; echo CHtml::closeTag('div'); echo CHtml::closeTag('div'); App()->getClientScript()->registerScript('manageIndex',"manageIndex()\n",CClientScript::POS_END); } protected function createIncrementalQuestionIndex($LEMsessid, $surveyMode) { echo "\n\n\n"; echo '

' . gT("Question index") . '

'; $stepIndex = LimeExpressionManager::GetStepIndexInfo(); $lastGseq=-1; $gseq = -1; $grel = true; for($v = 0, $n = 0; $n != $_SESSION[$LEMsessid]['maxstep']; ++$n) { if (!isset($stepIndex[$n])) { continue; // this is an invalid group - skip it } $stepInfo = $stepIndex[$n]; if ($surveyMode == 'question') { if ($lastGseq != $stepInfo['gseq']) { // show the group label ++$gseq; $g = $_SESSION[$LEMsessid]['grouplist'][$gseq]; $grel = !LimeExpressionManager::GroupIsIrrelevantOrHidden($gseq); if ($grel) { $gtitle = LimeExpressionManager::ProcessString($g['group_name']); echo '

' . flattenText($gtitle) . "

"; } $lastGseq = $stepInfo['gseq']; } if (!$grel || !$stepInfo['show']) { continue; } $q = $_SESSION[$LEMsessid]['fieldarray'][$n]; } else { ++$gseq; if (!$stepInfo['show']) { continue; } $g = $_SESSION[$LEMsessid]['grouplist'][$gseq]; } if ($surveyMode == 'group') { $indexlabel = LimeExpressionManager::ProcessString($g['group_name']); $sButtonText=gT('Go to this group'); } else { $indexlabel = LimeExpressionManager::ProcessString($q[3]); $sButtonText=gT('Go to this question'); } $sText = (($surveyMode == 'group') ? flattenText($indexlabel) : flattenText($indexlabel)); $bGAnsw = !$stepInfo['anyUnanswered']; ++$v; $class = ($n == $_SESSION[$LEMsessid]['step'] - 1 ? 'current' : ($bGAnsw ? 'answer' : 'missing')); if ($v % 2) $class .= " odd"; $s = $n + 1; echo "
"; echo "$v"; echo "$sText"; echo CHtml::htmlButton($sButtonText,array('type'=>'submit','value'=>$s,'name'=>'move','class'=>'jshide')); echo "
"; } if ($_SESSION[$LEMsessid]['maxstep'] == $_SESSION[$LEMsessid]['totalsteps']) { echo CHtml::htmlButton(gT('Submit'),array('type'=>'submit','value'=>'movesubmit','name'=>'move','class'=>'submit button')); } echo '
'; App()->getClientScript()->registerScript('manageIndex',"manageIndex()\n",CClientScript::POS_END); } /** * Main function * * @param mixed $surveyid * @param mixed $args */ function run($surveyid,$args) { global $errormsg; extract($args); if (!$thissurvey) { $thissurvey = getSurveyInfo($surveyid); } $LEMsessid = 'survey_' . $surveyid; if (isset($_SESSION[$LEMsessid]['s_lang'])) { $this->setJavascriptVar($surveyid, $_SESSION[$LEMsessid]['s_lang']); } else { $this->setJavascriptVar($surveyid, $thissurvey['language']); } $sTemplatePath=getTemplatePath(Yii::app()->getConfig("defaulttemplate")).DIRECTORY_SEPARATOR; if (isset ($_SESSION['survey_'.$surveyid]['templatepath'])) { $sTemplatePath=$_SESSION['survey_'.$surveyid]['templatepath']; } // $LEMdebugLevel - customizable debugging for Lime Expression Manager $LEMdebugLevel = 0; // LEM_DEBUG_TIMING; // (LEM_DEBUG_TIMING + LEM_DEBUG_VALIDATION_SUMMARY + LEM_DEBUG_VALIDATION_DETAIL); $LEMskipReprocessing=false; // true if used GetLastMoveResult to avoid generation of unneeded extra JavaScript switch ($thissurvey['format']) { case "A": //All in one $surveyMode = 'survey'; break; default: case "S": //One at a time $surveyMode = 'question'; break; case "G": //Group at a time $surveyMode = 'group'; break; } $radix=getRadixPointData($thissurvey['surveyls_numberformat']); $radix = $radix['separator']; $surveyOptions = array( 'active' => ($thissurvey['active'] == 'Y'), 'allowsave' => ($thissurvey['allowsave'] == 'Y'), 'anonymized' => ($thissurvey['anonymized'] != 'N'), 'assessments' => ($thissurvey['assessments'] == 'Y'), 'datestamp' => ($thissurvey['datestamp'] == 'Y'), 'deletenonvalues'=>Yii::app()->getConfig('deletenonvalues'), 'hyperlinkSyntaxHighlighting' => (($LEMdebugLevel & LEM_DEBUG_VALIDATION_SUMMARY) == LEM_DEBUG_VALIDATION_SUMMARY), // TODO set this to true if in admin mode but not if running a survey 'ipaddr' => ($thissurvey['ipaddr'] == 'Y'), 'radix'=>$radix, 'refurl' => (($thissurvey['refurl'] == "Y" && isset($_SESSION[$LEMsessid]['refurl'])) ? $_SESSION[$LEMsessid]['refurl'] : NULL), 'savetimings' => ($thissurvey['savetimings'] == "Y"), 'surveyls_dateformat' => (isset($thissurvey['surveyls_dateformat']) ? $thissurvey['surveyls_dateformat'] : 1), 'startlanguage'=>(isset($clang->langcode) ? $clang->langcode : $thissurvey['language']), 'target' => Yii::app()->getConfig('uploaddir').DIRECTORY_SEPARATOR.'surveys'.DIRECTORY_SEPARATOR.$thissurvey['sid'].DIRECTORY_SEPARATOR.'files'.DIRECTORY_SEPARATOR, 'tempdir' => Yii::app()->getConfig('tempdir').DIRECTORY_SEPARATOR, 'timeadjust' => (isset($timeadjust) ? $timeadjust : 0), 'token' => (isset($clienttoken) ? $clienttoken : NULL), ); //Security Checked: POST, GET, SESSION, REQUEST, returnGlobal, DB $previewgrp = false; if ($surveyMode == 'group' && isset($param['action']) && ($param['action'] == 'previewgroup')) { $previewgrp = true; } $previewquestion = false; if ($surveyMode == 'question' && isset($param['action']) && ($param['action'] == 'previewquestion')) { $previewquestion = true; } // if (isset($param['newtest']) && $param['newtest'] == "Y") // setcookie("limesurvey_timers", "0"); //@todo fix - sometimes results in headers already sent error $show_empty_group = false; if ($previewgrp || $previewquestion) { $_SESSION[$LEMsessid]['prevstep'] = 2; $_SESSION[$LEMsessid]['maxstep'] = 0; } else { //RUN THIS IF THIS IS THE FIRST TIME , OR THE FIRST PAGE ######################################## if (!isset($_SESSION[$LEMsessid]['step'])) // || !$_SESSION[$LEMsessid]['step']) - don't do this for step0, else rebuild the session { buildsurveysession($surveyid); $sTemplatePath = $_SESSION[$LEMsessid]['templatepath']; if($surveyid != LimeExpressionManager::getLEMsurveyId()) LimeExpressionManager::SetDirtyFlag(); LimeExpressionManager::StartSurvey($surveyid, $surveyMode, $surveyOptions, false, $LEMdebugLevel); $_SESSION[$LEMsessid]['step'] = 0; if ($surveyMode == 'survey') { $move = "movenext"; // to force a call to NavigateForwards() } elseif (isset($thissurvey['showwelcome']) && $thissurvey['showwelcome'] == 'N') { $move = "movenext"; $_SESSION[$LEMsessid]['step']=1; } } elseif($surveyid != LimeExpressionManager::getLEMsurveyId()) { LimeExpressionManager::StartSurvey($surveyid, $surveyMode, $surveyOptions, false, $LEMdebugLevel); LimeExpressionManager::JumpTo($_SESSION[$LEMsessid]['step'], false, false); } $totalquestions = $_SESSION['survey_'.$surveyid]['totalquestions']; if (!isset($_SESSION[$LEMsessid]['totalsteps'])) { $_SESSION[$LEMsessid]['totalsteps'] = 0; } if (!isset($_SESSION[$LEMsessid]['maxstep'])) { $_SESSION[$LEMsessid]['maxstep'] = 0; } if (isset($_SESSION[$LEMsessid]['LEMpostKey']) && isset($_POST['LEMpostKey']) && $_POST['LEMpostKey'] != $_SESSION[$LEMsessid]['LEMpostKey']) { // then trying to resubmit (e.g. Next, Previous, Submit) from a cached copy of the page // Does not try to save anything from the page to the database $moveResult = LimeExpressionManager::GetLastMoveResult(true); if (isset($_POST['thisstep']) && isset($moveResult['seq']) && $_POST['thisstep'] == $moveResult['seq']) { // then pressing F5 or otherwise refreshing the current page, which is OK $LEMskipReprocessing=true; $move = "movenext"; // so will re-display the survey } else { // trying to use browser back buttons, which may be disallowed if no 'previous' button is present $LEMskipReprocessing=true; $move = "movenext"; // so will re-display the survey $invalidLastPage=true; $backpopup=$clang->gT("Please use the LimeSurvey navigation buttons or index. It appears you attempted to use the browser back button to re-submit a page."); } } if(isset($move) && $move=="clearcancel") { $moveResult = LimeExpressionManager::JumpTo($_SESSION[$LEMsessid]['step'], false, true, false, true); //$backpopup=$clang->gT("Clear all need confirmation."); } if (!(isset($_POST['saveall']) || isset($_POST['saveprompt']) || isset($_GET['sid']) || $LEMskipReprocessing || (isset($move) && (preg_match('/^changelang_/',$move))))) { $_SESSION[$LEMsessid]['prevstep'] = $_SESSION[$LEMsessid]['step']; } if (!isset($_SESSION[$LEMsessid]['prevstep'])) { $_SESSION[$LEMsessid]['prevstep']=-1; // this only happens on re-load } if (isset($_SESSION[$LEMsessid]['LEMtokenResume'])) { LimeExpressionManager::StartSurvey($thissurvey['sid'], $surveyMode, $surveyOptions, false,$LEMdebugLevel); if(isset($_SESSION[$LEMsessid]['maxstep']) && $_SESSION[$LEMsessid]['maxstep']>$_SESSION[$LEMsessid]['step']) { LimeExpressionManager::JumpTo($_SESSION[$LEMsessid]['maxstep'], false, false); } $moveResult = LimeExpressionManager::JumpTo($_SESSION[$LEMsessid]['step'],false,false); // if late in the survey, will re-validate contents, which may be overkill unset($_SESSION[$LEMsessid]['LEMtokenResume']); } else if (!$LEMskipReprocessing) { //Move current step ########################################################################### if (isset($move) && $move == 'moveprev' && ($thissurvey['allowprev'] == 'Y' || $thissurvey['questionindex'] > 0)) { $moveResult = LimeExpressionManager::NavigateBackwards(); if ($moveResult['at_start']) { $_SESSION[$LEMsessid]['step'] = 0; unset($moveResult); // so display welcome page again } } if (isset($move) && $move == "movenext") { $moveResult = LimeExpressionManager::NavigateForwards(); } if (isset($move) && ($move == 'movesubmit')) { if ($surveyMode == 'survey') { $moveResult = LimeExpressionManager::NavigateForwards(); } else { // may be submitting from the navigation bar, in which case need to process all intervening questions // in order to update equations and ensure there are no intervening relevant mandatory or relevant invalid questions $moveResult = LimeExpressionManager::JumpTo($_SESSION[$LEMsessid]['totalsteps'] + 1, false); } } if (isset($move) && (preg_match('/^changelang_/', $move) || $move=='changelang')) { // jump to current step using new language, processing POST values $moveResult = LimeExpressionManager::JumpTo($_SESSION[$LEMsessid]['step'], false, true, false, true); // do process the POST data } if (isset($move) && isNumericInt($move) && $thissurvey['questionindex'] == 1) { $move = (int) $move; if ($move > 0 && (($move <= $_SESSION[$LEMsessid]['step']) || (isset($_SESSION[$LEMsessid]['maxstep']) && $move <= $_SESSION[$LEMsessid]['maxstep']))) { $moveResult = LimeExpressionManager::JumpTo($move, false); } } elseif (isset($move) && isNumericInt($move) && $thissurvey['questionindex'] == 2) { $move = (int) $move; $moveResult = LimeExpressionManager::JumpTo($move, false, true, true); } if (!isset($moveResult) && !($surveyMode != 'survey' && $_SESSION[$LEMsessid]['step'] == 0)) { // Just in case not set via any other means, but don't do this if it is the welcome page $moveResult = LimeExpressionManager::GetLastMoveResult(true); $LEMskipReprocessing=true; } } if (isset($moveResult) && isset($moveResult['seq']) )// Reload at first page (welcome after click previous fill an empty $moveResult array { if ($moveResult['finished'] == true) { $move = 'movesubmit'; } else { $_SESSION[$LEMsessid]['step'] = $moveResult['seq'] + 1; // step is index base 1 $stepInfo = LimeExpressionManager::GetStepIndexInfo($moveResult['seq']); } if ($move == "movesubmit" && $moveResult['finished'] == false) { // then there are errors, so don't finalize the survey $move = "movenext"; // so will re-display the survey $invalidLastPage = true; } } // We do not keep the participant session anymore when the same browser is used to answer a second time a survey (let's think of a library PC for instance). // Previously we used to keep the session and redirect the user to the // submit page. if ($surveyMode != 'survey' && $_SESSION[$LEMsessid]['step'] == 0) { $_SESSION[$LEMsessid]['test']=time(); display_first_page(); Yii::app()->end(); // So we can still see debug messages } //CHECK IF ALL MANDATORY QUESTIONS HAVE BEEN ANSWERED ############################################ //First, see if we are moving backwards or doing a Save so far, and its OK not to check: if ( (isset($move) && ($move == "moveprev" || (is_int($move) && $_SESSION[$LEMsessid]['prevstep'] == $_SESSION[$LEMsessid]['maxstep']) || $_SESSION[$LEMsessid]['prevstep'] == $_SESSION[$LEMsessid]['step'])) || (isset($_POST['saveall']) && $_POST['saveall'] == $clang->gT("Save your responses so far"))) { if (Yii::app()->getConfig('allowmandbackwards') == 1) { $backok = "Y"; } else { $backok = "N"; } } else { $backok = "N"; // NA, since not moving backwards } // TODO FIXME if ($thissurvey['active'] == "Y") { Yii::import("application.libraries.Save"); $cSave = new Save(); } if ($thissurvey['active'] == "Y" && Yii::app()->request->getPost('saveall')) // Don't test if save is allowed { $bTokenAnswerPersitance = $thissurvey['tokenanswerspersistence'] == 'Y' && isset($surveyid) && tableExists('tokens_'.$surveyid); // must do this here to process the POSTed values $moveResult = LimeExpressionManager::JumpTo($_SESSION[$LEMsessid]['step'], false); // by jumping to current step, saves data so far if (!isset($_SESSION[$LEMsessid]['scid']) && !$bTokenAnswerPersitance ) { $cSave->showsaveform(); // generates a form and exits, awaiting input } else { // Intentional retest of all conditions to be true, to make sure we do have tokens and surveyid // Now update lastpage to $_SESSION[$LEMsessid]['step'] in SurveyDynamic, otherwise we land on // the previous page when we return. $iResponseID = $_SESSION[$LEMsessid]['srid']; $oResponse = SurveyDynamic::model($surveyid)->findByPk($iResponseID); $oResponse->lastpage = $_SESSION[$LEMsessid]['step']; $oResponse->save(); } } if ($thissurvey['active'] == "Y" && Yii::app()->request->getParam('savesubmit') ) { // The response from the save form // CREATE SAVED CONTROL RECORD USING SAVE FORM INFORMATION $popup = $cSave->savedcontrol(); if (isset($errormsg) && $errormsg != "") { $cSave->showsaveform(); // reshow the form if there is an error } $moveResult = LimeExpressionManager::GetLastMoveResult(true); $LEMskipReprocessing=true; // TODO - does this work automatically for token answer persistence? Used to be savedsilent() } //Now, we check mandatory questions if necessary //CHECK IF ALL CONDITIONAL MANDATORY QUESTIONS THAT APPLY HAVE BEEN ANSWERED global $notanswered; if (isset($moveResult) && !$moveResult['finished']) { $unansweredSQList = $moveResult['unansweredSQs']; if (strlen($unansweredSQList) > 0 && $backok != "N") { $notanswered = explode('|', $unansweredSQList); } else { $notanswered = array(); } //CHECK INPUT $invalidSQList = $moveResult['invalidSQs']; if (strlen($invalidSQList) > 0 && $backok != "N") { $notvalidated = explode('|', $invalidSQList); } else { $notvalidated = array(); } } // CHECK UPLOADED FILES // TMSW - Move this into LEM::NavigateForwards? $filenotvalidated = checkUploadedFileValidity($surveyid, $move, $backok); //SEE IF THIS GROUP SHOULD DISPLAY $show_empty_group = false; if ($_SESSION[$LEMsessid]['step'] == 0) $show_empty_group = true; $redata = compact(array_keys(get_defined_vars())); //SUBMIT ############################################################################### if ((isset($move) && $move == "movesubmit")) { // setcookie("limesurvey_timers", "", time() - 3600); // remove the timers cookies //@todo fix - sometimes results in headers already sent error if ($thissurvey['refurl'] == "Y") { if (!in_array("refurl", $_SESSION[$LEMsessid]['insertarray'])) //Only add this if it doesn't already exist { $_SESSION[$LEMsessid]['insertarray'][] = "refurl"; } } resetTimers(); //Before doing the "templatereplace()" function, check the $thissurvey['url'] //field for limereplace stuff, and do transformations! $thissurvey['surveyls_url'] = passthruReplace($thissurvey['surveyls_url'], $thissurvey); $thissurvey['surveyls_url'] = templatereplace($thissurvey['surveyls_url'], array(), $redata, 'URLReplace', false, NULL, array(), true ); // to do INSERTANS substitutions //END PAGE - COMMIT CHANGES TO DATABASE if ($thissurvey['active'] != "Y") //If survey is not active, don't really commit { if ($thissurvey['assessments'] == "Y") { $assessments = doAssessment($surveyid); } sendCacheHeaders(); doHeader(); echo templatereplace(file_get_contents($sTemplatePath."startpage.pstpl"), array(), $redata, 'SubmitStartpageI', false, NULL, array(), true ); //Check for assessments if ($thissurvey['assessments'] == "Y" && $assessments) { echo templatereplace(file_get_contents($sTemplatePath."assessment.pstpl"), array(), $redata, 'SubmitAssessmentI', false, NULL, array(), true ); } // fetch all filenames from $_SESSIONS['files'] and delete them all // from the /upload/tmp/ directory /* echo "
";print_r($_SESSION);echo "
"; for($i = 1; isset($_SESSION[$LEMsessid]['files'][$i]); $i++) { unlink('upload/tmp/'.$_SESSION[$LEMsessid]['files'][$i]['filename']); } */ // can't kill session before end message, otherwise INSERTANS doesn't work. $completed = templatereplace($thissurvey['surveyls_endtext'], array(), $redata, 'SubmitEndtextI', false, NULL, array(), true ); $completed .= "
" . $clang->gT("Did Not Save") . "

\n\n"; $completed .= $clang->gT("Your survey responses have not been recorded. This survey is not yet active.") . "

\n"; if ($thissurvey['printanswers'] == 'Y') { // 'Clear all' link is only relevant for survey with printanswers enabled // in other cases the session is cleared at submit time $completed .= "" . $clang->gT("Clear Responses") . "

\n"; } } else //THE FOLLOWING DEALS WITH SUBMITTING ANSWERS AND COMPLETING AN ACTIVE SURVEY { if ($thissurvey['usecookie'] == "Y" && $tokensexist != 1) //don't use cookies if tokens are being used { setcookie("LS_" . $surveyid . "_STATUS", "COMPLETE", time() + 31536000); //Cookie will expire in 365 days } $content = ''; $content .= templatereplace(file_get_contents($sTemplatePath."startpage.pstpl"), array(), $redata, 'SubmitStartpage', false, NULL, array(), true ); //Check for assessments if ($thissurvey['assessments'] == "Y") { $assessments = doAssessment($surveyid); if ($assessments) { $content .= templatereplace(file_get_contents($sTemplatePath."assessment.pstpl"), array(), $redata, 'SubmitAssessment', false, NULL, array(), true ); } } //Update the token if needed and send a confirmation email if (isset($_SESSION['survey_'.$surveyid]['token'])) { submittokens(); } //Send notifications sendSubmitNotifications($surveyid); $content = ''; $content .= templatereplace(file_get_contents($sTemplatePath."startpage.pstpl"), array(), $redata, 'SubmitStartpage', false, NULL, array(), true ); //echo $thissurvey['url']; //Check for assessments if ($thissurvey['assessments'] == "Y") { $assessments = doAssessment($surveyid); if ($assessments) { $content .= templatereplace(file_get_contents($sTemplatePath."assessment.pstpl"), array(), $redata, 'SubmitAssessment', false, NULL, array(), true ); } } if (trim(strip_tags($thissurvey['surveyls_endtext'])) == '') { $completed = "
" . $clang->gT("Thank you!") . "

\n\n" . $clang->gT("Your survey responses have been recorded.") . "

\n"; } else { $completed = templatereplace($thissurvey['surveyls_endtext'], array(), $redata, 'SubmitAssessment', false, NULL, array(), true ); } // Link to Print Answer Preview ********** if ($thissurvey['printanswers'] == 'Y') { $url = Yii::app()->getController()->createUrl("/printanswers/view/surveyid/{$surveyid}"); $completed .= "

" . "" . $clang->gT("Print your answers.") . "
\n"; } //***************************************** if ($thissurvey['publicstatistics'] == 'Y' && $thissurvey['printanswers'] == 'Y') { $completed .='
' . $clang->gT("or"); } // Link to Public statistics ********** if ($thissurvey['publicstatistics'] == 'Y') { $url = Yii::app()->getController()->createUrl("/statistics_user/action/surveyid/{$surveyid}/language/".$_SESSION[$LEMsessid]['s_lang']); $completed .= "

" . "" . $clang->gT("View the statistics for this survey.") . "
\n"; } //***************************************** $_SESSION[$LEMsessid]['finished'] = true; $_SESSION[$LEMsessid]['sid'] = $surveyid; sendCacheHeaders(); if (isset($thissurvey['autoredirect']) && $thissurvey['autoredirect'] == "Y" && $thissurvey['surveyls_url']) { //Automatically redirect the page to the "url" setting for the survey header("Location: {$thissurvey['surveyls_url']}"); } doHeader(); echo $content; } $redata['completed'] = $completed; // @todo Remove direct session access. $event = new PluginEvent('afterSurveyComplete'); if (isset($_SESSION[$LEMsessid]['srid'])) { $event->set('responseId', $_SESSION[$LEMsessid]['srid']); } $event->set('surveyId', $surveyid); App()->getPluginManager()->dispatchEvent($event); $blocks = array(); foreach ($event->getAllContent() as $blockData) { /* @var $blockData PluginEventContent */ $blocks[] = CHtml::tag('div', array('id' => $blockData->getCssId(), 'class' => $blockData->getCssClass()), $blockData->getContent()); } $redata['completed'] = implode("\n", $blocks) ."\n". $redata['completed']; $redata['thissurvey']['surveyls_url'] = $thissurvey['surveyls_url']; echo templatereplace(file_get_contents($sTemplatePath."completed.pstpl"), array('completed' => $completed), $redata, 'SubmitCompleted', false, NULL, array(), true ); echo "\n"; if ((($LEMdebugLevel & LEM_DEBUG_TIMING) == LEM_DEBUG_TIMING)) { echo LimeExpressionManager::GetDebugTimingMessage(); } if ((($LEMdebugLevel & LEM_DEBUG_VALIDATION_SUMMARY) == LEM_DEBUG_VALIDATION_SUMMARY)) { echo "
Group/Question Validation Results:" . $moveResult['message'] . "
\n"; } echo templatereplace(file_get_contents($sTemplatePath."endpage.pstpl"), array(), $redata, 'SubmitEndpage', false, NULL, array(), true ); doFooter(); // The session cannot be killed until the page is completely rendered if ($thissurvey['printanswers'] != 'Y') { killSurveySession($surveyid); } exit; } } $redata = compact(array_keys(get_defined_vars())); // IF GOT THIS FAR, THEN DISPLAY THE ACTIVE GROUP OF QUESTIONSs //SEE IF $surveyid EXISTS #################################################################### if ($surveyExists < 1) { //SURVEY DOES NOT EXIST. POLITELY EXIT. echo templatereplace(file_get_contents($sTemplatePath."startpage.pstpl"), array(), $redata); echo "\t

\n"; echo "\t" . $clang->gT("Sorry. There is no matching survey.") . "
 \n"; echo templatereplace(file_get_contents($sTemplatePath."endpage.pstpl"), array(), $redata); doFooter(); exit; } createFieldMap($surveyid,'full',false,false,$_SESSION[$LEMsessid]['s_lang']); //GET GROUP DETAILS if ($surveyMode == 'group' && $previewgrp) { // setcookie("limesurvey_timers", "0"); //@todo fix - sometimes results in headers already sent error $_gid = sanitize_int($param['gid']); LimeExpressionManager::StartSurvey($thissurvey['sid'], 'group', $surveyOptions, false, $LEMdebugLevel); $gseq = LimeExpressionManager::GetGroupSeq($_gid); if ($gseq == -1) { echo $clang->gT('Invalid group number for this survey: ') . $_gid; exit; } $moveResult = LimeExpressionManager::JumpTo($gseq + 1, true); if (is_null($moveResult)) { echo $clang->gT('This group contains no questions. You must add questions to this group before you can preview it'); exit; } if (isset($moveResult)) { $_SESSION[$LEMsessid]['step'] = $moveResult['seq'] + 1; // step is index base 1? } $stepInfo = LimeExpressionManager::GetStepIndexInfo($moveResult['seq']); $gid = $stepInfo['gid']; $groupname = $stepInfo['gname']; $groupdescription = $stepInfo['gtext']; } else { if (($show_empty_group) || !isset($_SESSION[$LEMsessid]['grouplist'])) { $gid = -1; // Make sure the gid is unused. This will assure that the foreach (fieldarray as ia) has no effect. $groupname = $clang->gT("Submit your answers"); $groupdescription = $clang->gT("There are no more questions. Please press the button to finish this survey."); } else if ($surveyMode != 'survey') { if ($previewquestion) { $_qid = sanitize_int($param['qid']); LimeExpressionManager::StartSurvey($surveyid, 'question', $surveyOptions, false, $LEMdebugLevel); $qSec = LimeExpressionManager::GetQuestionSeq($_qid); $moveResult = LimeExpressionManager::JumpTo($qSec+1,true,false,true); $stepInfo = LimeExpressionManager::GetStepIndexInfo($moveResult['seq']); } else { $stepInfo = LimeExpressionManager::GetStepIndexInfo($moveResult['seq']); } $gid = $stepInfo['gid']; $groupname = $stepInfo['gname']; $groupdescription = $stepInfo['gtext']; } } if ($previewquestion) { $_SESSION[$LEMsessid]['step'] = 0; //maybe unset it after the question has been displayed? } if ($_SESSION[$LEMsessid]['step'] > $_SESSION[$LEMsessid]['maxstep']) { $_SESSION[$LEMsessid]['maxstep'] = $_SESSION[$LEMsessid]['step']; } // If the survey uses answer persistence and a srid is registered in SESSION // then loadanswers from this srid /* Only survey mode used this - should all? if ($thissurvey['tokenanswerspersistence'] == 'Y' && $thissurvey['anonymized'] == "N" && isset($_SESSION[$LEMsessid]['srid']) && $thissurvey['active'] == "Y") { loadanswers(); } */ //****************************************************************************************************** //PRESENT SURVEY //****************************************************************************************************** $okToShowErrors = (!$previewgrp && (isset($invalidLastPage) || $_SESSION[$LEMsessid]['prevstep'] == $_SESSION[$LEMsessid]['step'])); Yii::app()->getController()->loadHelper('qanda'); setNoAnswerMode($thissurvey); //Iterate through the questions about to be displayed: $inputnames = array(); foreach ($_SESSION[$LEMsessid]['grouplist'] as $gl) { $gid = $gl['gid']; $qnumber = 0; if ($surveyMode != 'survey') { $onlyThisGID = $stepInfo['gid']; if ($onlyThisGID != $gid) { continue; } } // TMSW - could iterate through LEM::currentQset instead foreach ($_SESSION[$LEMsessid]['fieldarray'] as $key => $ia) { ++$qnumber; $ia[9] = $qnumber; // incremental question count; if ((isset($ia[10]) && $ia[10] == $gid) || (!isset($ia[10]) && $ia[5] == $gid))// Make $qanda only for needed question $ia[10] is the randomGroup and $ia[5] the real group { if ($surveyMode == 'question' && $ia[0] != $stepInfo['qid']) { continue; } $qidattributes = getQuestionAttributeValues($ia[0], $ia[4]); if ($ia[4] != '*' && ($qidattributes === false || !isset($qidattributes['hidden']) || $qidattributes['hidden'] == 1)) { continue; } //Get the answers/inputnames // TMSW - can content of retrieveAnswers() be provided by LEM? Review scope of what it provides. // TODO - retrieveAnswers is slow - queries database separately for each question. May be fixed in _CI or _YII ports, so ignore for now list($plus_qanda, $plus_inputnames) = retrieveAnswers($ia, $surveyid); if ($plus_qanda) { $plus_qanda[] = $ia[4]; $plus_qanda[] = $ia[6]; // adds madatory identifyer for adding mandatory class to question wrapping div // Add a finalgroup in qa array , needed for random attribute : TODO: find a way to have it in new quanda_helper in 2.1 if(isset($ia[10])) $plus_qanda['finalgroup']=$ia[10]; else $plus_qanda['finalgroup']=$ia[5]; $qanda[] = $plus_qanda; } if ($plus_inputnames) { $inputnames = addtoarray_single($inputnames, $plus_inputnames); } //Display the "mandatory" popup if necessary // TMSW - get question-level error messages - don't call **_popup() directly if ($okToShowErrors && $stepInfo['mandViolation']) { list($mandatorypopup, $popup) = mandatory_popup($ia, $notanswered); } //Display the "validation" popup if necessary if ($okToShowErrors && !$stepInfo['valid']) { list($validationpopup, $vpopup) = validation_popup($ia, $notvalidated); } // Display the "file validation" popup if necessary if ($okToShowErrors && isset($filenotvalidated)) { list($filevalidationpopup, $fpopup) = file_validation_popup($ia, $filenotvalidated); } } if ($ia[4] == "|") $upload_file = TRUE; } //end iteration } if ($surveyMode != 'survey' && isset($thissurvey['showprogress']) && $thissurvey['showprogress'] == 'Y') { if ($show_empty_group) { $percentcomplete = makegraph($_SESSION[$LEMsessid]['totalsteps'] + 1, $_SESSION[$LEMsessid]['totalsteps']); } else { $percentcomplete = makegraph($_SESSION[$LEMsessid]['step'], $_SESSION[$LEMsessid]['totalsteps']); } } if (!(isset($languagechanger) && strlen($languagechanger) > 0) && function_exists('makeLanguageChangerSurvey')) { $languagechanger = makeLanguageChangerSurvey($_SESSION[$LEMsessid]['s_lang']); } //READ TEMPLATES, INSERT DATA AND PRESENT PAGE sendCacheHeaders(); doHeader(); $redata = compact(array_keys(get_defined_vars())); echo templatereplace(file_get_contents($sTemplatePath."startpage.pstpl"), array(), $redata); $aPopup=array(); // We can move this part where we want now if (isset($backpopup)) { $aPopup[]=$backpopup;// If user click reload: no need other popup } else { if (isset($popup)) { $aPopup[]=$popup; } if (isset($vpopup)) { $aPopup[]=$vpopup; } if (isset($fpopup)) { $aPopup[]=$fpopup; } } Yii::app()->clientScript->registerScript("showpopup","showpopup=".(int)Yii::app()->getConfig('showpopups').";",CClientScript::POS_HEAD); //if(count($aPopup)) Yii::app()->clientScript->registerScript('startPopup',"startPopups=".json_encode($aPopup).";",CClientScript::POS_HEAD); //ALTER PAGE CLASS TO PROVIDE WHOLE-PAGE ALTERNATION if ($surveyMode != 'survey' && $_SESSION[$LEMsessid]['step'] != $_SESSION[$LEMsessid]['prevstep'] || (isset($_SESSION[$LEMsessid]['stepno']) && $_SESSION[$LEMsessid]['stepno'] % 2)) { if (!isset($_SESSION[$LEMsessid]['stepno'])) $_SESSION[$LEMsessid]['stepno'] = 0; if ($_SESSION[$LEMsessid]['step'] != $_SESSION[$LEMsessid]['prevstep']) ++$_SESSION[$LEMsessid]['stepno']; if ($_SESSION[$LEMsessid]['stepno'] % 2) { echo "\n"; } } $hiddenfieldnames = implode("|", $inputnames); if (isset($upload_file) && $upload_file) echo CHtml::form(array("survey/index"), 'post',array('enctype'=>'multipart/form-data','id'=>'limesurvey','name'=>'limesurvey', 'autocomplete'=>'off'))."\n \n"; else echo CHtml::form(array("survey/index"), 'post',array('id'=>'limesurvey', 'name'=>'limesurvey', 'autocomplete'=>'off'))."\n \n"; // <-- END FEATURE - SAVE // The default submit button echo CHtml::htmlButton("default",array('type'=>'submit','id'=>"defaultbtn",'value'=>"default",'name'=>'move','class'=>"submit noview",'style'=>'display:none')); if ($surveyMode == 'survey') { if (isset($thissurvey['showwelcome']) && $thissurvey['showwelcome'] == 'N') { //Hide the welcome screen if explicitly set } else { echo templatereplace(file_get_contents($sTemplatePath."welcome.pstpl"), array(), $redata) . "\n"; } if ($thissurvey['anonymized'] == "Y") { echo templatereplace(file_get_contents($sTemplatePath."privacy.pstpl"), array(), $redata) . "\n"; } } // <-- START THE SURVEY --> if ($surveyMode != 'survey') { echo templatereplace(file_get_contents($sTemplatePath."survey.pstpl"), array(), $redata); } // runonce element has been changed from a hidden to a text/display:none one. In order to workaround an not-reproduced issue #4453 (lemeur) // We don't need runonce actually (140228): the script was updated and replaced by EM see #08783 (grep show no other runonce) // echo ""; $showpopups=Yii::app()->getConfig('showpopups'); //Display the "mandatory" message on page if necessary if (!$showpopups && $stepInfo['mandViolation'] && $okToShowErrors) { echo "

" . $clang->gT("One or more mandatory questions have not been answered. You cannot proceed until these have been completed.") . "

"; } //Display the "validation" message on page if necessary if (!$showpopups && !$stepInfo['valid'] && $okToShowErrors) { echo "

" . $clang->gT("One or more questions have not been answered in a valid manner. You cannot proceed until these answers are valid.") . "

"; } //Display the "file validation" message on page if necessary if (!$showpopups && isset($filenotvalidated) && $filenotvalidated == true && $okToShowErrors) { echo "

" . $clang->gT("One or more uploaded files are not in proper format/size. You cannot proceed until these files are valid.") . "

"; } $_gseq = -1; foreach ($_SESSION[$LEMsessid]['grouplist'] as $gl) { $gid = $gl['gid']; ++$_gseq; $groupname = $gl['group_name']; $groupdescription = $gl['description']; if ($surveyMode != 'survey' && $gid != $onlyThisGID) { continue; } $redata = compact(array_keys(get_defined_vars())); Yii::app()->setConfig('gid',$gid);// To be used in templaterplace in whole group. Attention : it's the actual GID (not the GID of the question) echo "\n\n\n"; echo "\n\n\n"; Yii::app()->setConfig('gid',''); } LimeExpressionManager::FinishProcessingGroup($LEMskipReprocessing); echo LimeExpressionManager::GetRelevanceAndTailoringJavaScript(); LimeExpressionManager::FinishProcessingPage(); if (!$previewgrp && !$previewquestion) { $navigator = surveymover(); //This gets globalised in the templatereplace function $redata = compact(array_keys(get_defined_vars())); echo "\n\n\n"; echo templatereplace(file_get_contents($sTemplatePath."navigator.pstpl"), array(), $redata); echo "\n"; if ($thissurvey['active'] != "Y") { echo "

" . $clang->gT("This survey is currently not active. You will not be able to save your responses.") . "

\n"; } if ($surveyMode != 'survey' && $thissurvey['questionindex'] == 1) { $this->createIncrementalQuestionIndex($LEMsessid, $surveyMode); } elseif ($surveyMode != 'survey' && $thissurvey['questionindex'] == 2) { $this->createFullQuestionIndex($LEMsessid, $surveyMode); } echo "\n"; echo "\n"; echo "\n"; $_SESSION[$LEMsessid]['LEMpostKey'] = mt_rand(); echo "\n"; if (isset($token) && !empty($token)) { echo "\n\n"; } } if (($LEMdebugLevel & LEM_DEBUG_TIMING) == LEM_DEBUG_TIMING) { echo LimeExpressionManager::GetDebugTimingMessage(); } if (($LEMdebugLevel & LEM_DEBUG_VALIDATION_SUMMARY) == LEM_DEBUG_VALIDATION_SUMMARY) { echo "
Group/Question Validation Results:" . $moveResult['message'] . "
\n"; } echo "\n"; echo templatereplace(file_get_contents($sTemplatePath."endpage.pstpl"), array(), $redata); echo "\n"; doFooter(); } /** * setJavascriptVar * * * @return @void * @param integer $iSurveyId : the survey id for the script * @param string $sLanguage : the actual language for the survey */ public function setJavascriptVar($iSurveyId, $sLanguage) { $aSurveyinfo=getSurveyInfo($iSurveyId); if(isset($aSurveyinfo['surveyls_numberformat'])) { $aLSJavascriptVar=array(); $aLSJavascriptVar['bFixNumAuto']=(int)(bool)Yii::app()->getConfig('bFixNumAuto',1); $aLSJavascriptVar['bNumRealValue']=(int)(bool)Yii::app()->getConfig('bNumRealValue',0); $aRadix=getRadixPointData($aSurveyinfo['surveyls_numberformat']); $aLSJavascriptVar['sLEMradix']=$aRadix['separator']; $sLSJavascriptVar="LSvar=".json_encode($aLSJavascriptVar) . ';'; App()->clientScript->registerScript('sLSJavascriptVar',$sLSJavascriptVar,CClientScript::POS_HEAD); } // Don't update, because already set in index/run } }