Skip to content

Instantly share code, notes, and snippets.

@hackimov
Last active May 16, 2022 16:09
Show Gist options
  • Save hackimov/51b0f54a4e1baf9bac64eee88bab71b2 to your computer and use it in GitHub Desktop.
Save hackimov/51b0f54a4e1baf9bac64eee88bab71b2 to your computer and use it in GitHub Desktop.
Main Ui Grid + Cform Result
<?php
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
# указываем ID формы с которой будем работать
$FORM_ID = 23;
global $APPLICATION;
# подключаем стили
//require_once("css_include.php");
\CJSCore::init("sidepanel");
# указываем заголовок страницы
$APPLICATION->SetTitle("Анкеты соискателей");
# указываем ссылки на объекты классы которых будем использовать
use \Bitrix\Iblock\PropertyEnumerationTable;
use Bitrix\Main\Grid\Options as GridOptions;
use Bitrix\Main\UI\PageNavigation;
# массив групп, которые в которых нужно проверить доступность пользователя
# 1 Пользователи с Админкой, 8 Отдел кадров, 9 Руководство
$arGroupAvalaible = array(1,8,9);
# массив групп, в которых состоит пользователь
$arGroups = CUser::GetUserGroup($USER->GetID());
# далее проверяем, если пользователь вошёл хотя бы в одну из групп, то позволяем ему что-либо делать
$result_intersect = array_intersect($arGroupAvalaible, $arGroups);
if(!empty($result_intersect))
{
?>
<!-- это важная таблица! -->
<!-- <div class="page-header"> -->
<!-- <div class="pagetitle-wrap "> -->
<!-- тут находится фоновый див -->
<!-- <div class="back"> -->
<?
# подключим стили битрикса
Bitrix\Main\Page\Asset::getInstance()->addCss('/bitrix/css/main/grid/webform-button.css');
Bitrix\Main\Page\Asset::getInstance()->addCss('/bitrix/js/intranet/intranet-common.css');
# подключим модуль Сform
CModule::IncludeModule('form');
##############################################################################
######################### ОБРАБОТКА УДАЛЕНИЯ ############################
##############################################################################
# проверяем приходит ли реквест операции и ID и id
if(isset($_REQUEST["op"]) && $_REQUEST["id"])
{ # проверяем если к нам пришла операция делет
if ($_REQUEST["op"] === "delete")
{
CFormResult::Delete($_REQUEST["id"], "N");
}
}
##############################################################################
##############################################################################
##############################################################################
# тут мы указываем название нашего грида
$list_id = 'example_list';
# создаём объект с настройками для грида
$grid_options = new GridOptions($list_id);
# указываем сортировку грида по полям
$sort = $grid_options->GetSorting(['sort' => ['DATE_CREATE' => 'DESC'], 'vars' => ['by' => 'by', 'order' => 'order']]);
# получаем параметры навигации для грида
$nav_params = $grid_options->GetNavParams();
#создаем объект навигации
$nav = new PageNavigation($list_id);
# отключаем кнопку все записи
$nav->allowAllRecords(true)
# устанавливаем размер страницы
->setPageSize($nav_params['nPageSize'])
->initFromUri();
# указываем гриду сколько записей у него есть
$nav->setRecordCount($rowcount);
# в массиве $nav_params['nPageSize'] хранится кол-во выводимых строк на странице
$nav->setPageSize($nav_params['nPageSize']);
$nav_params['iNumPage'] = $nav->getCurrentPage();
# фильтр по направлению сортировки для гетлиста
foreach ($sort["sort"] as $key=>$value)
{
$string = $key;
$string = mb_strtolower($string);
$by = "s_$string";
$order = $value;
}
# тут задаем параметры фильтра для грида
$ui_filter = [
['id' => 'DATE_CREATE', 'name' => 'Дата создания', 'type'=>'date', 'default' => true],
['id' => 'STATUS_TITLE', 'name' => 'Статус заявки', 'type'=>'list', 'default' => true, 'items' =>
[
'' => 'Любой',
'89' => 'Заявка не обработана',
'90' => 'Отказ, созвонились с кандидатом',
'91' => 'Назначено собеседование',
'92' => 'Собеседование проведено, соискатель в состоянии ожидания ответа',
'93' => 'Кандидат рассмотрен отделом кадров (отказ)',
'94' => 'Не дозвонились до соискателя',
'95' => 'Отказ, устаревшая заявка',
'96' => 'Встреча, передача тестового задания',
'97' => 'Отказ, соискатель не интересен',
'98' => 'Тестовое задание отправлено по электронной почте',
'99' => 'Соискатель не явился на собеседование',
'100' => 'Встреча, передача данных в отдел кадров',
'101' => 'Сотрудник в штате компании',
'102' => 'Связаться позже',
'103' => 'Заявка на рассмотрении',
'104' => 'Предложена другая вакансия',
'105' => 'На стажировке',
'106' => 'На рассмотрении'
],
'params' => ['multiple' => 'Y']],
['id' => 'LASTNAME', 'name' => 'Фамилия', 'type'=>'text', 'default' => true],
['id' => 'NAME', 'name' => 'Имя', 'type'=>'text', 'default' => true],
['id' => 'FATHERNAME', 'name' => 'Отчество', 'type'=>'text', 'default' => true],
['id' => 'PhoneSOIS', 'name' => 'Телефон', 'type'=>'text', 'default' => true],
['id' => 'emailSOIS', 'name' => 'Е-маил', 'type'=>'text', 'default' => true],
['id' => 'BirthdaySOIS', 'name' => 'Дата Рождения', 'type'=>'date', 'default' => true],
['id' => 'gender', 'name' => 'Пол', 'type'=>'list', 'default' => true, 'items' => ['male' => 'Мужской', 'female' => 'Женский']],
['id' => 'selectedVacancieSOIS', 'name' => 'Выбранная вакансия', 'type'=>'text', 'default' => true],
['id' => 'TypeeduSOIS', 'name' => 'Образование', 'type'=>'list', 'default' => true, 'items' => ['Школа' => 'Школа', 'Колледж или ПТУ' => 'Колледж или ПТУ', 'Незаконченное высшее' => 'Незаконченное высшее', 'Высшее - бакалавр' => 'Высшее - бакалавр', 'Полное высшее или магистратура' => 'Полное высшее или магистратура', ]],
];
# с этого момента запускается отложенное действие
$this->SetViewTarget("inside_pagetitle", 100); #inside_pagetitle #pagetitle?>
<div class="pagetitle-container pagetitle-flexible-space job-filter">
<?
$APPLICATION->IncludeComponent('bitrix:main.ui.filter', '', [
'FILTER_ID' => $list_id,
'GRID_ID' => $list_id,
'FILTER' => $ui_filter,
'ENABLE_LIVE_SEARCH' => false,
'ENABLE_LABEL' => true
]);
?>
</div>
<?
# тут заканчивается отложенное действие
$this->EndViewTarget();
$filterOption = new Bitrix\Main\UI\Filter\Options($list_id);
$filterData = $filterOption->getFilter([]);
foreach ($filterData as $k => $v)
{
$filter_grid[$k] = $v;
$str_find = "%".$filterData['FIND']."%";
}
# формируем сам фильтр
$filter_UI["FIELDS"] = $filter_grid;
############## формируем фильтр по статусам ##############
# удаляем пустые элементы массива если такие есть
$new_noempty_arr = array_diff($filter_UI["FIELDS"]["STATUS_TITLE"], array('', NULL, false));
# запихиваем массив со статусами непосредственно в фильтр
$filter["STATUS_ID"] = implode("|", $new_noempty_arr);
##########################################################
# чистим массив
unset($filter["FIELDS"]["PRESET_ID"]);
unset($filter["FIELDS"]["FILTER_ID"]);
unset($filter["FIELDS"]["FILTER_APPLIED"]);
unset($filter["FIELDS"]["FIND"]);
unset($filter["FIELDS"]["DATE_CREATE_datesel"]);
unset($filter["FIELDS"]["BirthdaySOIS_datesel"]);
# тут мы фильтруем по диапазону дат создания
$filter["DATE_CREATE_1"] = $filter_UI["FIELDS"]["DATE_CREATE_from"];
$filter["DATE_CREATE_2"] = $filter_UI["FIELDS"]["DATE_CREATE_to"];
unset($filter_UI["FIELDS"]["DATE_CREATE_from"]);
unset($filter_UI["FIELDS"]["DATE_CREATE_to"]);
# закончили фильтрацию и почистили за собой массив
if(!empty($filterData['FIND']))
{
$filter_UI["FIELDS"]["LASTNAME"] = $str_find;
}
# тут мы делаем фильтрацию по точным совпадениям значений
$arFields[] = [
"CODE" => "LastnameSOIS",
"FILTER_TYPE" => "text",
"PARAMETER_NAME" => "USER",
"VALUE" => $filter_UI["FIELDS"]["LASTNAME"],
"EXACT_MATCH" => "N"
];
$arFields[] = [
"CODE" => "NameSOIS",
"FILTER_TYPE" => "text",
"PARAMETER_NAME" => "USER",
"VALUE" => $filter_UI["FIELDS"]["NAME"],
"EXACT_MATCH" => "N"
];
$arFields[] = [
"CODE" => "2nameSOIS",
"FILTER_TYPE" => "text",
"PARAMETER_NAME" => "USER",
"VALUE" => $filter_UI["FIELDS"]["FATHERNAME"],
"EXACT_MATCH" => "N"
];
$arFields[] = [
"CODE" => "PhoneSOIS",
"FILTER_TYPE" => "text",
"PARAMETER_NAME" => "USER",
"VALUE" => $filter_UI["FIELDS"]["PhoneSOIS"],
"EXACT_MATCH" => "N"
];
$arFields[] = [
"CODE" => "emailSOIS",
"FILTER_TYPE" => "text",
"PARAMETER_NAME" => "USER",
"VALUE" => $filter_UI["FIELDS"]["emailSOIS"],
"EXACT_MATCH" => "N"
];
$arFields[] = [
"CODE" => "selectedVacancieSOIS",
"FILTER_TYPE" => "text",
"PARAMETER_NAME" => "USER",
"VALUE" => $filter_UI["FIELDS"]["selectedVacancieSOIS"],
"EXACT_MATCH" => "N"
];
# тут фильтрация по полу
$arFields[] = [
"CODE" => "gender",
"FILTER_TYPE" => "text",
"PARAMETER_NAME" => "ANSWER_VALUE",
"VALUE" => $filter_UI["FIELDS"]["gender"],
"EXACT_MATCH" => "Y"
];
# тут фильтрация по образованию
$arFields[] = [
"CODE" => "TypeeduSOIS",
"FILTER_TYPE" => "text",
"PARAMETER_NAME" => "ANSWER_TEXT",
"VALUE" => $filter_UI["FIELDS"]["TypeeduSOIS"],
"EXACT_MATCH" => "N"
];
# тут поля фильтрации по интервалам дат рождения
$arFields[] = [
"CODE" => "BirthdaySOIS",
"FILTER_TYPE" => "date",
"PARAMETER_NAME" => "USER",
"VALUE" => $filter_UI["FIELDS"]["BirthdaySOIS_from"],
"PART" => "1"
];
$arFields[] = [
"CODE" => "BirthdaySOIS",
"FILTER_TYPE" => "date",
"PARAMETER_NAME" => "USER",
"VALUE" => $filter_UI["FIELDS"]["BirthdaySOIS_to"],
"PART" => "2"
];
# закончили фильтрацию по интервалам дат
# присвоили сформировали фильтр и присвоили его куда надо
$filter["FIELDS"] = $arFields;
##############################################################################
####### хитрый блок пагинации (получение строк по состоянию текущей) #########
##############################################################################
# делаем гетлист и запихиваем все существующие ID в $arID
$formResult = CFormResult::GetList($FORM_ID,$by, $order, $filter, $is_filter,"Y");
while ($arIDRes = $formResult->Fetch())
{
$arID[] = $arIDRes['ID'];
}
$rowcount = count($arID);
$nav->setRecordCount($rowcount);
# кол-во строк отображаемых в выводе
$row_count = $nav_params['nPageSize'];
# получаем номер текуей страницы
$current_page = $nav_params['iNumPage'];
$current_page = $current_page - 1;
# умножаем кол-во выводимых на странице записей на кол-во страниц
# получаем номер строки старта фильтра
$start_rows = $row_count * $current_page;
# получаем номер строки конца фильтра
$end_rows = $start_rows + $row_count;
# запихиваем нужные нам строки из общего массива, в массив строк страницы
for ($i = $start_rows; $i <= $end_rows; $i++) {
$arPagination[] = $arID[$i];;
}
# делаем понятный для формы фильтр по ID
$id_filter = implode("|", $arPagination);
# Формируем фильтр
$filter["ID"] = "$id_filter";
##############################################################################
##############################################################################
##############################################################################
# тут вывод даных на страницу
$columns = [];
$columns[] = ['id' => 'ID', 'name' => 'ID', 'sort' => 'ID', 'default' => true];
$columns[] = ['id' => 'LASTNAME', 'name' => 'Фамилия', 'sort' => 'LASTNAME', 'default' => true];
$columns[] = ['id' => 'NAME', 'name' => 'Имя', 'sort' => 'NAME', 'default' => true];
$columns[] = ['id' => 'FATHERNAME', 'name' => 'Отчество', 'sort' => 'FATHERNAME', 'default' => true];
$columns[] = ['id' => 'STATUS_TITLE', 'name' => 'Статус заявки', 'sort' => 'STATUS_TITLE', 'default' => true];
$columns[] = ['id' => 'DATE_CREATE', 'name' => 'Создано', 'sort' => 'DATE_CREATE', 'default' => true];
$columns[] = ['id' => 'TypeeduSOIS', 'name' => 'Образование', 'sort' => 'TypeeduSOIS', 'default' => true];
$columns[] = ['id' => 'BirthdaySOIS', 'name' => 'Дата Рождения', 'sort' => 'BirthdaySOIS', 'default' => true];
$columns[] = ['id' => 'PhoneSOIS', 'name' => 'Телефон', 'sort' => 'PhoneSOIS', 'default' => true];
$columns[] = ['id' => 'emailSOIS', 'name' => 'Е-маил', 'sort' => 'emailSOIS', 'default' => true];
$columns[] = ['id' => 'NameeduSOIS', 'name' => 'Учебное заведение, год окончания, специальность:', 'sort' => 'NameeduSOIS', 'default' => true];
$columns[] = ['id' => 'profeduSOIS', 'name' => 'Профессиональные знания', 'sort' => 'profeduSOIS', 'default' => true];
$columns[] = ['id' => 'departmentSOIS', 'name' => 'В каких сферах деятельности Вы хотели бы работать:', 'sort' => 'departmentSOIS', 'default' => true];
$columns[] = ['id' => 'lostlevelSOIS', 'name' => 'Должностные обязанности', 'sort' => 'lostlevelSOIS', 'default' => true];
$columns[] = ['id' => 'priceSOIS', 'name' => 'Желаемый минимальный уровень зарплаты', 'sort' => 'priceSOIS', 'default' => true];
# получение списка записей
$rsResults = CFormResult::GetList($FORM_ID, $by, $order, $filter, $is_filter,"Y", $row_count);
while ($arResult = $rsResults->Fetch())
{
# получим данные по всем вопросам
$arAnswer = CFormResult::GetDataByID($arResult['ID'],array(),$null,$null);
//echo"<pre>";print_r($arAnswer);echo"</pre>";
/*
$rsAnswer = CFormAnswer::GetByID(159);
$arrAnswer = $rsAnswer->Fetch();
//echo "<pre>"; print_r($arrAnswer); echo "</pre";
$plassmass = ["ID" => "153", "FIELD_PARAM" => "checked class=\"inputradio\""];
//$data = CForm::GetCheckBoxValue("TypeeduSOIS", false, false);
$arAnswerr = array("ID" => 153,);
$arrVALUES = CFormResult::GetDataByIDForHTML($arResult['ID'], "N");
$value = CForm::GetRadioValue($QUESTION_SID, $arAnswerr, $arrVALUES);
*/
/*
CForm::GetResultAnswerArray($arResult['ID'],array &columns,array &answers, array &answers2 = array(),array filter = array(),
)
*/
//echo "<pre>"; print_r($value); echo "</pre";
$list[] = [
'data' => [
"ID" => $arResult['ID'],
"LASTNAME" => $arAnswer["LastnameSOIS"][0]["USER_TEXT"],
"NAME" => $arAnswer["NameSOIS"][0]["USER_TEXT"],
"FATHERNAME" => $arAnswer["2nameSOIS"][0]["USER_TEXT"],
"STATUS_TITLE" => $arResult['STATUS_TITLE'],
"DATE_CREATE" => $arResult['DATE_CREATE'],
"TypeeduSOIS" => $arAnswer['TypeeduSOIS'][0]["ANSWER_TEXT"],
"BirthdaySOIS" => $arAnswer["BirthdaySOIS"][0]["USER_TEXT"],
"PhoneSOIS" => $arAnswer["PhoneSOIS"][0]["USER_TEXT"],
"emailSOIS" => $arAnswer["emailSOIS"][0]["USER_TEXT"],
"NameeduSOIS" => $arAnswer["NameeduSOIS"][0]["USER_TEXT"],
"profeduSOIS" => $arAnswer["profeduSOIS"][0]["USER_TEXT"],
"departmentSOIS" => $arAnswer["departmentSOIS"][0]["ANSWER_TEXT"],
"lostlevelSOIS" => $arAnswer["lostlevelSOIS"][0]["USER_TEXT"],
"priceSOIS" => $arAnswer["priceSOIS"][0]["USER_TEXT"],
],
'actions' => [
[
'text' => 'Просмотреть',
'default' => true,
'onclick' => 'BX.SidePanel.Instance.open("/job/detail.php?RESULT_ID='.$arResult['ID'].'")'
],
[
'text' => 'Изменить',
'default' => true,
'onclick' => 'BX.SidePanel.Instance.open("/job/seeker_edit.php?RESULT_ID='.$arResult['ID'].'")'
],
/*[
'text' => 'Распечатать',
'default' => true,
'onclick' => 'location.href="word.php?WORD_ID='.$arResult['ID'].'"'
],*/
[
'text' => 'Удалить',
'default' => true,
'onclick' => 'if(confirm("Точно?")){document.location.href="?op=delete&id='.$arResult['ID'].'"}'
]
]
];
}
?>
<?php
$APPLICATION->IncludeComponent(
"bitrix:main.ui.grid",
".default",
array(
"GRID_ID" => $list_id,
"COLUMNS" => $columns,
"ROWS" => $list,
"SHOW_ROW_CHECKBOXES" => false,
"NAV_OBJECT" => $nav,
"AJAX_MODE" => "Y",
"AJAX_ID" => \CAjax::getComponentID("bitrix:main.ui.grid",".default",""),
"PAGE_SIZES" => array(
["NAME" => "100","VALUE"=>"100"],
["NAME" => "75","VALUE"=>"75"],
["NAME" => "50","VALUE"=>"50"],
["NAME" => "25","VALUE"=>"25"],
),
"AJAX_OPTION_JUMP" => "N",
"SHOW_CHECK_ALL_CHECKBOXES" => false,
"SHOW_ROW_ACTIONS_MENU" => true,
"SHOW_GRID_SETTINGS_MENU" => true,
"SHOW_NAVIGATION_PANEL" => true,
"SHOW_PAGINATION" => true,
"SHOW_SELECTED_COUNTER" => false,
"SHOW_TOTAL_COUNTER" => true,
"TOTAL_ROWS_COUNT" => $rowcount,
"SHOW_PAGESIZE" => true,
"SHOW_ACTION_PANEL" => true,
"ALLOW_COLUMNS_SORT" => true,
"ALLOW_COLUMNS_RESIZE" => true,
"ALLOW_HORIZONTAL_SCROLL" => true,
"ALLOW_SORT" => true,
"ALLOW_PIN_HEADER" => true,
"AJAX_OPTION_HISTORY" => "N",
"COMPONENT_TEMPLATE" => ".default",
"COMPOSITE_FRAME_MODE" => "A",
"COMPOSITE_FRAME_TYPE" => "DYNAMIC_WITH_STUB",
),
false
);
?>
<?}else{?>
<p style="color:#ff0000">
<br>
Доступ Зарещен!
</p>
<?}?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment