@avshivtseva

Как вывести вместо ID имя свойства Highload?

Здравствуйте!
Подскажите пожалуйста как вывести вместо ID имя свойства?
Есть HighloadBlock, одно из полей имеет тип "Привязка к элементам highload-блоков". Вывожу список элементов, и в этом списке выводится ID записи из другого highload-блока, а надо Имя.
Array(
    [ID] => 1
    [UF_NAME] => Насосный агрегат ВГ 11-11А
    [UF_PRICE] => 8728.82
    [UF_VOLUME] => 2
    [UF_ORGANIZATION] => 1
)

Вместо [UF_ORGANIZATION] => 1 надо название!

Вот код для вывода:

use Bitrix\Highloadblock\HighloadBlockTable as HL;

if (CModule::IncludeModule('highloadblock')) {   

$hlblock_id = 1; // ID вашего Highload-блока
$hlblock   = HL::getById( $hlblock_id )->fetch(); // получаем объект вашего HL блока
$entity   = HL::compileEntity( $hlblock );  // получаем рабочую сущность
$entity_data_class = $entity->getDataClass(); // получаем экземпляр класса
$entity_table_name = $hlblock['TABLE_NAME']; // присваиваем переменной название HL таблицы
$sTableID = 'tbl_'.$entity_table_name; // добавляем префикс и окончательно формируем название

$arFilter = array("UF_ORGANIZATION" => 1); // зададим фильтр по ID организации
$arSelect = array('*'); // выбираем все поля
$arOrder = array("ID"=>"ASC"); // сортировка будет по возрастанию ID статей
 
  
// подготавливаем данные
$rsData = $entity_data_class::getList(array(
    "select" => $arSelect,
    //"filter" => $arFilter,
    "limit" => '5', //ограничим выборку пятью элементами
    "order" => $arOrder
));

$result = new CDBResult($rsData);
   
// выполняем запрос. Передаем в него наши данные и название таблицы, которое мы получили в самом начале
//$rsData = new CDBResult($rsData, $sTableID); // записываем в переменную объект CDBResult

while($arRes = $result->Fetch()){
    echo "<pre>"; print_r($arRes); echo "</pre>";   
        //$rsGender = CUserFieldEnum::GetList(array("UF_NAME_ORG"), array("ID" => $arRes["UF_ORGANIZATION"]));
   //echo "<pre>"; print_r($rsGender); echo "</pre>";   
   }
}


Если делать вывод через CUserFieldEnum, то выводит вот такой объект
CDBResult Object(
    [result] => 
    [arResult] => Array
        (
        )

    [arReplacedAliases] => 
    [arResultAdd] => 
    [bNavStart] => 
    [bShowAll] => 
    [NavNum] => 
    [NavPageCount] => 
    [NavPageNomer] => 
    [NavPageSize] => 
    [NavShowAll] => 
    [NavRecordCount] => 
    [bFirstPrintNav] => 1
    [PAGEN] => 
    [SIZEN] => 
    [SESS_SIZEN] => 
    [SESS_ALL] => 
    [SESS_PAGEN] => 
    [add_anchor] => 
    [bPostNavigation] => 
    [bFromArray] => 1
    [bFromLimited] => 
    [sSessInitAdd] => 
    [nPageWindow] => 5
    [nSelectedCount] => 0
    [arGetNextCache] => 
    [bDescPageNumbering] => 
    [arUserFields] => 
    [usedUserFields] => 
    [SqlTraceIndex] => 
    [DB] => 
    [NavRecordCountChangeDisable] => 
    [is_filtered] => 
    [nStartPage] => 0
    [nEndPage] => 0
    [resultObject] => 
)


что с ним делать дальше?
  • Вопрос задан
  • 1055 просмотров
Пригласить эксперта
Ответы на вопрос 2
serginhold
@serginhold
посмотри что есть в getMap(), возможно там уже есть ReferenceField,
но если нет, то можно заджойнить самостоятельно

::getList([
    'runtime' => [
        'ELEMENT' => new Main\Entity\ReferenceField(
                'ELEMENT',
                ElementTable::class,
                [    // СМОТРИ ДОКУ ПО ORM: JOIN
                    '=this.UF_ORGANIZATION' => 'ref.ID',
                ],
                ['join_type' => 'INNER']
            ),
    ],
    'select' => [
        'ORGANIZATION_NAME' => 'ELEMENT.NAME',
    ]
])
Ответ написан
Комментировать
@kudis
Bitrix developer
Не надо усложнять)))
use Bitrix\Highloadblock\HighloadBlockTable as HL;

$sTableName = "hl_table_name";
$arFilter = ["UF_ORGANIZATION" => 1];
$arSelect = ["*"];
$arOrder = ["ID" => "ASC"];
$iLimit = 5;

CModule::IncludeModule("highloadblock");

$obHlBlock = HL::getList(["filter" => ["TABLE_NAME" => $sTableName]]);
if ($obHlData = $obHlBlock->fetch()) {

    $obEntity = HL::compileEntity($obHlData);
    $sEntityDataClass = $obEntity->getDataClass();

    $obRes = $sEntityDataClass::getList([
        "filter" => $arFilter,
        "select" => $arSelect,
        "order" => $arOrder,
        "limit" => $iLimit
    ]);
    while ($arRes = $obRes->fetch()) {
        echo "<pre>".print_r($arRes, true)."</pre>";
    }
}

так всё будет работать, только не id хайлоада используйте, а имя таблицы - потом, на проектах с, больше чем одним, разработчиком пригодится)))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы