Example #1
0
 public function execute($context)
 {
     $context['APPLICATION']->AddHeadScript('/js/forms.js');
     $context['APPLICATION']->AddHeadScript('/js/icheck/icheck.min.js');
     $context['APPLICATION']->SetAdditionalCSS('/js/icheck/skins/minimal/eco.css');
     // выполняем с респондентами действия
     if (isset($_POST['respondents_ids'])) {
         $selectedIDs = $_POST['respondents_ids'];
         if (isset($_POST['mode'])) {
             if ($_POST['mode'] == 'reset') {
                 $seances = $this->registry->getDbHelper('SeancesHelper')->findSeanceByProjectAndRespondentsIDs($context['project']['projectID'], $selectedIDs);
                 foreach ($seances as $seance) {
                     // деактивируем текущий сеанс
                     $this->registry->getDbHelper('SeancesHelper')->editSeance($seance['seanceID'], array('active' => 0, 'private_access_key' => ''));
                     $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'seance', $seance['seanceID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_DELETE, $seance);
                     $this->registry->getDbHelper('MembersHelper')->editRespondent($seance['respondentID'], array('status' => 'active'));
                     // создаем новый сеанс
                     $BlankDataSource = new \Ecoplay\Model\BlankDataSource($this->registry->getDbConnect(), 0, 0);
                     $seanceKey = $BlankDataSource->addSeanceAndCookies($seance['private_access_key']);
                     $newSeance = $this->registry->getDbHelper('SeancesHelper')->findSeanceByKey($seanceKey);
                     $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'seance', $newSeance['seanceID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null);
                 }
             }
         }
     }
     $cnt = $this->registry->getDbHelper('LinearProjectsHelper')->getGroupKeyRespondentsCount($context['project']['projectID'], $context['groupKey']['group_keyID']);
     $onPage = 100;
     $pagesCnt = ceil($cnt / $onPage);
     $page = $_GET['PAGE'] && $_GET['PAGE'] <= $pagesCnt ? intval($_GET['PAGE']) : 1;
     $this->component->arResult['cntInfo'] = $pagesCnt == 1 ? $cnt : 0;
     $respondents = $this->registry->getDbHelper('LinearProjectsHelper')->getGroupKeyRespondents($context['project']['projectID'], $context['groupKey']['group_keyID'], $page, $onPage);
     $this->component->arResult['respondents'] = $respondents;
     $this->component->arResult['groupKey'] = $context['groupKey'];
     $languagesIDs = json_decode($context['project']['~languages']);
     $languagesSrc = $this->registry->getDbHelper('TranslationHelper')->getLanguagesByIDs($languagesIDs);
     $languages = array();
     foreach ($languagesSrc as $language) {
         $languages[$language['langID']] = $language['name'];
     }
     $this->component->arResult['languages'] = $languages;
     $this->component->arResult['statuses'] = $this->registry->getDbHelper('MembersHelper')->getLinearRespondentsStatusesNames();
     $this->component->IncludeComponentTemplate('linear/table');
     $navResult = new \CDBResult();
     $navResult->NavPageCount = ceil($cnt / $onPage);
     $navResult->NavPageNomer = $page;
     $navResult->NavNum = 1;
     $navResult->NavPageSize = $onPage;
     $navResult->NavRecordCount = $cnt;
     $navResult->nPageWindow = 11;
     $context['APPLICATION']->IncludeComponent('ecoplay:system.pagenavigation', '', array('NAV_RESULT' => $navResult, 'NAV_URL' => '/projects/' . $context['project']['projectID'] . '/settings/groupkeys/' . $context['groupKey']['group_keyID'] . '/respondents/', 'NAV_QUERY_STRING' => isset($_GET['checkAll']) ? 'checkAll=1' : ''));
     $viewHelper = new \Ecoplay\View\Helper();
     $context['APPLICATION']->SetPageProperty('pageMainTitle', 'Респонденты группового ключа');
     $context['APPLICATION']->SetPageProperty('navigation', $viewHelper->generateNavigation(array(0 => array('link' => '/', 'title' => 'Главная'), 1 => array('link' => '/projects/', 'title' => 'Проекты'), 2 => array('link' => '/projects/' . $context['project']['projectID'] . '/continuing/stat/', 'title' => $context['project']['project_name']), 3 => array('link' => '/projects/' . $context['project']['projectID'] . '/settings/groupkeys/', 'title' => ' Групповые ключи'), 4 => array('title' => $context['groupKey']['name']), 5 => array('title' => 'Список Респондентов'))));
     $this->component->IncludeComponentTemplate('linear/template');
 }
Example #2
0
 public function execute($context)
 {
     $context['APPLICATION']->AddHeadScript('/js/forms.js');
     $context['APPLICATION']->AddHeadScript('/js/icheck/icheck.min.js');
     $context['APPLICATION']->SetAdditionalCSS('/js/icheck/skins/minimal/eco.css');
     // проверка прав доступа к разделу
     if (!$this->registry->getModel('Auth')->checkAccess($_SESSION['accesses'], 'members', $context['project']['projectID'])) {
         $this->registry->getModel('Auth')->restrict();
     }
     $this->component->arResult['canImport'] = $this->registry->getModel('Auth')->checkAccess($_SESSION['accesses'], 'imports', $context['project']['projectID']);
     $isProjectAdmin = $this->registry->getModel('Auth')->checkAccess($_SESSION['accesses'], 'project_edit', $context['project']['projectID']);
     $this->component->arResult['isProjectAdmin'] = $isProjectAdmin;
     $selectedIDs = array();
     // обнуление заполнения
     $this->component->arResult['isAdmin'] = $_SESSION['accesses']['is_admin'] ? true : false;
     if (isset($_POST['reseted_id'])) {
         $selectedIDs[] = $_POST['reseted_id'];
         $seance = $this->registry->getDbHelper('SeancesHelper')->findSeanceByRespondentAndProject($_POST['reseted_id'], $context['project']['projectID']);
         if ($seance) {
             // деактивируем текущий сеанс
             $this->registry->getDbHelper('SeancesHelper')->editSeance($seance['seanceID'], array('active' => 0, 'private_access_key' => ''));
             $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'seance', $seance['seanceID'], LogsHelper::ACTION_TYPE_DELETE, $seance);
             // создаем новый сеанс
             $BlankDataSource = new \Ecoplay\Model\BlankDataSource($this->registry->getDbConnect(), 0, 0);
             $seanceKey = $BlankDataSource->addSeanceAndCookies($seance['private_access_key']);
             $seance = $this->registry->getDbHelper('SeancesHelper')->findSeanceByKey($seanceKey);
             $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'seance', $seance['seanceID'], LogsHelper::ACTION_TYPE_ADD, null);
             //ставим флаг чтобы данные по отчету для оцениваемого пересчитались
             $respondent = $this->registry->getDbHelper('MembersHelper')->findRespondentById($seance['respondentID']);
             $assessCompetencyData = $this->registry->getDbHelper('CompetencyHelper')->getAssessCompetencyData($respondent['stat1_assessID']);
             if ($assessCompetencyData) {
                 $this->registry->getDbHelper('CompetencyHelper')->editAssessCompetency($assessCompetencyData['ID'], array('need_recount' => 1));
             }
         }
     }
     $availableSessionsIDs = $this->registry->getModel('Auth')->getAvailableSessions($_SESSION['accesses'], $context['project']['projectID']);
     $sessions = $this->registry->getDbHelper('ProjectsHelper')->getUserAvailableSessionsByProjectID($context['project']['projectID'], $availableSessionsIDs);
     $this->component->arResult['jsessions'] = json_encode($sessions);
     $this->component->arResult['sessions'] = $sessions;
     $sorts = array('respondentID' => 'respondentID', 'assess' => 'assess', 'assess_email' => 'assess_email', 'assess_position' => 'assess_position', 'role' => 'role', 'respondent' => 'respondent', 'email' => 'email', 'position' => 'position', 'percent' => 'percent', 'sessionID' => 'sessionID', 'seanceID' => 'seanceID', 'sortby' => 'sortby');
     if (isset($_GET['sort']) && array_key_exists($_GET['sort'], $sorts)) {
         $sort = $_GET['sort'];
     } else {
         $sort = 'respondentID';
     }
     $order = isset($_GET['order']) && in_array($_GET['order'], array('asc', 'desc')) ? $_GET['order'] : 'asc';
     $filterQueryString = DataFilter::getFilterQueryString($_GET);
     $this->component->arResult['filterQueryString'] = $filterQueryString;
     // настройки фильтров для данных
     $filters = array(0 => array('title' => 'Оцениваемый Имя', 'name' => 'assess_name', 'type' => 'text', 'data_type' => 'string', 'field' => 'pma.`name`'), 1 => array('title' => 'Оцениваемый Фамилия', 'name' => 'assess_surname', 'type' => 'text', 'data_type' => 'string', 'field' => 'pma.`surname`'), 2 => array('title' => 'Оцениваемый ID', 'name' => 'assess_id', 'type' => 'text', 'data_type' => 'number', 'field' => 'a.`assessID`'), 3 => array('title' => 'Респондент Имя', 'name' => 'respondent_name', 'type' => 'text', 'data_type' => 'string', 'field' => 'pm.`name`'), 4 => array('title' => 'Респондент Фамилия', 'name' => 'respondent_surname', 'type' => 'text', 'data_type' => 'string', 'field' => 'pm.`surname`'), 5 => array('title' => 'Респондент ID', 'name' => 'respondent_id', 'type' => 'text', 'data_type' => 'number', 'field' => 'r.`respondentID`'), 6 => array('title' => 'Текст', 'name' => 'text', 'type' => 'text', 'data_type' => 'string', 'field' => array('pma.`search_text`', 'pm.`search_text`', 'rt.`name`')), 7 => array('title' => 'Группа ', 'name' => 'session_id', 'type' => 'select', 'data_type' => 'number', 'field' => 's.`sessionID`', 'values' => array(0 => 'Любая') + $sessions));
     $filterData = array('FILTERS' => $filters, 'BASE_URL' => '/projects/' . $context['project']['projectID'] . '/members/scheme360/', 'SORT' => $sort, 'ORDER' => $order);
     // проверяем, введен ли фильтр
     $filterValue = DataFilter::getFilterValue($filters, $_GET, $this->registry->getDbConnect());
     if ($filterValue['valid']) {
         $filterData = array_merge($filterData, $filterValue);
     }
     // компонент отображения фильтра
     $context['APPLICATION']->IncludeComponent('ecoplay:data.filter', '', $filterData);
     $cnt = $this->registry->getDbHelper('MembersHelper')->getRespondentsForScheme360Cnt($context['project']['projectID'], $availableSessionsIDs, $filterValue['filter_strings']);
     $onPage = 100;
     $pagesCnt = ceil($cnt / $onPage);
     $page = $_GET['PAGE'] && $_GET['PAGE'] <= $pagesCnt ? intval($_GET['PAGE']) : 1;
     if ($isProjectAdmin && isset($_POST['deny'])) {
         if (isset($_POST['all']) && $_POST['all']) {
             $selectedIDs = $this->registry->getDbHelper('MembersHelper')->getRespondentsIDsForScheme360($context['project']['projectID'], $availableSessionsIDs, $filterValue['filter_strings']);
         } else {
             $selectedIDs = $_POST['respondents_ids'];
         }
         $this->registry->getDbHelper('MembersHelper')->editRespondents($selectedIDs, array('deny_deletion' => 1));
     }
     $this->component->arResult['selectedIDs'] = $selectedIDs;
     $respondents = $this->registry->getDbHelper('MembersHelper')->getRespondentsForScheme360($context['project']['projectID'], $availableSessionsIDs, $page, $onPage, $sorts[$sort], $order, $filterValue['filter_strings']);
     $this->component->arResult['respondents'] = $respondents;
     if (isset($_GET['checkAll'])) {
         $selectedIDs = array();
         foreach ($respondents as $responent) {
             $selectedIDs[] = $responent['respondentID'];
         }
         $this->component->arResult['selectedIDs'] = $selectedIDs;
     }
     $viewHelper = new \Ecoplay\View\Helper();
     $this->component->arResult['sort'] = $sort;
     $this->component->arResult['order'] = $order;
     $this->component->arResult['cntInfo'] = $pagesCnt == 1 ? $cnt : 0;
     $roles = $this->registry->getDbHelper('ProjectsHelper')->getProjectRoles($context['project']['projectID']);
     $selfRoleID = 0;
     foreach ($roles as $role) {
         if ($role['fixed_role'] == 'self') {
             $selfRoleID = $role['roleID'];
             break;
         }
     }
     $this->component->arResult['selfRoleID'] = $selfRoleID;
     // выводим таблицу с данными
     $this->component->IncludeComponentTemplate('table');
     $navResult = new \CDBResult();
     $navResult->NavPageCount = ceil($cnt / $onPage);
     $navResult->NavPageNomer = $page;
     $navResult->NavNum = 1;
     $navResult->NavPageSize = $onPage;
     $navResult->NavRecordCount = $cnt;
     $navResult->nPageWindow = 11;
     $context['APPLICATION']->IncludeComponent('ecoplay:system.pagenavigation', '', array('NAV_RESULT' => $navResult, 'NAV_URL' => '/projects/' . $context['project']['projectID'] . '/members/scheme360/', 'NAV_QUERY_STRING' => 'sort=' . $sort . '&order=' . $order . ($filterQueryString ? '&' . $filterQueryString : '') . (isset($_GET['checkAll']) ? '&checkAll=1' : '')));
     $context['APPLICATION']->SetPageProperty('pageMainTitle', 'Схема 360&deg;');
     $context['APPLICATION']->SetPageProperty('navigation', $viewHelper->generateNavigation(array(0 => array('link' => '/', 'title' => 'Главная'), 1 => array('link' => '/projects/', 'title' => 'Проекты'), 2 => array('link' => '/projects/' . $context['project']['projectID'] . '/continuing/stat/', 'title' => $context['project']['project_name']), 3 => array('title' => 'Схема 360&deg;'))));
     $this->component->IncludeComponentTemplate();
 }
