• Как вывести значения свойства типа "справочник"?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если предположить, что Вы в инфоблоке добавили новое свойство и добавили ему тип Справочник, то думаю это для Вас)

    Я создал тестовое свойство (TEST) - привязка к справочнику и у стандартного компонента news.detail захотел вывести картинку. Для того чтобы его получить я написал небольшой (неоптимальный) фрагмент кода в result_modifier.php.
    В результате работы в свойства появляется ключ EXTRA_VALUE, в котором уже содержатся необходимые описания каждого элемента (в том числе и картинка), а его обрабатывать и выводить уже нужно в шаблоне (template.php) компонента
    use \Bitrix\Main\Loader;
    use \Bitrix\Highloadblock as HL;
    
    /**
     * @var array Массив описывающий свойство типа справочник 
     */
    $arHighloadProperty = $arResult["PROPERTIES"]['TEST'];
    
    /**
     * @var string название таблицы справочника
     */
    $sTableName = $arHighloadProperty['USER_TYPE_SETTINGS']['TABLE_NAME'];
    
    /**
     * Работаем только при условии, что
     *    - модуль highloadblock подключен
     *    - в описании присутствует таблица
     *    - есть заполненные значения 
     */
    if ( Loader::IncludeModule('highloadblock') && !empty($sTableName) && !empty($arHighloadProperty["VALUE"]) )
    {
    	/**
    	 * @var array Описание Highload-блока
    	 */
    	$hlblock = HL\HighloadBlockTable::getRow([
    		'filter' => [
    			'=TABLE_NAME' => $sTableName
    		],
    	]);
    
    	if ( $hlblock )
    	{
    		/**
    		 * Магия highload-блоков компилируем сущность, чтобы мы смогли с ней работать
    		 * 
    		 */
    		$entity      = HL\HighloadBlockTable::compileEntity( $hlblock );
    		$entityClass = $entity->getDataClass();
    		
    		$arRecords = $entityClass::getList([
    			'filter' => [
    				'UF_XML_ID' => $arHighloadProperty["VALUE"]
    			],
    		]);
    		foreach ($arRecords as $record)
    		{	
    			/**
    			 * Тут любые преобразования с записью, полученной из таблицы.
    			 * Я транслировал почти все напрямую. 
    			 * 
    			 * Нужно помнить, что например в UF_FILE возвращается ID файла,
    			 * а не полный массив описывающий файл
    			 */
    			$arRecord = [
    				'ID'                  => $record['ID'],
    				'UF_NAME'             => $record['UF_NAME'],
    				'UF_SORT'             => $record['UF_SORT'],
    				'UF_XML_ID'           => $record['UF_XML_ID'],
    				'UF_LINK'             => $record['UF_LINK'],
    				'UF_DESCRIPTION'      => $record['UF_DESCRIPTION'],
    				'UF_FULL_DESCRIPTION' => $record['UF_FULL_DESCRIPTION'],
    				'UF_DEF'              => $record['UF_DEF'],
    				'UF_FILE'             => [],
    				'~UF_FILE'            => $record['UF_FILE'],
    			];
    
    			/**
    			 * Не очень быстрое решение - сколько записей в инфоблоке, столько файлов и получим
    			 * Хорошо было бы вынести под код и там за 1 запрос все получить, а не плодить
    			 * по дополнительному запросу на каждый файл
    			 */
    			if ( !empty($arRecord['~UF_FILE']) )
    			{
    				$arRecord['UF_FILE'] = \CFile::getById($arRecord['~UF_FILE'])->fetch();
    			}
    
    			$arHighloadProperty['EXTRA_VALUE'][] = $arRecord;
    		}
    	}
    }
    Ответ написан