<commit_before><?php

namespace DigitalWand\AdminHelper\Helper;

use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Entity\DataManager;
use Bitrix\Main\DB\Result;
use DigitalWand\AdminHelper\EntityManager;

Loc::loadMessages(__FILE__);

/**
 * Базовый класс для реализации страницы списка админки.
 * При создании своего класса необходимо переопределить следующие переменные:
 * <ul>
 * <li> static protected $model </Li>
 * </ul>
 *
 * Этого будет дастаточно для получения минимальной функциональности
 * Также данный класс может использоваться для отображения всплывающих окон с возможностью выбора элемента из списка
 *
 * @see AdminBaseHelper::$model
 * @see AdminBaseHelper::$module
 * @see AdminBaseHelper::$editViewName
 * @see AdminBaseHelper::$viewName
 * @package AdminHelper
 *
 * @author <NAME> <<EMAIL>>
 * @author <NAME> <<EMAIL>>
 */
abstract class AdminListHelper extends AdminBaseHelper
{
	const OP_GROUP_ACTION = 'AdminListHelper::__construct_groupAction';
	const OP_ADMIN_VARIABLES_FILTER = 'AdminListHelper::prepareAdminVariables_filter';
	const OP_ADMIN_VARIABLES_HEADER = 'AdminListHelper::prepareAdminVariables_header';
	const OP_GET_DATA_BEFORE = 'AdminListHelper::getData_before';
	const OP_ADD_ROW_CELL = 'AdminListHelper::addRowCell';
	const OP_CREATE_FILTER_FORM = 'AdminListHelper::createFilterForm';
	const OP_CHECK_FILTER = 'AdminListHelper::checkFilter';
	const OP_EDIT_ACTION = 'AdminListHelper::editAction';

	/**
	 * @var bool
	 * Выводить кнопку экспорта в Excel
	 * @api
	 */
	protected $exportExcel = true;
	/**
	 * @var bool
	 * Выводить в списке кол-во элементов пункт Все
	 */
	protected $showAll = true;
	/**
	 * @var bool
	 * Является ли список всплывающим окном для выбора элементов из списка.
	 * В этой версии не должно быть операций удаления/перехода к редактированию.
	 */
	protected $isPopup = false;
	/**
	 * @var string
	 * Название поля, в котором хранится результат выбора во всплывающем окне
	 */
	protected $fieldPopupResultName = '';
	/**
	 * @var string
	 * Уникальный индекс поля, в котором хранится результат выбора во всплывающем окне
	 */
	protected $fieldPopupResultIndex = '';
	protected $sectionFields = array();
	/**
	 * @var string
	 * Название столбца, в котором хранится название элемента
	 */
	protected $fieldPopupResultElTitle = '';
	/**
	 * @var string
	 * Название функции, вызываемой при даблклике на строке списка, в случае, если список выводится в режиме
	 *     всплывающего окна
	 */
	protected $popupClickFunctionName = 'selectRow';
	/**
	 * @var string
	 * Код функции, вызываемой при клике на строке списка
	 * @see AdminListHelper::genPipupActionJS()
	 */
	protected $popupClickFunctionCode;
	/**
	 * @var array
	 * Массив с заголовками таблицы
	 * @see \CAdminList::AddHeaders()
	 */
	protected $arHeader = array();
	/**
	 * @var array
	 * параметры фильтрации списка в классическим битриксовом формате
	 */
	protected $arFilter = array();
	/**
	 * @var array
	 * Массив, хранящий тип фильтра для данного поля. Позволяет избежать лишнего парсинга строк.
	 */
	protected $filterTypes = array();
	/**
	 * @var array
	 * Поля, предназначенные для фильтрации
	 * @see \CAdminList::InitFilter();
	 */
	protected $arFilterFields = array();
	/**
	 * Список полей, для которых доступна фильтрация
	 * @var array
	 * @see \CAdminFilter::__construct();
	 */
	protected $arFilterOpts = array();
	/**
	 * @var \CAdminList
	 */
	protected $list;
	/**
	 * @var string
	 * Префикс таблицы. Нужен, чтобы обеспечить уникальность относительно других админ. интерфейсов.
	 * Без его добавления к конструктору таблицы повычается вероятность, что возникнет конфликт с таблицей из другого
	 * административного интерфейса, в результате чего неправильно будет работать паджинация, фильтрация. Вероятны
	 * ошибки запросов к БД.
	 */
	static protected $tablePrefix = "digitalwand_admin_helper_";
	/**
	 * @var array
	 * @see \CAdminList::AddGroupActionTable()
	 */
	protected $groupActionsParams = array();
	/**
	 * Текущие параметры пагинации,
	 * требуются для составления смешанного списка разделов и элементов
	 * @var array
	 */
	protected $navParams = array();
	/**
	 * Количество элементов смешанном списке
	 * @see AdminListHelper::CustomNavStart
	 * @var int
	 */
	protected $totalRowsCount = 0;
	/**
	 * Массив для слияния столбцов элементов и разделов
	 * @var array
	 */
	protected $tableColumnsMap = array();
	/**
	 * @var string
	 * HTML верхней части таблицы
	 * @api
	 */
	public $prologHtml;

	/**
	 * @var string
	 * HTML нижней части таблицы
	 * @api
	 */
	public $epilogHtml;

	/**
	 * Производится инициализация переменных, обработка запросов на редактирование
	 *
	 * @param array $fields
	 * @param bool $isPopup
	 * @throws \Bitrix\Main\ArgumentException
	 */
	public function __construct(array $fields, $isPopup = false)
	{
		$this->isPopup = $isPopup;

		if ($this->isPopup) {
			$this->fieldPopupResultName = preg_replace("/[^a-zA-Z0-9_:\\[\\]]/", "", $_REQUEST['n']);
			$this->fieldPopupResultIndex = preg_replace("/[^a-zA-Z0-9_:]/", "", $_REQUEST['k']);
			$this->fieldPopupResultElTitle = $_REQUEST['eltitle'];
		}

		parent::__construct($fields);

		$this->restoreLastGetQuery();
		$this->prepareAdminVariables();

		$className = static::getModel();
		$oSort = new \CAdminSorting($this->getListTableID(), $this->pk(), "desc");
		$this->list = new \CAdminList($this->getListTableID(), $oSort);
		$this->list->InitFilter($this->arFilterFields);

		if ($this->list->EditAction() AND $this->hasWriteRights()) {
			global $FIELDS;
			foreach ($FIELDS as $id => $fields) {
				if (!$this->list->IsUpdated($id)) {
					continue;
				}
				$this->editAction($id, $fields);
			}
		}
		if ($IDs = $this->list->GroupAction() AND $this->hasWriteRights()) {
			if ($_REQUEST['action_target'] == 'selected') {
				$this->setContext(AdminListHelper::OP_GROUP_ACTION);
				$IDs = array();

				//Текущий фильтр должен быть модифицирован виждтами
				//для соответствия результатов фильтрации тому, что видит пользователь в интерфейсе.
				$raw = array(
					'SELECT' => $this->pk(),
					'FILTER' => $this->arFilter,
					'SORT' => array()
				);

				foreach ($this->fields as $code => $settings) {
					$widget = $this->createWidgetForField($code);
					$widget->changeGetListOptions($this->arFilter, $raw['SELECT'], $raw['SORT'], $raw);
				}

				$res = $className::getList(array(
					'filter' => $this->arFilter,
					'select' => array($this->pk()),
				));

				while ($el = $res->Fetch()) {
					$IDs[] = $el[$this->pk()];
				}
			}

			$filteredIDs = array();

			foreach ($IDs as $id) {
				if (strlen($id) <= 0) {
					continue;
				}
				$filteredIDs[] = IntVal($id);
			}
			$this->groupActions($IDs, $_REQUEST['action']);
		}
		if (isset($_REQUEST['action']) || isset($_REQUEST['action_button']) && count($this->getErrors()) == 0 ) {
			$listHelperClass = $this->getHelperClass(AdminListHelper::className());
			$className = $listHelperClass::getModel();
			$id = isset($_GET['ID']) ? $_GET['ID'] : null;
			$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : $_REQUEST['action_button'];
			if($action!='edit' && $_REQUEST['cancel'] != 'Y'){
				$params = $_GET;
				unset($params['action']);
				unset($params['action_button']);
				$this->customActions($action, $id);
				$sectionEditHelperClass = $this->getHelperClass(AdminSectionEditHelper::className());

				if ($sectionEditHelperClass) {
					$element = $className::getById($id)->Fetch();
					$sectionField = $listHelperClass::getSectionField();
					if ($element[$sectionField]) {
						$params['ID'] = $element[$sectionField];
					}
				}
			}
		}

		if ($this->isPopup()) {
			$this->genPopupActionJS();
		}

		// Получаем параметры навигации
		$navUniqSettings = array('sNavID' => $this->getListTableID());
		$this->navParams = array(
			'nPageSize' => \CAdminResult::GetNavSize($navUniqSettings),
			'navParams' => \CAdminResult::GetNavParams($navUniqSettings)
		);
	}

