<?php
/**
* XS2:
*
* This file is developed by Solutecs, LLC for the purpose of the company
* and is provided together with XS2 Framework as and inherent part of the
* system. This file can be used on the terms of License Agreement.
*
* +7 (495) 585-0833 / 13 Rusakovskaya street, Moscow 107140 Russia
*
* @link http://www.solutecs.com
* @copyright ©1998-2007 Solutecs, LLC
* @package XS2-MODCOM
* @subpackage proc-polls
* @version 1.XX
*/
/**
* Расчет результатов опроса. Данный процессор формирует массив $r, в котором представлены
* результаты опроса с идентификатором, переданным через первый параметр метода.
* $r имеет следующую структуру:
*
* $r = array(
* array(
* 'node' => Объект XS2, представляющий вопрос,
* 'subquestions' => array(
* 'node' => Объект XS2, представляющий подвопрос
* 'answers' => array(
* array(
* 'node' => Объект XS2, представляющий ответ,
* 'valueSum' => Сумма всех значений ответа. Таким образом, если это, например
* вопрос с выбором, то сумма всех значений ответа равна число
* выбравших этот вариант ответа человек.,
* 'valueScore' => array(
* числовое значение шкалы => количество набранных этим значением голосов
* ),
* 'texts' =>array(массив с развернутыми ответами)
* )
* )
* ),
* 'answers' =>array(
* array(
* 'node' => Объект XS2, представляющий ответ,
* 'valueSum' => Сумма всех значений ответа. Таким образом, если это, например
* вопрос с выбором, то сумма всех значений ответа равна число
* выбравших этот вариант ответа человек.,
* 'valueScore' => array(
* числовое значение шкалы => количество набранных этим значением голосов
* ),
* 'texts' => array(массив с развернутыми ответами)
* )
* )
* )
* )
*/
$poll = xs2GetNode(array('NodId'=>$_THE['PARAMS'][0]));
$results = xs2GetKnee(array('NodId'=>$poll['NodId'],'NType'=>'result'));
$questions = xs2GetChildren(array('ParId'=>$poll['NodId']));
$r = array();
// Перебор всех вопросов и подготовка массива со статистикой
foreach ($questions as $question) {
if ($question['NType']=='results') continue;
$answers = xs2GetChildren(array('ParId'=>$question['NodId'],'NType'=>'answer_var,answer_ext'));
$subquestions = xs2GetChildren(array('ParId'=>$question['NodId'],'NType'=>'subquestion'));
$r[$question['NodId']]['node'] = $question;
if ($subquestions) {
foreach ($subquestions as $subquestion) {
$r[$question['NodId']]['subquestions'][$subquestion['NodId']]['node']=$subquestion;
foreach ($answers as $answer) {
$r[$question['NodId']]['subquestions'][$subquestion['NodId']]['answers'][$answer['NodId']]['node']=$answer;
}
}
} else {
foreach ($answers as $answer) {
$r[$question['NodId']]['answers'][$answer['NodId']]['node']=$answer;
}
}
}
// Перебор всех ответов
foreach($results as $t) {
$result = unserialize($t['Answer']);
$extensions = unserialize($t['Extensions']);
// Если передан фильтр по срезам, проверяем, подходит ли текущий результат
// под условия, указанные в фильтре
$flag = true;
if ($_POST['q']) {
foreach ($_POST['q'] as $questionId=>$answers) {
if (serialize($answers)!=serialize($result[$questionId])) {
$flag=false;
}
}
}
if (!$flag) continue;
$resultsCount++;
foreach ($result as $qk=>$a) {
$r[$qk]['answersQty']++;
if ($r[$qk]['node']['NType']=='s_question') {
if (!$a[0]) {
//Есть подвопросы
foreach ($a as $sqk=>$sav) {
foreach ($sav as $ak=>$av) {
$r[$qk]['subquestions'][$sqk]['answers'][$ak]['valueSum']+=$av;
if ($r[$qk]['subquestions'][$sqk]['answers'][$ak]['node']['NType']=="answer_ext"
&& $extensions[$sqk][$ak]) {
$r[$qk]['subquestions'][$sqk]['answers'][$ak]['texts'][] = $extensions[$sqk][$ak];
}
}
}
}
else {
// Нет подвопросов
foreach ($a[0] as $ak=>$av) {
$r[$qk]['answers'][$ak]['valueSum']+=$av;
if ($r[$qk]['answers'][$ak]['node']['NType']=="answer_ext" && $extensions[$qk][$ak]) {
$r[$qk]['answers'][$ak]['texts'][] = $extensions[$qk][$ak];
}
}
}
}
elseif ($r[$qk]['node']['NType']=='sv_question') {
if (!$a[0]) {
// Есть подвопросы
foreach ($a as $sqk=>$sav) {
foreach ($sav as $ak=>$av) {
$r[$qk]['subquestions'][$sqk]['answers'][$ak]['valueScore'][$av]++;
$r[$qk]['subquestions'][$sqk]['answers'][$ak]['valueSum']+=$av;
$r[$qk]['subquestions'][$sqk]['answers'][$ak]['averageValue']=
$r[$qk]['subquestions'][$sqk]['answers'][$ak]['valueSum']/$r[$qk]['answersQty'];
}
}
}
else {
foreach ($a[0] as $ak=>$av) {
$r[$qk]['answers'][$ak]['valueScore'][$av]++;
$r[$qk]['answers'][$ak]['valueSum']+=$av;
$r[$qk]['answers'][$ak]['averageValue']=
$r[$qk]['answers'][$ak]['valueSum']/$r[$qk]['answersQty'];
}
}
}
elseif ($r[$qk]['node']['NType']=='r_question') {
foreach ($a[0] as $ak=>$av) {
$r[$qk]['answers'][$ak]['valueScore'][$av]++;
$r[$qk]['answers'][$ak]['valueSum']+=$av;
}
}
elseif ($r[$qk]['node']['NType']=='t_question') {
if ($a[0]!="") {
$r[$qk]['answers'][]=$a[0];
}
}
}
}
$_HTML->assign('r', $r);
$_HTML->assign('resultsCount', $resultsCount);
$_HTML->assign('poll', $poll);
?>
|