Solution Technologies
Управление сайтом без ограничений
<?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);

?>
Copyright ©1998-2008 Солютекс. Все права защищены.
Этот сайт сделан в designLab | Работает на технологии XS2
Условия использования | О защите конфиденциальности