	/**
	 * Подготавливает переменные, используемые для инициализации списка.
     *
     * - добавляет поля в список фильтра только если FILTER не задано false по умолчанию для виджета и поле не является
     * полем связи сущностью разделов
	 */
	protected function prepareAdminVariables()
	{
		$this->arHeader = array();
		$this->arFilter = array();
		$this->arFilterFields = array();
		$arFilter = array();
		$this->filterTypes = array();
		$this->arFilterOpts = array();

		$sectionField = static::getSectionField();

		foreach ($this->fields as $code => $settings) {
			$widget = $this->createWidgetForField($code);

			if (
                ($sectionField != $code && $widget->getSettings('FILTER') !==false)
                &&
                ((isset($settings['FILTER']) AND $settings['FILTER'] != false) OR !isset($settings['FILTER']))
            ) {

				$this->setContext(AdminListHelper::OP_ADMIN_VARIABLES_FILTER);
				$filterVarName = 'find_' . $code;
				$this->arFilterFields[] = $filterVarName;
				$filterType = '';

				if (is_string($settings['FILTER'])) {
					$filterType = $settings['FILTER'];
				}

				if (isset($_REQUEST[$filterVarName])
					AND !isset($_REQUEST['del_filter'])
					AND $_REQUEST['del_filter'] != 'Y'
				) {
					$arFilter[$filterType . $code] = $_REQUEST[$filterVarName];
					$this->filterTypes[$code] = $filterType;
				}

				$this->arFilterOpts[$code] = $widget->getSettings('TITLE');
			}

			if (!isset($settings['LIST']) || $settings['LIST'] != false) {
				$this->setContext(AdminListHelper::OP_ADMIN_VARIABLES_HEADER);
				$mergedColumn = false;
				// проверяем есть ли столбец раздела с таким названием
				if ($widget->getSettings('LIST_TITLE')) {
					$sectionHeader = $this->getSectionsHeader();
					foreach ($sectionHeader as $sectionColumn) {
						if ($sectionColumn['content'] == $widget->getSettings('LIST_TITLE')) {
							// добавляем столбец элементов в карту столбцов
							$this->tableColumnsMap[$code] = $sectionColumn['id'];
							$mergedColumn = true;
							break;
						}
					}
				}
				if (!$mergedColumn) {
					$this->arHeader[] = array(
						"id" => $code,
						"content" => $widget->getSettings('LIST_TITLE') ? $widget->getSettings('LIST_TITLE') : $widget->getSettings('TITLE'),
						"sort" => $code,
						"default" => isset($settings['HEADER']) && $settings['HEADER'] == true,
						'admin_list_helper_sort' => $widget->getSettings('LIST_COLUMN_SORT') ? $widget->getSettings('LIST_COLUMN_SORT') : 100
					);
				}
			}
		}

		if ($this->checkFilter($arFilter)) {
			$this->arFilter = $arFilter;
		}

		if (static::getHelperClass(AdminSectionEditHelper::className())) {
			$this->arFilter[static::getSectionField()] = $_GET['ID'];
		}
	}

	/**
	 * Возвращает список столбцов для разделов
	 * @return array
	 */
	public function getSectionsHeader()
	{
		$arSectionsHeaders = array();
		$sectionHelper = static::getHelperClass(AdminSectionEditHelper::className());
		$sectionsInterfaceSettings = static::getInterfaceSettings($sectionHelper::getViewName());
		$this->sectionFields = $sectionsInterfaceSettings['FIELDS'];

		foreach ($sectionsInterfaceSettings['FIELDS'] as $code => $settings) {

			if (!isset($settings['LIST']) || $settings['LIST'] != false) {
				$arSectionsHeaders[] = array(
					"id" => $code,
					"content" => isset($settings['LIST_TITLE']) ? $settings['LIST_TITLE'] : $settings['TITLE'],
					"sort" => $code,
					"default" => isset($settings['HEADER']) && $settings['HEADER'] == true,
					'admin_list_helper_sort' => isset($settings['LIST_COLUMN_SORT']) ? $settings['LIST_COLUMN_SORT'] : 100
				);
			}
			unset($settings['WIDGET']);
<commit_msg>Возвращено старое поведение параметра HEADER<commit_after><?php

namespace DigitalWand\AdminHelper\Helper;

use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Entity\DataManager;
use Bitrix\Main\DB\Result;
use DigitalWand\AdminHelper\EntityManager;

Loc::loadMessages(__FILE__);

/**
 * Базовый класс для реализации страницы списка админки.
 * При создании своего класса необходимо переопределить следующие переменные:
 * <ul>
 * <li> static protected $model </Li>
 * </ul>
 *
 * Этого будет дастаточно для получения минимальной функциональности
 * Также данный класс может использоваться для отображения всплывающих окон с возможностью выбора элемента из списка
 *
 * @see AdminBaseHelper::$model
 * @see AdminBaseHelper::$module
 * @see AdminBaseHelper::$editViewName
 * @see AdminBaseHelper::$viewName
 * @package AdminHelper
 *
 * @author <NAME> <<EMAIL>>
 * @author <NAME> <<EMAIL>>
 */
abstract class AdminListHelper extends AdminBaseHelper
{
	const OP_GROUP_ACTION = 'AdminListHelper::__construct_groupAction';
	const OP_ADMIN_VARIABLES_FILTER = 'AdminListHelper::prepareAdminVariables_filter';
	const OP_ADMIN_VARIABLES_HEADER = 'AdminListHelper::prepareAdminVariables_header';
	const OP_GET_DATA_BEFORE = 'AdminListHelper::getData_before';
	const OP_ADD_ROW_CELL = 'AdminListHelper::addRowCell';
	const OP_CREATE_FILTER_FORM = 'AdminListHelper::createFilterForm';
	const OP_CHECK_FILTER = 'AdminListHelper::checkFilter';
	const OP_EDIT_ACTION = 'AdminListHelper::editAction';

	/**
	 * @var bool
	 * Выводить кнопку экспорта в Excel
	 * @api
	 */
	protected $exportExcel = true;
	/**
	 * @var bool
	 * Выводить в списке кол-во элементов пункт Все
	 */
	protected $showAll = true;
	/**
	 * @var bool
	 * Является ли список всплывающим окном для выбора элементов из списка.
	 * В этой версии не должно быть операций удаления/перехода к редактированию.
	 */
	protected $isPopup = false;
	/**
	 * @var string
	 * Название поля, в котором хранится результат выбора во всплывающем окне
	 */
	protected $fieldPopupResultName = '';
	/**
	 * @var string
	 * Уникальный индекс поля, в котором хранится результат выбора во всплывающем окне
	 */
	protected $fieldPopupResultIndex = '';
	protected $sectionFields = array();
	/**
	 * @var string
	 * Название столбца, в котором хранится название элемента
	 */
	protected $fieldPopupResultElTitle = '';
	/**
	 * @var string
	 * Название функции, вызываемой при даблклике на строке списка, в случае, если список выводится в режиме
	 *     всплывающего окна
	 */
	protected $popupClickFunctionName = 'selectRow';
	/**
	 * @var string
	 * Код функции, вызываемой при клике на строке списка
	 * @see AdminListHelper::genPipupActionJS()
	 */
	protected $popupClickFunctionCode;
	/**
	 * @var array
	 * Массив с заголовками таблицы
	 * @see \CAdminList::AddHeaders()
	 */
	protected $arHeader = array();
	/**
	 * @var array
	 * параметры фильтрации списка в классическим битриксовом формате
	 */
	protected $arFilter = array();
	/**
	 * @var array
	 * Массив, хранящий тип фильтра для данного поля. Позволяет избежать лишнего парсинга строк.
	 */
	protected $filterTypes = array();
	/**
	 * @var array
	 * Поля, предназначенные для фильтрации
	 * @see \CAdminList::InitFilter();
	 */
	protected $arFilterFields = array();
	/**
	 * Список полей, для которых доступна фильтрация
	 * @var array
	 * @see \CAdminFilter::__construct();
	 */
	protected $arFilterOpts = array();
	/**
	 * @var \CAdminList
	 */
	protected $list;
	/**
	 * @var string
	 * Префикс таблицы. Нужен, чтобы обеспечить уникальность относительно других админ. интерфейсов.
	 * Без его добавления к конструктору таблицы повычается вероятность, что возникнет конфликт с таблицей из другого
	 * административного интерфейса, в результате чего неправильно будет работать паджинация, фильтрация. Вероятны
	 * ошибки запросов к БД.
	 */
	static protected $tablePrefix = "digitalwand_admin_helper_";
	/**
	 * @var array
	 * @see \CAdminList::AddGroupActionTable()
	 */
	protected $groupActionsParams = array();
	/**
	 * Текущие параметры пагинации,
	 * требуются для составления смешанного списка разделов и элементов
	 * @var array
	 */
	protected $navParams = array();
	/**
	 * Количество элементов смешанном списке
	 * @see AdminListHelper::CustomNavStart
	 * @var int
	 */
	protected $totalRowsCount = 0;
	/**
	 * Массив для слияния столбцов элементов и разделов
	 * @var array
	 */
	protected $tableColumnsMap = array();
	/**
	 * @var string
	 * HTML верхней части таблицы
	 * @api
	 */
	public $prologHtml;

	/**
	 * @var string
	 * HTML нижней части таблицы
	 * @api
	 */
	public $epilogHtml;

	/**
	 * Производится инициализация переменных, обработка запросов на редактирование
	 *
	 * @param array $fields
	 * @param bool $isPopup
	 * @throws \Bitrix\Main\ArgumentException
	 */
	public function __construct(array $fields, $isPopup = false)
	{
		$this->isPopup = $isPopup;

		if ($this->isPopup) {
			$this->fieldPopupResultName = preg_replace("/[^a-zA-Z0-9_:\\[\\]]/", "", $_REQUEST['n']);
			$this->fieldPopupResultIndex = preg_replace("/[^a-zA-Z0-9_:]/", "", $_REQUEST['k']);
			$this->fieldPopupResultElTitle = $_REQUEST['eltitle'];
		}

		parent::__construct($fields);

		$this->restoreLastGetQuery();
		$this->prepareAdminVariables();

		$className = static::getModel();
		$oSort = new \CAdminSorting($this->getListTableID(), $this->pk(), "desc");
		$this->list = new \CAdminList($this->getListTableID(), $oSort);
		$this->list->InitFilter($this->arFilterFields);

		if ($this->list->EditAction() AND $this->hasWriteRights()) {
			global $FIELDS;
			foreach ($FIELDS as $id => $fields) {
				if (!$this->list->IsUpdated($id)) {
					continue;
				}
				$this->editAction($id, $fields);
			}
		}
		if ($IDs = $this->list->GroupAction() AND $this->hasWriteRights()) {
			if ($_REQUEST['action_target'] == 'selected') {
				$this->setContext(AdminListHelper::OP_GROUP_ACTION);
				$IDs = array();

				//Текущий фильтр должен быть модифицирован виждтами
				//для соответствия результатов фильтрации тому, что видит пользователь в интерфейсе.
				$raw = array(
					'SELECT' => $this->pk(),
					'FILTER' => $this->arFilter,
					'SORT' => array()
				);

				foreach ($this->fields as $code => $settings) {
					$widget = $this->createWidgetForField($code);
					$widget->changeGetListOptions($this->arFilter, $raw['SELECT'], $raw['SORT'], $raw);
				}

				$res = $className::getList(array(
					'filter' => $this->arFilter,
					'select' => array($this->pk()),
				));

				while ($el = $res->Fetch()) {
					$IDs[] = $el[$this->pk()];
				}
			}

			$filteredIDs = array();

			foreach ($IDs as $id) {
				if (strlen($id) <= 0) {
					continue;
				}
				$filteredIDs[] = IntVal($id);
			}
			$this->groupActions($IDs, $_REQUEST['action']);
		}
		if (isset($_REQUEST['action']) || isset($_REQUEST['action_button']) && count($this->getErrors()) == 0 ) {
			$listHelperClass = $this->getHelperClass(AdminListHelper::className());
			$className = $listHelperClass::getModel();
			$id = isset($_GET['ID']) ? $_GET['ID'] : null;
			$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : $_REQUEST['action_button'];
			if($action!='edit' && $_REQUEST['cancel'] != 'Y'){
				$params = $_GET;
				unset($params['action']);
				unset($params['action_button']);
				$this->customActions($action, $id);
				$sectionEditHelperClass = $this->getHelperClass(AdminSectionEditHelper::className());

				if ($sectionEditHelperClass) {
					$element = $className::getById($id)->Fetch();
					$sectionField = $listHelperClass::getSectionField();
					if ($element[$sectionField]) {
						$params['ID'] = $element[$sectionField];
					}
				}
			}
		}

		if ($this->isPopup()) {
			$this->genPopupActionJS();
		}

		// Получаем параметры навигации
		$navUniqSettings = array('sNavID' => $this->getListTableID());
		$this->navParams = array(
			'nPageSize' => \CAdminResult::GetNavSize($navUniqSettings),
			'navParams' => \CAdminResult::GetNavParams($navUniqSettings)
		);
	}

	/**
	 * Подготавливает переменные, используемые для инициализации списка.
     *
     * - добавляет поля в список фильтра только если FILTER не задано false по умолчанию для виджета и поле не является
     * полем связи сущностью разделов
	 */
	protected function prepareAdminVariables()
	{
		$this->arHeader = array();
		$this->arFilter = array();
		$this->arFilterFields = array();
		$arFilter = array();
		$this->filterTypes = array();
		$this->arFilterOpts = array();

		$sectionField = static::getSectionField();

		foreach ($this->fields as $code => $settings) {
			$widget = $this->createWidgetForField($code);

			if (
                ($sectionField != $code && $widget->getSettings('FILTER') !==false)
                &&
                ((isset($settings['FILTER']) AND $settings['FILTER'] != false) OR !isset($settings['FILTER']))
            ) {

				$this->setContext(AdminListHelper::OP_ADMIN_VARIABLES_FILTER);
				$filterVarName = 'find_' . $code;
				$this->arFilterFields[] = $filterVarName;
				$filterType = '';

				if (is_string($settings['FILTER'])) {
					$filterType = $settings['FILTER'];
				}

				if (isset($_REQUEST[$filterVarName])
					AND !isset($_REQUEST['del_filter'])
					AND $_REQUEST['del_filter'] != 'Y'
				) {
					$arFilter[$filterType . $code] = $_REQUEST[$filterVarName];
					$this->filterTypes[$code] = $filterType;
				}

				$this->arFilterOpts[$code] = $widget->getSettings('TITLE');
			}

			if (!isset($settings['LIST']) || $settings['LIST'] === true) {
				$this->setContext(AdminListHelper::OP_ADMIN_VARIABLES_HEADER);
				$mergedColumn = false;
				// проверяем есть ли столбец раздела с таким названием
				if ($widget->getSettings('LIST_TITLE')) {
					$sectionHeader = $this->getSectionsHeader();
					foreach ($sectionHeader as $sectionColumn) {
						if ($sectionColumn['content'] == $widget->getSettings('LIST_TITLE')) {
							// добавляем столбец элементов в карту столбцов
							$this->tableColumnsMap[$code] = $sectionColumn['id'];
							$mergedColumn = true;
							break;
						}
					}
				}
				if (!$mergedColumn) {
					$this->arHeader[] = array(
						"id" => $code,
						"content" => $widget->getSettings('LIST_TITLE') ? $widget->getSettings('LIST_TITLE') : $widget->getSettings('TITLE'),
						"sort" => $code,
						"default" => !isset($settings['HEADER']) || $settings['HEADER'] === true,
						'admin_list_helper_sort' => $widget->getSettings('LIST_COLUMN_SORT') ? $widget->getSettings('LIST_COLUMN_SORT') : 100
					);
				}
			}
		}

		if ($this->checkFilter($arFilter)) {
			$this->arFilter = $arFilter;
		}

		if (static::getHelperClass(AdminSectionEditHelper::className())) {
			$this->arFilter[static::getSectionField()] = $_GET['ID'];
		}
	}

	/**
	 * Возвращает список столбцов для разделов
	 * @return array
	 */
	public function getSectionsHeader()
	{
		$arSectionsHeaders = array();
		$sectionHelper = static::getHelperClass(AdminSectionEditHelper::className());
		$sectionsInterfaceSettings = static::getInterfaceSettings($sectionHelper::getViewName());
		$this->sectionFields = $sectionsInterfaceSettings['FIELDS'];

		foreach ($sectionsInterfaceSettings['FIELDS'] as $code => $settings) {

			if (!isset($settings['LIST']) || $settings['LIST'] === true) {
				$arSectionsHeaders[] = array(
					"id" => $code,
					"content" => isset($settings['LIST_TITLE']) ? $settings['LIST_TITLE'] : $settings['TITLE'],
					"sort" => $code,
					"default" => !isset($settings['HEADER']) || $settings['HEADER'] === true,
					'admin_list_helper_sort' => isset($settings['LIST_COLUMN_SORT']) ? $settings['LIST_COLUMN_SORT'] : 100
				);
			}
			unset($settings['WIDGET']);

{'fraction_non_alphanumeric': 0.15811910605864876, 'fraction_numerical': 0.0011195797269947896, 'mean_word_length': 4.105297867663222, 'pattern_counts': {'":': 0, '<': 27, '<?xml version=': 0, '>': 211, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '793083', 'n_tokens_mistral': 8894, 'n_tokens_neox': 8415, 'n_words': 1592}