mirror of
https://github.com/YunoHost-Apps/limesurvey_ynh.git
synced 2024-09-03 19:36:32 +02:00
469 lines
17 KiB
PHP
469 lines
17 KiB
PHP
|
<?php
|
||
|
/*
|
||
|
* LimeSurvey
|
||
|
* Copyright (C) 2007-2011 The LimeSurvey Project Team / Carsten Schmitz
|
||
|
* All rights reserved.
|
||
|
* License: GNU/GPL License v2 or later, see LICENSE.php
|
||
|
* LimeSurvey is free software. This version may have been modified pursuant
|
||
|
* to the GNU General Public License, and as distributed it includes or
|
||
|
* is derivative of works licensed under the GNU General Public License or
|
||
|
* other free or open source software licenses.
|
||
|
* See COPYRIGHT.php for copyright notices and details.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* Created 12-2008 by Maziminke (maziminke@web.de)
|
||
|
*
|
||
|
* This file handles the "Show results to users" option:
|
||
|
* Survey Settings -> Presentation & navigation -> "Public statistics?"
|
||
|
*
|
||
|
* The admin can set a question attribute "public_statistics" for each question
|
||
|
* to determine whether the results of a certain question should be shown to the user
|
||
|
* after he/she has submitted the survey.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
class Statistics_userController extends LSYii_Controller {
|
||
|
|
||
|
|
||
|
public function _remap($method, $params = array())
|
||
|
{
|
||
|
array_unshift($params, $method);
|
||
|
return call_user_func_array(array($this, "action"), $params);
|
||
|
}
|
||
|
|
||
|
function actionAction($surveyid,$language)
|
||
|
{
|
||
|
ob_start(function($buffer, $phase) {
|
||
|
App()->getClientScript()->render($buffer);
|
||
|
return $buffer;
|
||
|
});
|
||
|
ob_implicit_flush(false);
|
||
|
$iSurveyID=(int)$surveyid;
|
||
|
//$postlang = returnglobal('lang');
|
||
|
Yii::import('application.libraries.admin.progressbar',true);
|
||
|
Yii::app()->loadHelper("admin/statistics");
|
||
|
Yii::app()->loadHelper('database');
|
||
|
Yii::app()->loadHelper('surveytranslator');
|
||
|
|
||
|
$data = array();
|
||
|
|
||
|
//XXX enable/disable this for testing
|
||
|
//$publicgraphs = 1;
|
||
|
//$showaggregateddata = 1;
|
||
|
|
||
|
/*
|
||
|
* List of important settings:
|
||
|
* - publicstatistics: General survey setting which determines if public statistics for this survey
|
||
|
* should be shown at all.
|
||
|
*
|
||
|
* - publicgraphs: General survey setting which determines if public statistics for this survey
|
||
|
* should include graphs or only show a tabular overview.
|
||
|
*
|
||
|
* - public_statistics: Question attribute which has to be applied to each question so that
|
||
|
* its statistics will be shown to the user. If not set no statistics for this question will be shown.
|
||
|
*
|
||
|
* - filterout_incomplete_answers: Setting taken from config-defaults.php which determines if
|
||
|
* not completed answers will be filtered.
|
||
|
*/
|
||
|
|
||
|
if(!isset($iSurveyID))
|
||
|
{
|
||
|
$iSurveyID=returnGlobal('sid');
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$iSurveyID = (int) $iSurveyID;
|
||
|
}
|
||
|
if (!$iSurveyID)
|
||
|
{
|
||
|
//This next line ensures that the $iSurveyID value is never anything but a number.
|
||
|
safeDie('You have to provide a valid survey ID.');
|
||
|
}
|
||
|
|
||
|
|
||
|
if ($iSurveyID)
|
||
|
{
|
||
|
$actresult = Survey::model()->findAll('sid = :sid AND active = :active', array(':sid' => $iSurveyID, ':active' => 'Y')); //Checked
|
||
|
if (count($actresult) == 0)
|
||
|
{
|
||
|
safeDie('You have to provide a valid survey ID.');
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$surveyinfo = getSurveyInfo($iSurveyID);
|
||
|
// CHANGE JSW_NZ - let's get the survey title for display
|
||
|
$thisSurveyTitle = $surveyinfo["name"];
|
||
|
// CHANGE JSW_NZ - let's get css from individual template.css - so define path
|
||
|
$thisSurveyCssPath = getTemplateURL($surveyinfo["template"]);
|
||
|
if ($surveyinfo['publicstatistics']!='Y')
|
||
|
{
|
||
|
safeDie('The public statistics for this survey are deactivated.');
|
||
|
}
|
||
|
|
||
|
//check if graphs should be shown for this survey
|
||
|
if ($surveyinfo['publicgraphs']=='Y')
|
||
|
{
|
||
|
$publicgraphs = 1;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$publicgraphs = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//we collect all the output within this variable
|
||
|
$statisticsoutput ='';
|
||
|
|
||
|
|
||
|
//for creating graphs we need some more scripts which are included here
|
||
|
//True -> include
|
||
|
//False -> forget about charts
|
||
|
if (isset($publicgraphs) && $publicgraphs == 1)
|
||
|
{
|
||
|
require_once(APPPATH.'third_party/pchart/pchart/pChart.class');
|
||
|
require_once(APPPATH.'third_party/pchart/pchart/pData.class');
|
||
|
require_once(APPPATH.'third_party/pchart/pchart/pCache.class');
|
||
|
|
||
|
$MyCache = new pCache(Yii::app()->getConfig("tempdir").DIRECTORY_SEPARATOR);
|
||
|
//$currentuser is created as prefix for pchart files
|
||
|
if (isset($_SERVER['REDIRECT_REMOTE_USER']))
|
||
|
{
|
||
|
$currentuser=$_SERVER['REDIRECT_REMOTE_USER'];
|
||
|
}
|
||
|
else if (session_id())
|
||
|
{
|
||
|
$currentuser=substr(session_id(), 0, 15);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$currentuser="standard";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
// Set language for questions and labels to base language of this survey
|
||
|
if (isset($postlang) && $postlang != null )
|
||
|
$language = $postlang;
|
||
|
else
|
||
|
$language = Survey::model()->findByPk($iSurveyID)->language;
|
||
|
|
||
|
|
||
|
//set survey language for translations
|
||
|
$clang = SetSurveyLanguage($iSurveyID, $language);
|
||
|
|
||
|
|
||
|
//Create header (fixes bug #3097)
|
||
|
$surveylanguage= $language;
|
||
|
sendCacheHeaders();
|
||
|
$condition = false;
|
||
|
$sitename = Yii::app()->getConfig("sitename");
|
||
|
|
||
|
$data['surveylanguage'] = $surveylanguage;
|
||
|
$data['sitename'] = $sitename;
|
||
|
$data['condition'] = $condition;
|
||
|
$data['thisSurveyCssPath'] = $thisSurveyCssPath;
|
||
|
|
||
|
/*
|
||
|
* only show questions where question attribute "public_statistics" is set to "1"
|
||
|
*/
|
||
|
|
||
|
$query = "SELECT q.* , group_name, group_order FROM {{questions}} q, {{groups}} g, {{question_attributes}} qa
|
||
|
WHERE g.gid = q.gid AND g.language = :lang1 AND q.language = :lang2 AND q.sid = :surveyid AND q.qid = qa.qid AND q.parent_qid = 0 AND qa.attribute = 'public_statistics'";
|
||
|
$databasetype = Yii::app()->db->getDriverName();
|
||
|
if ($databasetype=='mssql' || $databasetype=="sqlsrv" || $databasetype=="dblib")
|
||
|
{
|
||
|
$query .=" AND CAST(CAST(qa.value as varchar) as int)='1'\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$query .=" AND qa.value='1'\n";
|
||
|
}
|
||
|
|
||
|
//execute query
|
||
|
$result = Yii::app()->db->createCommand($query)->bindParam(":lang1", $language, PDO::PARAM_STR)->bindParam(":lang2", $language, PDO::PARAM_STR)->bindParam(":surveyid", $iSurveyID, PDO::PARAM_INT)->queryAll();
|
||
|
|
||
|
//store all the data in $rows
|
||
|
$rows = $result;
|
||
|
|
||
|
|
||
|
//SORT IN NATURAL ORDER!
|
||
|
usort($rows, 'groupOrderThenQuestionOrder');
|
||
|
|
||
|
//put the question information into the filter array
|
||
|
foreach ($rows as $row)
|
||
|
{
|
||
|
//store some column names in $filters array
|
||
|
$filters[]=array($row['qid'],
|
||
|
$row['gid'],
|
||
|
$row['type'],
|
||
|
$row['title'],
|
||
|
$row['group_name'],
|
||
|
flattenText($row['question']));
|
||
|
}
|
||
|
|
||
|
//number of records for this survey
|
||
|
$totalrecords = 0;
|
||
|
|
||
|
//count number of answers
|
||
|
$query = "SELECT count(*) FROM {{survey_".intval($iSurveyID)."}}";
|
||
|
|
||
|
//if incompleted answers should be filtert submitdate has to be not null
|
||
|
//this setting is taken from config-defaults.php
|
||
|
if (Yii::app()->getConfig("filterout_incomplete_answers") == true)
|
||
|
{
|
||
|
$query .= " WHERE {{survey_".intval($iSurveyID)."}}.submitdate is not null";
|
||
|
}
|
||
|
$result = Yii::app()->db->createCommand($query)->queryAll();
|
||
|
|
||
|
//$totalrecords = total number of answers
|
||
|
foreach($result as $row)
|
||
|
{
|
||
|
$totalrecords = reset($row);
|
||
|
}
|
||
|
|
||
|
|
||
|
//this is the array which we need later...
|
||
|
$summary = array();
|
||
|
//...while this is the array from copy/paste which we don't want to replace because this is a nasty source of error
|
||
|
$allfields = array();
|
||
|
|
||
|
|
||
|
//---------- CREATE SGQA OF ALL QUESTIONS WHICH USE "PUBLIC_STATISTICS" ----------
|
||
|
|
||
|
/*
|
||
|
* let's go through the filter array which contains
|
||
|
* ['qid'],
|
||
|
['gid'],
|
||
|
['type'],
|
||
|
['title'],
|
||
|
['group_name'],
|
||
|
['question'];
|
||
|
*/
|
||
|
|
||
|
$currentgroup='';
|
||
|
// use to check if there are any question with public statistics
|
||
|
if(isset($filters)){
|
||
|
foreach ($filters as $flt)
|
||
|
{
|
||
|
//SGQ identifier
|
||
|
$myfield = "{$iSurveyID}X{$flt[1]}X{$flt[0]}";
|
||
|
|
||
|
//let's switch through the question type for each question
|
||
|
switch ($flt[2])
|
||
|
{
|
||
|
case "K": // Multiple Numerical
|
||
|
case "Q": // Multiple Short Text
|
||
|
//get answers
|
||
|
$query = "SELECT title as code, question as answer FROM {{questions}} WHERE parent_qid=:flt_0 AND language = :lang ORDER BY question_order";
|
||
|
$result = Yii::app()->db->createCommand($query)->bindParam(":flt_0", $flt[0], PDO::PARAM_INT)->bindParam(":lang", $language, PDO::PARAM_STR)->queryAll();
|
||
|
|
||
|
//go through all the (multiple) answers
|
||
|
foreach($result as $row)
|
||
|
{
|
||
|
$myfield2=$flt[2].$myfield.reset($row);
|
||
|
$allfields[] = $myfield2;
|
||
|
}
|
||
|
break;
|
||
|
case "A": // ARRAY OF 5 POINT CHOICE QUESTIONS
|
||
|
case "B": // ARRAY OF 10 POINT CHOICE QUESTIONS
|
||
|
case "C": // ARRAY OF YES\No\$clang->gT("Uncertain") QUESTIONS
|
||
|
case "E": // ARRAY OF Increase/Same/Decrease QUESTIONS
|
||
|
case "F": // FlEXIBLE ARRAY
|
||
|
case "H": // ARRAY (By Column)
|
||
|
//get answers
|
||
|
$query = "SELECT title as code, question as answer FROM {{questions}} WHERE parent_qid=:flt_0 AND language = :lang ORDER BY question_order";
|
||
|
$result = Yii::app()->db->createCommand($query)->bindParam(":flt_0", $flt[0], PDO::PARAM_INT)->bindParam(":lang", $language, PDO::PARAM_STR)->queryAll();
|
||
|
|
||
|
//go through all the (multiple) answers
|
||
|
foreach($result as $row)
|
||
|
{
|
||
|
$myfield2 = $myfield.reset($row);
|
||
|
$allfields[]=$myfield2;
|
||
|
}
|
||
|
break;
|
||
|
// all "free text" types (T, U, S) get the same prefix ("T")
|
||
|
case "T": // Long free text
|
||
|
case "U": // Huge free text
|
||
|
case "S": // Short free text
|
||
|
$myfield="T$myfield";
|
||
|
$allfields[] = $myfield;
|
||
|
break;
|
||
|
case ";": //ARRAY (Multi Flex) (Text)
|
||
|
case ":": //ARRAY (Multi Flex) (Numbers)
|
||
|
$query = "SELECT title, question FROM {{questions}} WHERE parent_qid=:flt_0 AND language=:lang AND scale_id = 0 ORDER BY question_order";
|
||
|
$result = Yii::app()->db->createCommand($query)->bindParam(":flt_0", $flt[0], PDO::PARAM_INT)->bindParam(":lang", $language, PDO::PARAM_STR)->queryAll();
|
||
|
foreach($result as $row)
|
||
|
{
|
||
|
$fquery = "SELECT * FROM {{questions}} WHERE parent_qid = :flt_0 AND language = :lang AND scale_id = 1 ORDER BY question_order, title";
|
||
|
$fresult = Yii::app()->db->createCommand($query)->bindParam(":flt_0", $flt[0], PDO::PARAM_INT)->bindParam(":lang", $language, PDO::PARAM_STR)->queryAll();
|
||
|
foreach($fresult as $frow)
|
||
|
{
|
||
|
$myfield2 = $myfield . reset($row) . "_" . $frow['title'];
|
||
|
$allfields[]=$myfield2;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
case "R": //RANKING
|
||
|
//get some answers
|
||
|
$query = "SELECT code, answer FROM {{answers}} WHERE qid = :flt_0 AND language = :lang ORDER BY sortorder, answer";
|
||
|
$result = Yii::app()->db->createCommand($query)->bindParam(":flt_0", $flt[0], PDO::PARAM_INT)->bindParam(":lang", $language, PDO::PARAM_STR)->queryAll();
|
||
|
|
||
|
//get number of answers
|
||
|
$count = count($result);
|
||
|
|
||
|
//loop through all answers. if there are 3 items to rate there will be 3 statistics
|
||
|
for ($i=1; $i<=$count; $i++)
|
||
|
{
|
||
|
$myfield2 = "R" . $myfield . $i . "-" . strlen($i);
|
||
|
$allfields[]=$myfield2;
|
||
|
}
|
||
|
break;
|
||
|
//Boilerplate questions are only used to put some text between other questions -> no analysis needed
|
||
|
case "X": //This is a boilerplate question and it has no business in this script
|
||
|
break;
|
||
|
case "1": // MULTI SCALE
|
||
|
//get answers
|
||
|
$query = "SELECT title, question FROM {{questions}} WHERE parent_qid = :flt_0 AND language = :lang ORDER BY question_order";
|
||
|
$result = Yii::app()->db->createCommand($query)->bindParam(":flt_0", $flt[0], PDO::PARAM_INT)->bindParam(":lang", $language, PDO::PARAM_STR)->queryAll();
|
||
|
|
||
|
//loop through answers
|
||
|
foreach($result as $row)
|
||
|
{
|
||
|
//----------------- LABEL 1 ---------------------
|
||
|
$myfield2 = $myfield . $row['title']."#0";
|
||
|
$allfields[]=$myfield2;
|
||
|
//----------------- LABEL 2 ---------------------
|
||
|
$myfield2 = $myfield . $row['title']."#1";
|
||
|
$allfields[]=$myfield2;
|
||
|
} //end WHILE -> loop through all answers
|
||
|
break;
|
||
|
|
||
|
case "P": //P - Multiple choice with comments
|
||
|
case "M": //M - Multiple choice
|
||
|
case "N": //N - Numerical input
|
||
|
case "D": //D - Date
|
||
|
$myfield2 = $flt[2].$myfield;
|
||
|
$allfields[]=$myfield2;
|
||
|
break;
|
||
|
default: //Default settings
|
||
|
$allfields[] = $myfield;
|
||
|
break;
|
||
|
|
||
|
} //end switch -> check question types and create filter forms
|
||
|
}
|
||
|
//end foreach -> loop through all questions with "public_statistics" enabled
|
||
|
}// end if -> for removing the error message in case there are no filters
|
||
|
$summary = $allfields;
|
||
|
|
||
|
|
||
|
// Get the survey inforamtion
|
||
|
$thissurvey = getSurveyInfo($surveyid,$language);
|
||
|
|
||
|
//SET THE TEMPLATE DIRECTORY
|
||
|
if (!isset($thissurvey['templatedir']) || !$thissurvey['templatedir'])
|
||
|
{
|
||
|
$data['sTemplatePath'] = validateTemplateDir(Yii::app()->getConfig("defaulttemplate"));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$data['sTemplatePath'] = validateTemplateDir($thissurvey['templatedir']);
|
||
|
}
|
||
|
|
||
|
|
||
|
//---------- CREATE STATISTICS ----------
|
||
|
$redata = compact(array_keys(get_defined_vars()));
|
||
|
doHeader();
|
||
|
echo templatereplace(file_get_contents(getTemplatePath(validateTemplateDir($data['sTemplatePath'])).DIRECTORY_SEPARATOR."startpage.pstpl"),array(), $redata);
|
||
|
|
||
|
|
||
|
//some progress bar stuff
|
||
|
|
||
|
// Create progress bar which is shown while creating the results
|
||
|
$prb = new ProgressBar();
|
||
|
$prb->pedding = 2; // Bar Pedding
|
||
|
$prb->brd_color = "#404040 #dfdfdf #dfdfdf #404040"; // Bar Border Color
|
||
|
|
||
|
$prb->setFrame(); // set ProgressBar Frame
|
||
|
$prb->frame['left'] = 50; // Frame position from left
|
||
|
$prb->frame['top'] = 80; // Frame position from top
|
||
|
$prb->addLabel('text','txt1',$clang->gT("Please wait ...")); // add Text as Label 'txt1' and value 'Please wait'
|
||
|
$prb->addLabel('percent','pct1'); // add Percent as Label 'pct1'
|
||
|
$prb->addButton('btn1',$clang->gT('Go back'),'?action=statistics&sid='.$iSurveyID); // add Button as Label 'btn1' and action '?restart=1'
|
||
|
|
||
|
//progress bar starts with 35%
|
||
|
$process_status = 35;
|
||
|
$prb->show(); // show the ProgressBar
|
||
|
|
||
|
|
||
|
// 1: Get list of questions with answers chosen
|
||
|
//"Getting Questions and Answer ..." is shown above the bar
|
||
|
$prb->setLabelValue('txt1',$clang->gT('Getting questions and answers ...'));
|
||
|
$prb->moveStep(5);
|
||
|
|
||
|
// creates array of post variable names
|
||
|
for (reset($_POST); $key=key($_POST); next($_POST))
|
||
|
{
|
||
|
$postvars[]=$key;
|
||
|
}
|
||
|
$data['thisSurveyTitle'] = $thisSurveyTitle;
|
||
|
$data['totalrecords'] = $totalrecords;
|
||
|
$data['clang'] = $clang;
|
||
|
$data['summary'] = $summary;
|
||
|
//show some main data at the beginnung
|
||
|
// CHANGE JSW_NZ - let's allow html formatted questions to show
|
||
|
|
||
|
|
||
|
//push progress bar from 35 to 40
|
||
|
$process_status = 40;
|
||
|
|
||
|
//Show Summary results
|
||
|
if (isset($summary) && $summary)
|
||
|
{
|
||
|
//"Generating Summaries ..." is shown above the progress bar
|
||
|
$prb->setLabelValue('txt1',$clang->gT('Generating summaries ...'));
|
||
|
$prb->moveStep($process_status);
|
||
|
|
||
|
//let's run through the survey // Fixed bug 3053 with array_unique
|
||
|
$runthrough=array_unique($summary);
|
||
|
|
||
|
//loop through all selected questions
|
||
|
foreach ($runthrough as $rt)
|
||
|
{
|
||
|
|
||
|
//update progress bar
|
||
|
if ($process_status < 100) $process_status++;
|
||
|
$prb->moveStep($process_status);
|
||
|
|
||
|
} // end foreach -> loop through all questions
|
||
|
|
||
|
$helper = new statistics_helper();
|
||
|
$statisticsoutput .= $helper->generate_statistics($iSurveyID, $summary, $summary, $publicgraphs, 'html', null,$language,false);
|
||
|
|
||
|
} //end if -> show summary results
|
||
|
|
||
|
$data['statisticsoutput']=$statisticsoutput;
|
||
|
//done! set progress bar to 100%
|
||
|
if (isset($prb))
|
||
|
{
|
||
|
$prb->setLabelValue('txt1',$clang->gT('Completed'));
|
||
|
$prb->moveStep(100);
|
||
|
$prb->hide();
|
||
|
}
|
||
|
|
||
|
$redata = compact(array_keys(get_defined_vars()));
|
||
|
$data['redata'] = $redata;
|
||
|
Yii::app()->getClientScript()->registerScriptFile(Yii::app()->getConfig('generalscripts') . 'statistics_user.js');
|
||
|
$this->renderPartial('/statistics_user_view',$data);
|
||
|
|
||
|
//output footer
|
||
|
echo getFooter();
|
||
|
|
||
|
//Delete all Session Data
|
||
|
Yii::app()->session['finished'] = true;
|
||
|
}
|
||
|
|
||
|
}
|