Yastr
@Yastr

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

У товара есть свойство спорт (тип справочник, множественное), как вывести выбранные значения (название, картинка)?

Нашел заметку - Как вывести свойства инфоблока по отдельности..., перебрал все более менее подходящие варианты, максимум что получилось, вывести название, картинку получить не удается.

Подскажите пожалуйста как это реализовать.

5b4e0cf995d1a085213978.png5b4e0cffc926e958178414.png
  • Вопрос задан
  • 10483 просмотра
Решения вопроса 1
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;
		}
	}
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы