Skip to content

Instantly share code, notes, and snippets.

@EscApp2
Last active February 14, 2025 05:53
Show Gist options
  • Select an option

  • Save EscApp2/a340ef45925bd08f37cdf44520f683d8 to your computer and use it in GitHub Desktop.

Select an option

Save EscApp2/a340ef45925bd08f37cdf44520f683d8 to your computer and use it in GitHub Desktop.
Набор методов для работы с highloadblock Bitrix hlblock
<?php
function getHlBlockSettingsForSave($id){
\CModule::IncludeModule('highloadblock');
$arData = \HLHelpers::getInstance()->getOldData($id);
if($arData){
$string = \CUtil::PhpToJSObject($arData);
}
return $string;
}
function setHlBlockSettingsForCreate($string, $param_name= false, $param_table_name = false){
\CModule::IncludeModule('highloadblock');
if($string){
$arData = \CUtil::JsObjectToPhp($string);
if(is_array($arData)){
$hl_help = \HLHelpers::getInstance();
$name= $param_name;
if(!$name){
$name= $arData['FIELD']['NAME'];
}
$table_name= $param_table_name;
if(!$table_name){
$table_name= $arData['FIELD']['TABLE_NAME'];
}
$new_hl_id = $hl_help->create($name, $table_name);
foreach($arData['UF'] as $arField){
$hl_help->addFieldWithEnum($new_hl_id,$arField);
}
}
}
}
function getHLClass($init_param){
\CModule::IncludeModule('highloadblock');
$HLBlock = false;
if($init_param){
if(is_numeric($init_param)){
$arHLBlock = Bitrix\Highloadblock\HighloadBlockTable::getById($init_param)->fetch();
}else{
$arHLBlock = Bitrix\Highloadblock\HighloadBlockTable::getList(array(
"filter"=>array("NAME"=>$init_param) //entity
))->fetch();
}
$obEntity = Bitrix\Highloadblock\HighloadBlockTable::compileEntity($arHLBlock);
$HLBlock = $obEntity->getDataClass();
}
return $HLBlock;
}
function makeHLPropsList($hl_id, $lang=LANGUAGE_ID){
$arPropList = array();
$entity = "HLBLOCK_" . $hl_id;
$rsData = \CUserTypeEntity::GetList(array("SORT" => "ASC"), array(
"ENTITY_ID" => $entity,
//"ENTITY_ID" => "USER",
"LANG" => $lang
));
while ($arRes = $rsData->Fetch()) {
$arPropList[$arRes['FIELD_NAME']] = $arRes;
}
$arEnumerator = array();
foreach($arPropList as $k=>$arProp){
if($arProp['USER_TYPE_ID'] == "enumeration"){
$arEnumerator[] = $arProp['ID'];
}
}
$arEmunList = array();
$rsEnum = CUserFieldEnum::GetList(array('SORT'=>"ASC"), array(
"USER_FIELD_ID" =>$arEnumerator,
));
while($arEnum = $rsEnum->Fetch())
{
$arEmunList[$arEnum['USER_FIELD_ID']][$arEnum['ID']] = $arEnum;
}
foreach ($arPropList as $k => $arProp) {
if ($arProp['USER_TYPE_ID'] == "boolean") {
$arProp['VISUAL_TYPE'] = 'list';
$arProp['VISUAL_OPTIONS'] = array(
array("value" => 1, 'name' => GetMessage('YES')),
array("value" => 0, 'name' => GetMessage('NO')),
);
$arProp['OPTIONS'] = array(
1 => "yes",
0 => "no",
);
} elseif ($arProp['USER_TYPE_ID'] == "enumeration") {
$arProp['VISUAL_TYPE'] = 'list';
$arProp['VISUAL_OPTIONS'] = array();
foreach($arEmunList[$arProp['ID']] as $arEnum)
{
$arProp['VISUAL_OPTIONS'][] = array(
"value"=>$arEnum['ID'],
"name"=>$arEnum['VALUE'],
);
$arProp['OPTIONS'][$arEnum['ID']] = $arEnum['VALUE'];
}
} elseif ($arProp['USER_TYPE_ID'] == "hlblock") {
$arProp['VISUAL_TYPE'] = 'list';
}
if(!$arProp['EDIT_FORM_LABEL']){
$arProp['EDIT_FORM_LABEL'] = $arProp['FIELD_NAME'];
}
$arPropList[$k] = $arProp;
}
$arPropList['ID'] = array (
'ID' => 'ID',
'ENTITY_ID' => $entity,
'FIELD_NAME' => 'ID',
'USER_TYPE_ID' => 'integer',
'XML_ID' => 'ID',
'SORT' => '100',
'MULTIPLE' => 'N',
'MANDATORY' => 'N',
'SHOW_FILTER' => 'N',
'SHOW_IN_LIST' => 'Y',
'EDIT_IN_LIST' => 'Y',
'IS_SEARCHABLE' => 'N',
'SETTINGS' =>
array (
'DEFAULT_VALUE' =>
array (
'TYPE' => 'NONE',
'VALUE' => '',
),
),
'EDIT_FORM_LABEL' => 'ID',
'LIST_COLUMN_LABEL' => 'ID',
'LIST_FILTER_LABEL' => 'ID',
'ERROR_MESSAGE' => 'ID',
'HELP_MESSAGE' => 'ID',
);
return $arPropList;
}
<?php
/**
* Набор методов для работы с highloadblock Bitrix
* User: darkfriend <hi@darkfriend.ru>
* Date: 25.04.2017
* @version 1.0.3
* updateField
* https://github.com/darkfriend/hlhelpers
*/
use \Bitrix\Highloadblock as HL,
\Bitrix\Main\Entity,
\Bitrix\Main\Loader;
use Bitrix\Main\Application;
class HLHelpers
{
private static $instance;
public static $LAST_ERROR;
/**
* Singleton instance.
* @param int $iblockID
* @param string $iblockType
* @return HLHelpers
*/
public static function getInstance()
{
if (!self::$instance) {
Loader::includeModule('highloadblock');
self::$instance = new HLHelpers();
}
return self::$instance;
}
/**
* Возвращает список HL таблиц
* @param array $arOrder сортировка
* @param array $arFilter фильтры
* @param array $arMoreParams остальные параметры select|group|limit|offset|count_total|runtime|data_doubling
* @return array
*/
public function getList($arOrder = [], $arFilter = [], $arMoreParams = [])
{
$arParams = [];
if ($arOrder) $arParams['order'] = $arOrder;
if ($arFilter) $arParams['filter'] = $arFilter;
if ($arMoreParams) {
foreach ($arMoreParams as $k => $arMoreParam) {
$key = \mb_strtolower($k);
$arParams[$key] = $arMoreParam;
}
}
$rHlblock = HL\HighloadBlockTable::getList($arParams);
return $rHlblock->fetchAll();
}
/**
* Возвращает класс для работы с инфоблоком
* @param int $hlblockID - идентификатор таблицы HL
* @return Entity\DataManager|bool
*/
public function getEntityTable($hlblockID)
{
if (!$hlblockID) return false;
$hlblock = HL\HighloadBlockTable::getById($hlblockID)->fetch();
if (!$hlblock) return false;
$entity = HL\HighloadBlockTable::compileEntity($hlblock);
return $entity->getDataClass();
}
/**
* Возвращает ресурс результата списка элеметнов
* @param int $hlblockID - идентификатор таблицы HL
* @param array $arFilter - фильтры
* @param array $arOrder - сортировка
* @param array $arSelect - поля, по умолчанию все
* @param array $arMoreParams остальные параметры group|limit|offset|runtime|data_doubling
* @return \Bitrix\Main\DB\Result
*/
public function getElementsResource($hlblockID, $arFilter = [], $arOrder = ["ID" => "ASC"], $arSelect = ['*'], $arMoreParams = [])
{
$entity = $this->getEntityTable($hlblockID);
$arParams = [];
if ($arFilter) $arParams['filter'] = $arFilter;
if ($arOrder) $arParams['order'] = $arOrder;
if ($arSelect) $arParams['select'] = $arSelect;
if ($arMoreParams) {
foreach ($arMoreParams as $k => $arMoreParam) {
if (!$arMoreParam) continue;
$key = \mb_strtolower($k);
$arParams[$key] = $arMoreParam;
}
}
return $entity::getList($arParams);
}
/**
* Возвращает список эдементов инфоблока
* @param int $hlblockID - идентификатор таблицы HL
* @param array $arFilter - фильтры
* @param array $arOrder - сортировка
* @param array $arSelect - поля, по умолчанию все
* @param array $arMoreParams остальные параметры group|limit|offset|runtime|data_doubling
* @return array|bool
*/
public function getElementList($hlblockID, $arFilter = [], $arOrder = ["ID" => "ASC"], $arSelect = ['*'], $arMoreParams = [])
{
if (!$hlblockID) return false;
$rsData = $this->getElementsResource($hlblockID, $arFilter, $arOrder, $arSelect, $arMoreParams);
$arResult = [];
while ($arData = $rsData->Fetch()) {
$arResult[] = $arData;
}
return $arResult;
}
/**
* Возвращает общее кол-во строк
* @param int $hlblockID идентификатор таблицы HL
* @param array $arFilter фильтры
* @param array $cache
* @return int
* @throws \Bitrix\Main\ObjectPropertyException
* @throws \Bitrix\Main\SystemException
* @since 1.0.3
*/
public function getTotalCount($hlblockID, $arFilter=[], $cache=[])
{
$entity = $this->getEntityTable($hlblockID);
return (int) $entity::getCount($arFilter, $cache);
}
/**
* Get one element
* @param integer $hlblockID
* @param array $arFilter
* @param array $arSelect
* @param array $arMoreParams
* @return array|false
*/
public function getElement($hlblockID, $arFilter = [], $arSelect = ['*'], $arMoreParams = [])
{
if (!$hlblockID) return false;
return $this->getElementsResource($hlblockID, $arFilter, [], $arSelect, $arMoreParams)->Fetch();
}
/**
* Get one element by ID
* @param integer $hlblockID
* @param integer $id
* @param array $arMoreParams
* @return array|false
*/
public function getElementById($hlblockID, $id, $arMoreParams = [])
{
if (!$hlblockID) return false;
return $this->getElement($hlblockID, ['ID' => $id], [], $arMoreParams);
}
/**
* Создает элемент в хайлоад инфоблоке
* @param integer $hlblockID - идентификатор таблицы HL
* @param array $arFields - поля
* @return bool|int
*/
public function addElement($hlblockID, $arFields = [])
{
if (!$hlblockID || !$arFields) return false;
$entity = $this->getEntityTable($hlblockID);
$result = $entity::add($arFields);
if ($result->isSuccess()) {
return $result->getId();
} else {
self::$LAST_ERROR = $result->getErrors();
}
return false;
}
/**
* Удаляет элемент из хайлоад инфоблока
* @param integer $hlblockID - идентификатор таблицы HL
* @param integer $ID - идентификатор элемента
* @return bool
*/
public function deleteElement($hlblockID, $ID = null)
{
if (!$hlblockID || !$ID) return false;
$entity = $this->getEntityTable($hlblockID);
$result = $entity::delete($ID);
if ($result->isSuccess()) {
return true;
} else {
self::$LAST_ERROR = $result->getErrors();
}
return false;
}
/**
* Обновляет элемент хайлоад инфоблока
* @param integer $hlblockID - идентификатор таблицы HL
* @param integer $ID - идентификатор элемента
* @param array $arFields - обновляемые поля
* @return bool
*/
public function updateElement($hlblockID, $ID = null, $arFields = [])
{
if (!$hlblockID || !$ID || !$arFields) return false;
$entity = $this->getEntityTable($hlblockID);
$result = $entity::update($ID, $arFields);
if ($result->isSuccess()) {
return true;
} else {
self::$LAST_ERROR = $result->getErrors();
}
return false;
}
/**
* Возвращает значения поля
* @param string $fieldName название поля UF_NAME
* @param int $fieldID идентификатор значения
* @return bool|mixed
*/
public function getFieldValue($fieldName = '', $fieldID = null)
{
$arResult = $this->getFieldValuesList([], [
'USER_FIELD_NAME' => $fieldName,
'ID' => $fieldID,
]);
if ($arResult[0]) {
return $arResult[0];
}
return false;
}
/**
* Возвращает все значения поля $fieldName
* @param string $fieldName название поля UF_NAME
* @param array $arSort сортировка
* @return array
*/
public function getFieldValues($fieldName = '', $arSort = ['SORT' => 'ASC'])
{
return $this->getFieldValuesList($arSort, ['USER_FIELD_NAME' => $fieldName]);
}
/**
* Возвращает список всех значений с учетом фильтра и сортировки
* @param array $arSort сортировка
* @param array $arFilter условия выборки
* @return array
*/
public function getFieldValuesList($arSort = ['SORT' => 'ASC'], $arFilter = [])
{
$oFieldEnum = new \CUserFieldEnum;
$rsValues = $oFieldEnum->GetList($arSort, $arFilter);
$arResult = [];
while ($value = $rsValues->Fetch()) {
$arResult[] = $value;
}
return $arResult;
}
/**
* Возвращает значение поля списка по его XML_ID
* @param string $fieldName название поля UF_NAME
* @param string $codeName XML_ID значения списка
* @return bool|array
*/
public function getFieldValueByCode($fieldName = '', $codeName = '')
{
$arResult = $this->getFieldValuesList([], ['USER_FIELD_NAME' => $fieldName, "XML_ID" => $codeName]);
if ($arResult[0]) return $arResult[0];
return false;
}
/**
* Создает таблицу для HighloadBlock
* @param string $nameHLBlock - название HL-блока, должно начинаться с заглавной буквы и состоять только из латинских букв и цифр
* @param string $tableName - название таблицы для HL-блока, должно состоять только из строчных латинских букв, цифр и знака подчеркивания
* @return bool|int - id HL-блока
*/
public function create($nameHLBlock, $tableName)
{
$result = HL\HighloadBlockTable::add([
'TABLE_NAME' => $tableName,
'NAME' => $nameHLBlock,
]);
$id = false;
if (!$result->isSuccess()) {
$msg = $result->getErrorMessages();
if ($msg) $msg = \implode(\PHP_EOL, $msg);
self::$LAST_ERROR = $msg;
} else {
$id = $result->getId();
}
return $id;
}
/**
* Добавляет поле в HighloadBlock
* @param integer $hlblockID - идентификатор HighloadBlock
* @param array $arFields - поля, подробности https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LESSON_ID=3496
* @return int
* @throws $LAST_ERROR
*/
public function addField($hlblockID, $arFields)
{
global $APPLICATION;
$oUserTypeEntity = new \CUserTypeEntity();
if (empty($arFields['ENTITY_ID'])) {
$arFields['ENTITY_ID'] = 'HLBLOCK_' . $hlblockID;
}
$id = $oUserTypeEntity->Add($arFields);
if (!$id) {
self::$LAST_ERROR = $APPLICATION->GetException();
}
return $id;
}
/**
* Возвращает поля таблица
* @param int $hlblockID - идентификатор таблицы HL
* @return \Bitrix\Main\ORM\Fields\Field[]|bool
* @since 1.0.2
*/
public function getFields($hlblockID)
{
if (!$hlblockID) return false;
$hlblock = HL\HighloadBlockTable::getById($hlblockID)->fetch();
if (!$hlblock) return false;
$entity = HL\HighloadBlockTable::compileEntity($hlblock);
return $entity->getFields();
}
/**
* Удаляет HighloadBlock по $hlblockID
* @param integer $hlblockID - идентификатор HighloadBlock
* @return \Bitrix\Main\DB\Result|Entity\DeleteResult
*/
public function deleteHighloadBlock($hlblockID)
{
return HL\HighloadBlockTable::delete($hlblockID);
}
/**
* Удаляет поля из хайлоадблока
* @param int $hlblockID идентификатор таблицы HL
* @param array $kFields массив полей к удалению
* @return bool
* @since 1.0.3
* @example \Dev2fun\MultiDomain\HLHelpers::getInstance()
* ->removeFields(
* 10,
* ['UF_FIELD_1', 'UF_FIELD_2']
* );
*/
public function removeFields($hlblockID, $kFields)
{
global $USER_FIELD_MANAGER;
if (!$hlblockID) return false;
// get old data
$hlblock = HL\HighloadBlockTable::getById($hlblockID)->fetch();
$fileFields = [];
$fields = $USER_FIELD_MANAGER->getUserFields(HL\HighloadBlockTable::compileEntityId($hlblockID));
foreach ($fields as $name => $field) {
if(!\in_array($name, $kFields)) continue;
if ($field['USER_TYPE']['BASE_TYPE'] === 'file') {
$fileFields[] = $name;
}
}
// delete files
if (!empty($fileFields)) {
$oldEntity = HL\HighloadBlockTable::compileEntity($hlblock);
$query = new Entity\Query($oldEntity);
// select file ids
$query->setSelect($fileFields);
// if they are not empty
$filter = ['LOGIC' => 'OR'];
foreach ($fileFields as $file_field) {
$filter['!' . $file_field] = false;
}
$query->setFilter($filter);
// go
$iterator = $query->exec();
while ($row = $iterator->fetch()) {
foreach ($fileFields as $file_field) {
if (!empty($row[$file_field])) {
if (\is_array($row[$file_field])) {
foreach ($row[$file_field] as $value) {
\CFile::delete($value);
}
} else {
\CFile::delete($row[$file_field]);
}
}
}
}
unset($row, $iterator);
}
$connection = Application::getConnection();
foreach ($fields as $name => $field) {
if(!\in_array($name, $kFields)) continue;
// delete from uf registry
if ($field['USER_TYPE']['BASE_TYPE'] === 'enum') {
$enumField = new \CUserFieldEnum;
$enumField->DeleteFieldEnum($field['ID']);
}
$connection->query("DELETE FROM b_user_field_lang WHERE USER_FIELD_ID = " . $field['ID']);
$connection->query("DELETE FROM b_user_field WHERE ID = " . $field['ID']);
// if multiple - drop utm table
if ($field['MULTIPLE'] == 'Y') {
$utmTableName = HL\HighloadBlockTable::getMultipleValueTableName($hlblock, $field);
$connection->dropTable($utmTableName);
}
}
// clear uf cache
$managedCache = Application::getInstance()->getManagedCache();
if (\CACHED_b_user_field !== false) {
$managedCache->cleanDir("b_user_field");
}
return true;
}
public function getOldData($hlblockID){
$arHlFileds = array();
if (!$hlblockID) return false;
$hlblock = HL\HighloadBlockTable::getById($hlblockID)->fetch();
if (!$hlblock) return false;
$arHlFileds['FIELD'] = $hlblock;
$res = \Bitrix\Highloadblock\HighloadBlockLangTable::getList(array(
"filter"=>array("ID"=>$hlblock['ID']),
));
while($ar = $res->fetch()){
$arS = $ar;
unset($arS['ID']);
$arHlFileds['LANG'][] = $arS;
}
//TODO right //dev.1c-bitrix.ru/api_d7/bitrix/highloadblock/highloadblockrightstable/index.php
$arSaveFields = array();
$entity = "HLBLOCK_" . $hlblockID;
$arEnumerator = $AR_ID = array();
$rsData = \CUserTypeEntity::GetList(array("SORT" => "ASC"), array(
"ENTITY_ID" => $entity,
));
while($ar = $rsData->fetch()){
if($ar['USER_TYPE_ID'] == "enumeration"){
$arEnumerator[] = $ar['ID'];
}
$arS = $ar;
unset($arS['ID'], $arS['ENTITY_ID']);
$arSaveFields[$ar['ID']] = $arS;
$AR_ID[] = $ar['ID'];
}
if(count($arEnumerator)>0){
$rsEnum = CUserFieldEnum::GetList(array('SORT'=>"ASC"), array(
"USER_FIELD_ID" =>$arEnumerator,
));
while($arEnum = $rsEnum->Fetch())
{
$arS = $arEnum;
unset($arS['ID']);
$arSaveFields[$arEnum['USER_FIELD_ID']]['ENUMERATION_LIST'][$arEnum['ID']] = $arS;
}
}
if(count($AR_ID)>0){
$arLangFields = array(
"EDIT_FORM_LABEL", "LIST_COLUMN_LABEL", "LIST_FILTER_LABEL", "ERROR_MESSAGE", "HELP_MESSAGE"
);
$STR_ID = implode(",",$AR_ID);
$connection = Bitrix\Main\Application::getConnection();
$res = $connection->query("SELECT * FROM b_user_field_lang WHERE USER_FIELD_ID IN (".$STR_ID.")");
while($ar = $res->Fetch()){
foreach($arLangFields as $field){
if($ar[$field]){
$arSaveFields[$ar['USER_FIELD_ID']][$field][$ar['LANGUAGE_ID']] = $ar[$field];
}
}
}
}
$arHlFileds['UF'] = $arSaveFields;
return $arHlFileds;
}
/**
* Добавляет поле в HighloadBlock
* @param integer $hlblockID - идентификатор HighloadBlock
* @param array $arFields - поля, подробности https://dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LESSON_ID=3496
* @return int
* @throws $LAST_ERROR
*/
public function addFieldWithEnum($hlblockID, $arFields)
{
global $APPLICATION;
$oUserTypeEntity = new \CUserTypeEntity();
if (empty($arFields['ENTITY_ID'])) {
$arFields['ENTITY_ID'] = 'HLBLOCK_' . $hlblockID;
}
$arEnums = false;
if($arFields['ENUMERATION_LIST']){
$arEnums = $arFields['ENUMERATION_LIST'];
unset($arFields['ENUMERATION_LIST']);
}
$id = $oUserTypeEntity->Add($arFields);
if (!$id) {
self::$LAST_ERROR = $APPLICATION->GetException();
}else{
if($arEnums){
$obEnum = new CUserFieldEnum;
$obEnum->SetEnumValues($id, array_values($arEnums));
}
}
return $id;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment