Y
Y
Yastr2018-07-17 18:34:53
1C-Bitrix
Yastr, 2018-07-17 18:34:53

How to display the values ​​of a property of type "reference"?

The product has a sports property (type reference, multiple), how to display the selected values ​​(name, picture)?
I found a note - How to display the properties of the infoblock separately ... , went through all the more or less suitable options, the maximum that turned out, I could not get the name, the picture could not be obtained.
Please tell me how to implement it.
5b4e0cf995d1a085213978.png5b4e0cffc926e958178414.png

Answer the question

In order to leave comments, you need to log in

1 answer(s)
A
Andrey Nikolaev, 2018-07-18
@Yastr

If we assume that you added a new property in the infoblock and added the Directory type to it, then I think this is for you)
I created a test property (TEST) - binding to the directory and wanted to display a picture for the standard news.detail component. In order to get it, I wrote a small (non-optimal) piece of code in result_modifier.php.
As a result of work, the EXTRA_VALUE key appears in the properties, which already contains the necessary descriptions of each element (including the picture), and it is already necessary to process and display it in the template (template.php) of the component

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;
    }
  }
}

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question