Example #3
0
 public function execute($context)
 {
     // проверка прав доступа к разделу
     if (!$this->registry->getModel('Auth')->checkAccess($_SESSION['accesses'], 'members', $context['project']['projectID'])) {
         $this->registry->getModel('Auth')->restrict();
     }
     $context['APPLICATION']->AddHeadScript('/js/forms.js');
     $context['APPLICATION']->AddHeadScript('/js/icheck/icheck.min.js');
     $context['APPLICATION']->SetAdditionalCSS('/js/icheck/skins/minimal/eco.css');
     if (isset($_POST['type'])) {
         if ($_POST['type'] == 'exist') {
             if (isset($_POST['member_id'])) {
                 // проверяем, может уже есть респондент с таким участником
                 $existRespondent = $this->registry->getDbHelper('MembersHelper')->findRespondentByMemberIDAndSessionID($context['project']['projectID'], $_POST['member_id'], $_POST['session_id']);
                 if (!$existRespondent) {
                     // добавляем респондента
                     $respondentID = $this->registry->getDbHelper('MembersHelper')->addRespondent(array('project_memberID' => intval($_POST['member_id']), 'active' => 1, 'projectID' => $context['project']['projectID'], 'sessionID' => intval($_POST['session_id']), 'stat1_assessID' => 0, 'status' => \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_NEW, 'private_access_key' => $this->registry->getModel('Auth')->generateUid('prep_respondents', 'private_access_key'), 'stat1_roleID' => 0, 'last_email' => '0000-00-00 00:00:00', 'langID' => 0, 'last_entrance' => '0000-00-00 00:00:00', 'deny_deletion' => 0, 'addedd_by_assess' => 0, 'need_remind' => 0));
                     $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondentID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null);
                 }
             }
         } else {
             // пробуем добавить участника
             $validations = array('name' => 'anything', 'surname' => 'anything', 'email' => 'email', 'position' => 'anything', 'department' => 'anything', 'language' => 'identifier');
             $required = array('name', 'email', 'language');
             $validator = new \Ecoplay\Form\Validator($validations, $required, array());
             if ($validator->validate($_POST)) {
                 // проверяем чтобы не было уже участника с таким email
                 if (!$this->registry->getDbHelper('MembersHelper')->findByEmailAndProjectId($_POST['email'], $context['project']['projectID'])) {
                     $memberID = $this->registry->getDbHelper('MembersHelper')->addMember(trim($_POST["name"]), trim($_POST["surname"]), trim($_POST["position"]), trim($_POST["email"]), $context['project']['projectID'], $this->registry->getModel('Auth')->generateUid('prep_projects_members', 'private_lk_access_key'), intval($_POST["language"]), 1, 'new', trim($_POST['department']));
                     $eventListener = new EventListener($this->registry, $context['project'], $_SERVER["DOCUMENT_ROOT"] . '/');
                     $eventListener->executeEvent('MemberAdded', array('memberID' => $memberID), true);
                     $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'member', $memberID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null);
                     // добавляем респондента
                     $respondentID = $this->registry->getDbHelper('MembersHelper')->addRespondent(array('project_memberID' => $memberID, 'active' => 1, 'projectID' => $context['project']['projectID'], 'sessionID' => intval($_POST['session_id']), 'stat1_assessID' => 0, 'status' => \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_NEW, 'private_access_key' => $this->registry->getModel('Auth')->generateUid('prep_respondents', 'private_access_key'), 'stat1_roleID' => 0, 'last_email' => '0000-00-00 00:00:00', 'langID' => 0, 'last_entrance' => '0000-00-00 00:00:00', 'deny_deletion' => 0, 'addedd_by_assess' => 0, 'need_remind' => 0));
                     $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondentID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null);
                 } else {
                     $this->component->arResult['statusError'] = 'Участник с таким email (' . $_POST['email'] . ') уже существует';
                 }
             }
         }
     }
     if ($_FILES["filepath"] && !$_FILES['filepath']['error']) {
         $sessionID = (int) $_POST["fgroup"];
         if ($sessionID) {
             $session = $this->registry->getDbHelper('ProjectsHelper')->findSessionById($sessionID);
         }
         // обрабатываем загруженный файл
         $csvImporter = new \Ecoplay\Import\Csv($_FILES["filepath"]["tmp_name"], $_SERVER["DOCUMENT_ROOT"] . "/temp/csv/");
         $data = $csvImporter->parse();
         $sessionIndex = $csvImporter->getColumnIndex('Группа');
         if (!((!$sessionIndex || !$data[0][$sessionIndex]) && (!$sessionID || !$session))) {
             // определяем группу
             if ($sessionIndex && $data[0][$sessionIndex]) {
                 // ищем группу
                 $session = $this->registry->getDbHelper('ProjectsHelper')->findSessionByProjectIDAndName($context['project']['projectID'], $data[0][$sessionIndex]);
                 if ($session) {
                     $sessionID = $session['sessionID'];
                 } else {
                     $session = array('name' => $data[0][$sessionIndex], 'active' => 1, 'status' => 'active', 'projectID' => $context['project']['projectID']);
                     $sessionID = $this->registry->getDbHelper('ProjectsHelper')->addSession($session);
                     $session['sessionID'] = $sessionID;
                 }
             }
             $inserted = $skipped = 0;
             $validations = array(0 => 'anything', 1 => 'anything', 2 => 'email', 3 => 'anything', 4 => 'anything');
             $required = array(2);
             $validator = new \Ecoplay\Form\Validator($validations, $required, array());
             $projectLangID = $this->registry->getModel('Projects')->getDefaultLangID($context['project']);
             $languageIndex = $csvImporter->getColumnIndex('Язык');
             $languagesIDs = array();
             $availableLanguages = $this->registry->getDbHelper('TranslationHelper')->getLanguagesByIDs(json_decode($context['project']['~languages']));
             foreach ($availableLanguages as $language) {
                 $languagesIDs[$language['abbr']] = $language['langID'];
             }
             foreach ($data as $row) {
                 if ($sessionIndex && $row[$sessionIndex] && $row[$sessionIndex] != $session['name']) {
                     // ищем группу
                     $session = $this->registry->getDbHelper('ProjectsHelper')->findSessionByProjectIDAndName($context['project']['projectID'], $row[$sessionIndex]);
                     if ($session) {
                         $sessionID = $session['sessionID'];
                     } else {
                         $session = array('name' => $row[$sessionIndex], 'active' => 1, 'status' => 'active', 'projectID' => $context['project']['projectID']);
                         $sessionID = $this->registry->getDbHelper('ProjectsHelper')->addSession($session);
                         $session['sessionID'] = $sessionID;
                     }
                 }
                 // валидируем исходные данные
                 if (!$validator->validate($row)) {
                     $skipped++;
                 } elseif (!$row[0] && !$row[1]) {
                     // должно быть хотябы или имя, или фамилия
                     $skipped++;
                 } else {
                     // ищем такого участника уже в базе
                     $member = $this->registry->getDbHelper('MembersHelper')->findByEmailAndProjectId($row[2], $context['project']['projectID']);
                     if (!$member) {
                         // добавляем участника
                         // определяем язык по структуре
                         $staff = $this->registry->getDbHelper('MembersHelper')->findStaffByProjectIDAndEmail($context['project']['projectID'], $row[2]);
                         $langID = $languageIndex && $row[$languageIndex] && array_key_exists($row[$languageIndex], $languagesIDs) ? $languagesIDs[$row[$languageIndex]] : $projectLangID;
                         $memberID = $this->registry->getDbHelper('MembersHelper')->addMember($row[0], $row[1], $row[3], $row[2], $context['project']['projectID'], $this->registry->getModel('Auth')->generateUid('prep_projects_members', 'private_lk_access_key', false), $langID, 1, 'new', $row[4]);
                         $eventListener = new EventListener($this->registry, $context['project'], $_SERVER["DOCUMENT_ROOT"] . '/');
                         $eventListener->executeEvent('MemberAdded', array('memberID' => $memberID, 'staff' => $staff), true);
                         $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'member', $memberID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null);
                     } else {
                         $memberID = $member['projects_memberID'];
                     }
                     if ($this->registry->getDbHelper('MembersHelper')->findRespondentByProjectIDAndSessionIDAndMemberID($context['project']['projectID'], $sessionID, $memberID)) {
                         // такой оцениваемый уже есть
                         $skipped++;
                     } else {
                         $respondentID = $this->registry->getDbHelper('MembersHelper')->addRespondent(array('projectID' => $context['project']['projectID'], 'sessionID' => $sessionID, 'project_memberID' => $memberID, 'active' => 1, 'status' => 'new', 'stat1_assessID' => 0, 'private_access_key' => $this->registry->getModel('Auth')->generateUid('prep_respondents', 'private_access_key', false), 'stat1_roleID' => 0));
                         $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondentID, \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null);
                         $inserted++;
                     }
                 }
             }
             $this->component->arResult['statusSuccess'] = 'Импортировано: ' . $inserted . ', проигнорировано: ' . $skipped;
         }
     }
     $statuses = $this->registry->getDbHelper('MembersHelper')->getLinearRespondentsStatusesNames();
     $this->component->arResult['statuses'] = $statuses;
     $sorts = array('respondentID' => 'respondentID', 'name' => 'name', 'surname' => 'surname', 'email' => 'email', 'position' => 'position', 'status' => 'status', 'private_lk_access_key' => 'private_lk_access_key');
     if (isset($_GET['sort']) && array_key_exists($_GET['sort'], $sorts)) {
         $sort = $_GET['sort'];
     } else {
         $sort = 'respondentID';
     }
     $order = isset($_GET['order']) && in_array($_GET['order'], array('asc', 'desc')) ? $_GET['order'] : 'asc';
     $filterQueryString = DataFilter::getFilterQueryString($_GET);
     $this->component->arResult['filterQueryString'] = $filterQueryString;
     // настройки фильтров для данных
     $filters = array(0 => array('title' => 'Имя', 'name' => 'name', 'type' => 'text', 'data_type' => 'string', 'field' => 'm.`name`'), 1 => array('title' => 'Фамилия', 'name' => 'surname', 'type' => 'text', 'data_type' => 'string', 'field' => 'm.`surname`'), 2 => array('title' => 'ID', 'name' => 'id', 'type' => 'text', 'data_type' => 'number', 'field' => 'r.`respondentID`'), 3 => array('title' => 'Текст', 'name' => 'text', 'type' => 'text', 'data_type' => 'string', 'field' => array('m.`search_text`')), 4 => array('title' => 'Статус ', 'name' => 'status', 'type' => 'select', 'data_type' => 'string', 'field' => 'r.`status`', 'values' => array(0 => 'Любой') + $statuses));
     $filterData = array('FILTERS' => $filters, 'BASE_URL' => '/projects/' . $context['project']['projectID'] . '/groups/' . (isset($_GET['TYPE']) && $_GET['TYPE'] ? $_GET['TYPE'] . '/' : '') . 'respondents/', 'SORT' => $sort, 'ORDER' => $order);
     // проверяем, введен ли фильтр
     $filterValue = DataFilter::getFilterValue($filters, $_GET, $this->registry->getDbConnect());
     if ($filterValue['valid']) {
         $filterData = array_merge($filterData, $filterValue);
     }
     // компонент отображения фильтра
     $context['APPLICATION']->IncludeComponent('ecoplay:data.filter', '', $filterData);
     // выполняем с респондентами действия
     if (isset($_POST['respondents_ids'])) {
         if (isset($_POST['all']) && $_POST['all']) {
             $selectedIDs = $this->registry->getDbHelper('LinearProjectsHelper')->getProjectRespondentsIDs($context['project']['projectID'], $filterValue['filter_strings']);
         } else {
             $selectedIDs = $_POST['respondents_ids'];
         }
         if (isset($_POST['mode'])) {
             if ($_POST['mode'] == 'send_notifications') {
                 $editedRespondents = $this->registry->getDbHelper('LinearProjectsHelper')->getRespondentsByIDs($selectedIDs);
                 $this->registry->getDbHelper('MembersHelper')->editRespondents($selectedIDs, array('need_remind' => 1));
                 foreach ($editedRespondents as $respondent) {
                     $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondent['respondentID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_CHANGE, $respondent);
                 }
             } elseif ($_POST['mode'] == 'reset') {
                 /*$editedRespondents =  $this->registry->getDbHelper('LinearProjectsHelper')->getRespondentsByIDs($selectedIDs);
                   
                   $this->registry->getDbHelper('MembersHelper')->editRespondents($selectedIDs, array(
                     'status'  => \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_ACTIVE,
                   ));
                   
                   foreach ($editedRespondents as $respondent) {
                     $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondent['respondentID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_CHANGE, $respondent);
                   }*/
                 $seances = $this->registry->getDbHelper('SeancesHelper')->findSeanceByProjectAndRespondentsIDs($context['project']['projectID'], $selectedIDs);
                 foreach ($seances as $seance) {
                     // деактивируем текущий сеанс
                     $this->registry->getDbHelper('SeancesHelper')->editSeance($seance['seanceID'], array('active' => 0, 'private_access_key' => ''));
                     $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'seance', $seance['seanceID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_DELETE, $seance);
                     $this->registry->getDbHelper('MembersHelper')->editRespondent($seance['respondentID'], array('status' => 'active'));
                     // создаем новый сеанс
                     $BlankDataSource = new \Ecoplay\Model\BlankDataSource($this->registry->getDbConnect(), 0, 0);
                     $seanceKey = $BlankDataSource->addSeanceAndCookies($seance['private_access_key']);
                     $newSeance = $this->registry->getDbHelper('SeancesHelper')->findSeanceByKey($seanceKey);
                     $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'seance', $newSeance['seanceID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_ADD, null);
                 }
             } elseif ($_POST['mode'] == 'return') {
                 if ($context['project']['allow_edit_seance_answers']) {
                     $seances = $this->registry->getDbHelper('SeancesHelper')->findSeanceByProjectAndRespondentsIDs($context['project']['projectID'], $selectedIDs);
                     foreach ($seances as $seance) {
                         if ($seance['state'] == \Ecoplay\Helper\Db\BlanksHelper::SEANCE_STATE_COMPLETE) {
                             $respondent = $this->registry->getDbHelper('MembersHelper')->findRespondentById($seance['respondentID']);
                             $this->registry->getDbHelper('MembersHelper')->editRespondent($seance['respondentID'], array('status' => \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_ACTIVE));
                             // обновляем сеанс
                             $lastScreen = $this->registry->getDbHelper('BlanksHelper')->getBlankPrevScreen($seance['blankID'], $seance['last_screenID']);
                             $this->registry->getDbHelper('SeancesHelper')->editSeance($seance['seanceID'], array('state' => \Ecoplay\Helper\Db\BlanksHelper::SEANCE_STATE_PROGRESS, 'last_screenID' => $lastScreen ? $lastScreen['screenID'] : 0));
                         }
                     }
                 }
             } else {
                 $newStatus = false;
                 switch ($_POST['mode']) {
                     case 'to_new':
                         $newStatus = \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_NEW;
                         break;
                     case 'to_active':
                         $newStatus = \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_ACTIVE;
                         break;
                     case 'to_complete':
                         $newStatus = \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_COMPLETE;
                         break;
                     case 'to_archive':
                         $newStatus = \Ecoplay\Helper\Db\MembersHelper::RESPONDENT_STATUS_ARCHIVE;
                         break;
                 }
                 if ($newStatus) {
                     $editedRespondents = $this->registry->getDbHelper('LinearProjectsHelper')->getRespondentsByIDs($selectedIDs);
                     $this->registry->getDbHelper('MembersHelper')->editRespondents($selectedIDs, array('status' => $newStatus));
                     foreach ($editedRespondents as $respondent) {
                         $this->registry->getModel('ActionsLogger')->log($context['USER']->GetID(), 'respondent', $respondent['respondentID'], \Ecoplay\Helper\Db\LogsHelper::ACTION_TYPE_CHANGE, $respondent);
                     }
                 }
             }
         }
     }
     $arResult['selectedIDs'] = $selectedIDs;
     // получаем респондентов проекта
     $cnt = $this->registry->getDbHelper('LinearProjectsHelper')->getProjectRespondentsCount($context['project']['projectID'], $filterValue['filter_strings']);
     $onPage = 100;
     $pagesCnt = ceil($cnt / $onPage);
     $page = $_GET['PAGE'] && $_GET['PAGE'] <= $pagesCnt ? intval($_GET['PAGE']) : 1;
     $respondents = $this->registry->getDbHelper('LinearProjectsHelper')->getProjectRespondents($context['project']['projectID'], $page, $onPage, $sorts[$sort], $order, $filterValue['filter_strings']);
     $this->component->arResult['respondents'] = $respondents;
     $this->component->arResult['sort'] = $sort;
     $this->component->arResult['order'] = $order;
     $this->component->arResult['cntInfo'] = $pagesCnt == 1 ? $cnt : 0;
     $navResult = new \CDBResult();
     $navResult->NavPageCount = ceil($cnt / $onPage);
     $navResult->NavPageNomer = $page;
     $navResult->NavNum = 1;
     $navResult->NavPageSize = $onPage;
     $navResult->NavRecordCount = $cnt;
     $navResult->nPageWindow = 11;
     $context['APPLICATION']->IncludeComponent('ecoplay:system.pagenavigation', '', array('NAV_RESULT' => $navResult, 'NAV_URL' => '/projects/' . $context['project']['projectID'] . '/groups/' . (isset($_GET['TYPE']) && $_GET['TYPE'] ? $_GET['TYPE'] . '/' : '') . 'respondents/', 'NAV_QUERY_STRING' => 'sort=' . $sort . '&order=' . $order . ($filterQueryString ? '&' . $filterQueryString : '') . (isset($_GET['checkAll']) ? '&checkAll=1' : '')));
     $this->component->arResult['sessions'] = $this->registry->getDbHelper('ProjectsHelper')->getSessionsByProjectID($context['project']['projectID']);
     $languagesIDs = json_decode($context['project']['~languages']);
     $languagesSrc = $this->registry->getDbHelper('TranslationHelper')->getLanguagesByIDs($languagesIDs);
     $languages = array();
     foreach ($languagesSrc as $language) {
         $languages[$language['langID']] = $language['name'];
     }
     $this->component->arResult['languages'] = $languages;
     $this->component->arResult['project'] = $context['project'];
     $context['APPLICATION']->SetPageProperty('pageMainTitle', 'Респонденты');
     $viewHelper = new \Ecoplay\View\Helper();
     $context['APPLICATION']->SetPageProperty('navigation', $viewHelper->generateNavigation(array(0 => array('link' => '/', 'title' => 'Главная'), 1 => array('link' => '/projects/', 'title' => 'Проекты'), 2 => array('link' => '/projects/' . $context['project']['projectID'] . '/continuing/stat/', 'title' => $context['project']['project_name']), 3 => array('title' => 'Респонденты'))));
     $this->component->IncludeComponentTemplate("template_linear");
 }
Example #4
0
 public function execute($context)
 {
     // обработка ответов
     $errors = array();
     $answers = array();
     try {
         $this->registry->getDbConnect()->StartTransaction();
         $sessionID = 0;
         switch ($this->component->arParams['MODE']) {
             case 'key':
                 $sessionID = $context['seance']['sessionID'];
                 break;
             case 'competency':
             case 'blank':
                 if (isset($_GET['SESSION_ID'])) {
                     $sessionID = $_GET['SESSION_ID'];
                     $this->component->arResult['sessionID'] = $sessionID;
                 }
                 $sessions = $this->registry->getDbHelper('ProjectsHelper')->getSessionsByProjectID($context['project']['projectID']);
                 $this->component->arResult['sessions'] = $sessions;
                 break;
         }
         $this->component->arResult['project'] = $context['project'];
         $session = array();
         if ($sessionID) {
             $session = $this->registry->getDbHelper('ProjectsHelper')->findSessionById($sessionID);
         }
         $inputParams = array();
         // параметры для фильтрации ветвления
         $finished = false;
         $msddAnswers = array();
         if ($this->component->arParams['MODE'] == 'key' && $_POST["action"] == "save_answers") {
             $BlankDataSource = new \Ecoplay\Model\BlankDataSource($this->registry->getDbConnect(), 0, 0, $context['seance']['seance_key']);
             // собираем все вопросы - ответы
             foreach ($_POST as $question => $answer) {
                 if (preg_match('/^_answer_qt_([0-9]+)$/', $question, $matches)) {
                     $answers[$matches[1]] = $answer;
                 }
                 // textarea
                 if (preg_match('/^_answer_qt_([0-9]+)_an_([0-9]+)$/', $question, $matches)) {
                     if (!array_key_exists($matches[1], $answers)) {
                         $answers[$matches[1]] = array();
                     }
                     $answers[$matches[1]][$matches[2]] = $answer;
                 }
             }
             // если чебурашка, то преобразуем ответы
             $msddDetails = array();
             if (isset($_POST['is_msdd']) && $_POST['is_msdd'] == '1') {
                 $msddAnswers = $answers;
                 $answers = $this->registry->getModel('Blanks')->transformMsddAnswers($answers, $msddDetails);
             }
             // валидируем ответы
             $inputParams = $this->registry->getModel('Blanks')->getSeanceInputParams($context['seance']['seanceID'], $context['project'], $session);
             $inputParams = $this->registry->getModel('Blanks')->extendSeanceInputParamsByCurrentAnswers($inputParams, $answers);
             $answersValid = $this->registry->getModel('Blanks')->validateAnswers($answers, $context['seance'], $inputParams, false, $msddDetails);
             if ($answersValid['status'] == 'error') {
                 $this->component->arResult['have_errors'] = true;
                 $errors = $answersValid['errors'];
             } else {
                 $inputParams = array();
                 // очищаем, чтобы получить для следующего экрана
                 foreach ($answers as $questionID => $answer) {
                     if (is_array($answer)) {
                         foreach ($answer as $kk => $answer1) {
                             if ($answersValid['answersDetails'][$answer1]['type'] == 'textarea') {
                                 $answersValid['answersDetails'][$answer1]['answerID'] = $kk;
                             }
                             $BlankDataSource->addAnswer($context['seance']['seanceID'], $questionID, $answer1, $answersValid['answersDetails'][$answer1], $context['project']['projectID']);
                         }
                     } else {
                         $BlankDataSource->addAnswer($context['seance']['seanceID'], $questionID, $answer, $answersValid['answersDetails'][$answer], $context['project']['projectID']);
                     }
                 }
                 $finished = $answersValid['currentPage'] == $answersValid['pagesCnt'] ? true : false;
                 if ($answersValid['currentPage'] == 1) {
                     // помечаем, что сеанс начали отвечать
                     $this->registry->getDbHelper('BlanksHelper')->setSeanceState($context['seance']['seanceID'], \Ecoplay\Helper\Db\BlanksHelper::SEANCE_STATE_PROGRESS);
                     // добавляем начало заполнения бланка в статистику
                     $this->registry->getModel('Stat')->addSeanceStart($context['seance']['sessionID']);
                 }
                 // добавляем ответы в статистику
                 $this->registry->getModel('Stat')->addAnswers($context['seance']['sessionID'], count($answers));
                 $context['seance']['last_screenID'] = $answersValid['screenID'];
                 $this->registry->getDbHelper('BlanksHelper')->increaseSeanceAnswers($context['seance']['seanceID'], count($answers), $answersValid['screenID']);
                 // проверяем, возможно наступил момент, когда опршиваемому можно сгенерировать отчет
                 //$reportsModel = new Ecoplay\Model\Reports($DB);
                 //$reportsModel->checkGenerationAvailable($seance['stat1_assessID']); // временно отключено из-за тормозов при большом объеме респондентов / вопросов в бланке
                 $this->registry->getDbHelper('SeancesHelper')->setNeedCompetencesRecount($context['seance']['stat1_assessID']);
             }
         }
         $availableLanguages = $this->registry->getDbHelper('TranslationHelper')->getLanguagesByIDs(json_decode($context['project']['~languages']));
         $this->component->arResult['languages'] = $availableLanguages;
         $groupLink = false;
         $hiddenQuestionsData = array();
         // скрытые вопросы, которые могут быть отображены при определенных ответах на другие вопросы с той же страницы
         $member = false;
         switch ($this->component->arParams['MODE']) {
             case 'key':
                 $this->component->arResult['seance'] = $context['seance'];
                 $blank = $this->registry->getDbHelper('BlanksHelper')->findById($context['seance']['blankID']);
                 // обновляем респонденту дату последнего входа
                 $member = $this->registry->getDbHelper('MembersHelper')->findMemberByRespondentID($context['seance']['respondentID']);
                 $this->registry->getDbHelper('MembersHelper')->editRespondent($context['seance']['respondentID'], array('last_entrance' => date('d-m-Y H:i:s')));
                 $this->component->arResult['member'] = $member;
                 $sign = $member['name'] . ' ' . $member['surname'];
                 // обработка языка
                 if (isset($_POST['language']) && array_key_exists(intval($_POST['language']), $availableLanguages)) {
                     $langID = intval($_POST['language']);
                     $this->registry->getDbHelper('MembersHelper')->editMember($member['projects_memberID'], array('langID' => $langID));
                 } else {
                     $langID = $member['langID'];
                 }
                 $this->component->arResult['langID'] = $langID;
                 if (!$finished) {
                     $haveQuestions = false;
                     while (!$haveQuestions) {
                         // поиск текущих вопросов
                         $paginationInfo = $this->registry->getModel('Blanks')->getSeanceScreenData($context['seance']);
                         if (!$paginationInfo) {
                             // какой-то непонятный экран, выкидываем юзера в кабинет
                             LocalRedirect('/enter/' . $member['private_lk_access_key'] . '/');
                         }
                         $questionsOnPageSrc = $this->registry->getDbHelper('BlanksHelper')->getScreenQuestions($paginationInfo['screen_id'], $langID);
                         if (!count($questionsOnPageSrc)) {
                             // на экране вообще нет вопросов, выкидываем юзера в лк
                             LocalRedirect('/enter/' . $member['private_lk_access_key'] . '/');
                         }
                         // тестовое собирание параметров для ветвления
                         //if (!count($inputParams)) { // т.к. могли быть ответы, коорые добавили выполняемых условий
                         $inputParams = $this->registry->getModel('Blanks')->getSeanceInputParams($context['seance']['seanceID'], $context['project'], $session);
                         //}
                         $sortedQuestions = $this->registry->getModel('Blanks')->filterAvailableQuestions($questionsOnPageSrc, $inputParams, false, $context['seance']['blankID']);
                         $questionsOnPage = $sortedQuestions['appropriate'];
                         $hiddenQuestionsData = $this->registry->getModel('Blanks')->getHiddenQuestionsData($sortedQuestions);
                         if (count($questionsOnPage)) {
                             // есть вопросы - выводим
                             $haveQuestions = true;
                         } elseif ($paginationInfo['current_page'] == $paginationInfo['page_count']) {
                             // последняя страница с вопросами (которую скипаем), завершаем заполнение
                             $haveQuestions = true;
                             // условно
                             $finished = true;
                         } else {
                             // обновляем текущий экран бланку
                             $this->registry->getDbHelper('SeancesHelper')->editSeance($context['seance']['seanceID'], array('last_screenID' => $paginationInfo['screen_id']));
                             $context['seance']['last_screenID'] = $paginationInfo['screen_id'];
                         }
                     }
                     // рудимент для генерации ссылок
                     $BlankDataSource = new \Ecoplay\Model\BlankDataSource($this->registry->getDbConnect(), 0, 0, $context['seance']['seance_key']);
                 }
                 break;
             case 'competency':
                 $blank = false;
                 if (!isset($this->component->arParams['COMPETENCY_ID']) || !isset($this->component->arParams['PROJECT_ID'])) {
                     throw new \Exception('Bad component params');
                 }
                 $langID = isset($_SESSION['langID']) ? $_SESSION['langID'] : 1;
                 if (isset($_POST['language']) && array_key_exists(intval($_POST['language']), $availableLanguages)) {
                     $langID = intval($_POST['language']);
                     $_SESSION['langID'] = $langID;
                 }
                 $this->component->arResult['langID'] = $langID;
                 $BlankDataSource = new \Ecoplay\Model\CompetencyDataSource($this->registry->getDbConnect(), $this->component->arParams['COMPETENCY_ID'], $this->component->arParams['PROJECT_ID']);
                 $paginationInfo = $BlankDataSource->getPaginationInfo();
                 $questionsOnPage = $BlankDataSource->getQuestionsOnPage($paginationInfo["current_page"], $langID);
                 break;
             case 'blank':
                 if (!isset($this->component->arParams['BLANK_ID']) || !isset($this->component->arParams['PROJECT_ID'])) {
                     throw new \Exception('Bad component params');
                 }
                 $blank = $this->registry->getDbHelper('BlanksHelper')->findById($this->component->arParams['BLANK_ID']);
                 $langID = isset($_SESSION['langID']) ? $_SESSION['langID'] : 1;
                 if (isset($_POST['language']) && array_key_exists(intval($_POST['language']), $availableLanguages)) {
                     $langID = intval($_POST['language']);
                     $_SESSION['langID'] = $langID;
                 }
                 $this->component->arResult['langID'] = $langID;
                 $BlankDataSource = new \Ecoplay\Model\BlankDataSource($this->registry->getDbConnect(), $this->component->arParams['BLANK_ID'], $this->component->arParams['PROJECT_ID']);
                 $paginationInfo = $BlankDataSource->getPaginationInfo();
                 $questionsOnPage = $BlankDataSource->getQuestionsOnPage($paginationInfo["current_page"], 0, $langID);
                 $groupLink = true;
                 $sign = 'Респондент Тестовый';
                 break;
             default:
                 throw new \Exception('Unknown component mode: ' . $this->component->arParams['MODE']);
                 break;
         }
         $this->component->arResult["groupLink"] = $groupLink;
         $translator = new \Ecoplay\Model\Translation($this->registry->getDbConnect(), $availableLanguages[$langID]['abbr'], $_SERVER["DOCUMENT_ROOT"] . '/lang/', $this->registry);
         $this->component->arResult['translator'] = $translator;
         $projectViewSettings = $context['project']['param_lk'] ? (array) json_decode($context['project']['~param_lk']) : array();
         $this->component->arResult['projectViewSettings'] = $projectViewSettings;
         $context['APPLICATION']->IncludeComponent("ecoplay:front.header", '', array('TRANSLATOR' => $translator, 'MODE' => 'blank', 'MEMEBER_KEY' => $member['private_lk_access_key'], 'SETTINGS' => array_merge($projectViewSettings, array('name' => $member['name'] . ' ' . $member['surname'])), 'ADDON_CSS' => isset($session['myCSS_path']) ? $session['myCSS_path'] : ($context['project']['myCSS_path'] ? $context['project']['myCSS_path'] : ''), 'TEXT' => ''));
         if (!$finished) {
             // вывод бланка
             $this->component->arResult["BlankDataSource"] =& $BlankDataSource;
             $this->component->arResult["pagination_info"] = $paginationInfo;
             $this->component->arResult["blank_view_type"] = $this->component->arParams['MODE'];
             $this->component->arResult['have_hidden'] = count($hiddenQuestionsData['controllIDs']) ? true : false;
             $this->component->arResult['hide_assess_hint'] = $blank && $blank['hide_assess_hint'] ? true : false;
             if (isset($projectViewSettings['show_name_in_header']) && $projectViewSettings['show_name_in_header']) {
                 $this->component->arResult["assess"] = $BlankDataSource->ocenivaemy['name'] . ' ' . $BlankDataSource->ocenivaemy['surname'];
             }
             $this->component->IncludeComponentTemplate("before");
             $grouppedQuestions = array('visible' => $questionsOnPage, 'hidden' => $hiddenQuestionsData['hidden']);
             # 1. ГРУППИРУЕМ вопросы на блоки
             $questionsBlocks = array();
             $haveRealBlock = false;
             foreach ($grouppedQuestions as $group => $questions) {
                 foreach ($questions as $question) {
                     if ($question['blockID']) {
                         $question['visible'] = $group == 'visible' ? true : false;
                         $question['is_controll'] = in_array($question['questionID'], $hiddenQuestionsData['controllIDs']) ? true : false;
                         if (!array_key_exists($question['blockID'], $questionsBlocks)) {
                             // такой группы еще нет
                             $blockInfo = $this->registry->getDbHelper('BlanksHelper')->findBlockById($question['blockID']);
                             $block = array('question_type' => $question['question_type'], 'questions' => array($question), 'questions_ids' => array($question['questionID']), 'params' => (array) json_decode($blockInfo['~params']));
                             if (in_array($question['question_type'], array('radio', 'checkbox'))) {
                                 // идентичность ответов
                                 $answersNames = array();
                                 foreach ($question['answers'] as $answer) {
                                     $answersNames[] = $answer['name'];
                                 }
                                 $block['answers_string'] = implode(';', $answersNames);
                             }
                             $questionsBlocks[$question['blockID']] = $block;
                         } else {
                             // группа уже есть, проверяем, чтобы подходили под ее условия
                             $block = $questionsBlocks[$question['blockID']];
                             if ($question['question_type'] == $questionsBlocks[$question['blockID']]['question_type']) {
                                 // группировать можно только вопросы одного типа
                                 if (in_array($question['question_type'], array('radio', 'checkbox'))) {
                                     // идентичность ответов
                                     $answersNames = array();
                                     foreach ($question['answers'] as $answer) {
                                         $answersNames[] = $answer['name'];
                                     }
                                     $answersString = implode(';', $answersNames);
                                     if ($questionsBlocks[$question['blockID']]['answers_string'] == $answersString) {
                                         $questionsBlocks[$question['blockID']]['questions'][] = $question;
                                         $questionsBlocks[$question['blockID']]['questions_ids'][] = $question['questionID'];
                                         $haveRealBlock = true;
                                     }
                                 } else {
                                     $questionsBlocks[$question['blockID']]['questions'][] = $question;
                                     $questionsBlocks[$question['blockID']]['questions_ids'][] = $question['questionID'];
                                     $haveRealBlock = true;
                                 }
                             }
                         }
                     }
                 }
             }
             if ($haveRealBlock) {
                 $this->component->IncludeComponentTemplate("block_script");
             }
             # 2. ВЫВОДИМ вопросы
             $doneBlocks = array();
             // блоки, которые уже были выведены
             foreach ($grouppedQuestions as $group => $questions) {
                 foreach ($questions as $question) {
                     $show = false;
                     if ($question['blockID'] && count($questionsBlocks[$question['blockID']]['questions']) > 0 && in_array($question['questionID'], $questionsBlocks[$question['blockID']]['questions_ids'])) {
                         // вывод в блоке
                         if (!in_array($question['blockID'], $doneBlocks)) {
                             $show = true;
                             $contextParams = $this->registry->getModel('Blanks')->getContextParams($context['project'], $session, $context['seance'], $member);
                             $blockQuestions = $questionsBlocks[$question['blockID']]['questions'];
                             foreach ($blockQuestions as $key => $blockQuestion) {
                                 $blockQuestions[$key]['~name'] = $this->registry->getModel('Blanks')->prepareQuestionName($blockQuestion['~name'], $contextParams);
                                 foreach ($blockQuestion['answers'] as $aKey => $answer) {
                                     $blockQuestions[$key]['answers'][$aKey]['~name'] = $this->registry->getModel('Blanks')->prepareQuestionName($answer['~name'], $contextParams);
                                 }
                             }
                             // вывод блока
                             $param_array = array("questions" => $blockQuestions, "blockParams" => $questionsBlocks[$question['blockID']]['params'], "mode" => 'block', 'errors' => array(), 'values' => array(), 'lang' => $availableLanguages[$langID]['abbr'], 'alternation' => $context['project']['blank_group_alternation'], 'msddAnswers' => $msddAnswers);
                             foreach ($questionsBlocks[$question['blockID']]['questions_ids'] as $questionID) {
                                 if (array_key_exists($questionID, $errors)) {
                                     $param_array['errors'][$questionID] = $errors[$questionID];
                                 }
                                 if (!array_key_exists($questionID, $errors) && array_key_exists($questionID, $answers)) {
                                     $param_array['values'][$questionID] = $answers[$questionID];
                                 }
                             }
                             $questionType = $questionsBlocks[$question['blockID']]['question_type'];
                             $doneBlocks[] = $question['blockID'];
                         }
                     } else {
                         $show = true;
                         $questionType = $question["question_type"];
                         $contextParams = $this->registry->getModel('Blanks')->getContextParams($context['project'], $session, $context['seance'], $member);
                         $question['~name'] = $this->registry->getModel('Blanks')->prepareQuestionName($question['~name'], $contextParams);
                         foreach ($question['answers'] as $key => $answer) {
                             $question['answers'][$key]['~name'] = $this->registry->getModel('Blanks')->prepareQuestionName($answer['~name'], $contextParams);
                         }
                         $param_array = array("BlankDataSource" => &$BlankDataSource, "question" => $question, "question_params" => json_decode($question['~params'], true), 'error' => array_key_exists($question['questionID'], $errors) ? $errors[$question['questionID']] : false, 'value' => !array_key_exists($question['questionID'], $errors) && array_key_exists($question['questionID'], $answers) ? $answers[$question['questionID']] : false, 'lang' => $availableLanguages[$langID]['abbr'], 'is_controll' => in_array($question['questionID'], $hiddenQuestionsData['controllIDs']) ? true : false, 'visible' => $group == 'visible' ? true : false);
                     }
                     if ($show) {
                         switch ($questionType) {
                             case 'radio':
                                 $context['APPLICATION']->IncludeComponent("ecoplay:behavior.questions.radio", "", $param_array);
                                 break;
                             case 'checkbox':
                                 $context['APPLICATION']->IncludeComponent("ecoplay:behavior.questions.checkbox", "", $param_array);
                                 break;
                             case 'text':
                                 $context['APPLICATION']->IncludeComponent("ecoplay:behavior.questions.text", "", $param_array);
                                 break;
                             case 'textarea':
                                 $context['APPLICATION']->IncludeComponent("ecoplay:behavior.questions.textarea", "", array_merge($param_array, array('is_signed' => false)));
                                 break;
                             case 'textarea_signed':
                                 $context['APPLICATION']->IncludeComponent("ecoplay:behavior.questions.textarea", "", array_merge($param_array, array('is_signed' => true, 'sign' => $sign)));
                                 break;
                             case 'html':
                                 $context['APPLICATION']->IncludeComponent("ecoplay:behavior.questions.html", "", $param_array);
                                 break;
                             case 'dichotomy':
                                 $context['APPLICATION']->IncludeComponent("ecoplay:behavior.questions.dichotomy", "", $param_array);
                                 break;
                             default:
                                 throw new \Exception('При импорте вопроса был задан неизвестный тип вопроса: "' . $questionType . '"');
                                 break;
                         }
                     }
                 }
             }
             // buttons at the end
             $this->component->IncludeComponentTemplate("after");
         } else {
             $this->registry->getModel('Blanks')->finishSeance($context['seance']['seanceID']);
             $this->component->IncludeComponentTemplate("success");
         }
         $context['APPLICATION']->IncludeComponent("ecoplay:front.footer", '', array('TRANSLATOR' => $translator, 'SETTINGS' => $projectViewSettings));
         $this->registry->getDbConnect()->Commit();
     } catch (\Exception $e) {
         $this->component->arResult['error'] = $e->getMessage();
         $this->component->IncludeComponentTemplate("error");
     }
 }