msn0y
@msn0y

Как вывести свойства товаров связанных «Привязкой к элементам» в Битрикс?

Доброго времени суток!
Первым, что хочу сказать: да я уже гуглил и находил вроде как много ответов, но у меня они почему-то стопорились.

Задача: Сделать альтернативу ТП благодаря свойству "Привязкой к элементам".
Для реализации нужно получить:
1) id,
2) имя,
3) ссылку,
4) параметр CAN_BUY или хотя-бы QUANTITY
5) какое-либо свойство (сейчас реализую по цвету)
1-3 пункт получить удалось, сейчас проблема с 4 и 5 пунктами и, если даже получить QUANTITY чуть проще, то с цветом засада.
Сейчас цвета реализованы справочником и значения выдавать не хотят, я побывал добавить еще 2 разных типа свойств: "строка" и "список" - если даже вызываю свойство по символьному коду - получаю пустое значение.

Код в карточке товара:
<?php if (count($arResult['CATALOG_TP_COLOR']) > 0) : ?>
                <div class="offer-property-row mb-3 first last">
                    <div class="font-weight-bold">Цвет: </div>
                    <?php foreach ($arResult['CATALOG_TP_COLOR'] as $id => $product) : ?>
                        <? echo "<pre>"; print_r($product['COLOR']); echo "</pre>";?>
                        <a class="btn btn-light mb-1 <?php if ($product['ID'] == $arResult['ID']) : echo 'active'; ?><?php endif; ?>" title="<?php echo $product['NAME']; ?>" href="<?php echo $product['DETAIL_PAGE_URL']; ?>">
                            <?php echo $product['NAME']; ?> - <?php echo $product['QUANTITY']; ?>
                        </a>
                    <?php endforeach; ?>
                </div>
            <?php endif; ?>


Тут я пробую вызывать нужные мне свойства, но все тщетно:
$TPcolorsList = array();
$arResult['CATALOG_TP_COLOR'] = array();
$arSelect = array("IBLOCK_ID", "ID", "NAME", "DETAIL_PAGE_URL");
$arFilter = Array("IBLOCK_ID" => 5, "ID" => $arResult['PROPERTIES']['CATALOG_TP_COLOR']['VALUE']);
$res = CIBlockElement::GetList(array(), $arFilter, false, array("nPageSize" => 10), $arSelect);
while ($ob = $res->GetNextElement()) {
    $arFields = $ob->GetFields();
    $TPcolorsList[$arFields['ID']]['NAME'] = $arFields['NAME'];
    $TPcolorsList[$arFields['ID']]['DETAIL_PAGE_URL'] = $arFields['DETAIL_PAGE_URL'];
    $TPcolorsList[$arFields['ID']]['ID'] = $arFields['ID'];
    $TPcolorsList[$arFields['ID']]['QUANTITY'] = $arResult['PRODUCT']['QUANTITY'];
    $TPcolorsList[$arFields['ID']]['COLOR'] = $arResult;
}
if (count($TPcolorsList) > 0) {
    $arResult['CATALOG_TP_COLOR'] = $TPcolorsList;
}
unset($TPcolorsList);
unset($arSelect);
unset($arFilter);
unset($res);
  • Вопрос задан
  • 109 просмотров
Решения вопроса 2
@Firsov36
full-stack web developer
Вы при выборке не указываете поле свойства COLOR, поэтому и не будет его. Надо добавить к $arSelect что-то вроде "PROPERTY_COLOR". Также, основные поля получаете $arFields = $ob->GetFields(); а свойства нет, как-то так писалось: $arProps = $ob->GetProperties();

Если отвечать про "кол-ва товара на складе", то в приведенном коде вы кол-во вообще не получаете, просто присваиваете значение из переменной $arResult['PRODUCT']['QUANTITY']. Если хотите получить для выбранного элемента инфоблока, то вам надо подгрузить модуль каталога и запрашивать данные оттуда.

И начинайте уже изучать bitrix d7 используемые вами функции давно устарели.
Ответ написан
msn0y
@msn0y Автор вопроса
Пару часов назад все сделал и верстал визуализацию, если понадобится кому-то:
$TPcolorsList = array();
$arResult['CATALOG_TP_COLOR'] = array();
$arSelect = array("IBLOCK_ID", "ID", "NAME", "DETAIL_PAGE_URL", "QUANTITY", "PROPERTY_*");
$arFilter = Array("IBLOCK_ID" => 5, "ID" => $arResult['PROPERTIES']['CATALOG_TP_COLOR']['VALUE']);

$colors = HighloadBlockTable::getList(array("filter" => array('TABLE_NAME' => "bxready_color")))->fetch();
$restp = CIBlockElement::GetList(array(), $arFilter, false, array("nPageSize" => 10), $arSelect);
while ($ob = $restp->GetNextElement()) {
    $arFields = $ob->GetFields();
    $TPcolorsList[$arFields['ID']]['NAME'] = $arFields['NAME'];
    $TPcolorsList[$arFields['ID']]['DETAIL_PAGE_URL'] = $arFields['DETAIL_PAGE_URL'];
    $TPcolorsList[$arFields['ID']]['ID'] = $arFields['ID'];
    $TPcolorsList[$arFields['ID']]['QUANTITY'] = $arFields['QUANTITY'];
    $arProps = $ob->GetProperties();
    if (isset($colors['ID'])) {
        $entity = HighloadBlockTable::compileEntity($colors);
        $entity_data_class = $entity->getDataClass();
        $res = $entity_data_class::getList(array('filter' => ['=UF_XML_ID' => $arProps['COLOR']['VALUE']]));
        while ($item = $res->fetch()) {
            $TPcolorsList[$arFields['ID']]['COLOR'] = $item['UF_NAME'];
        }
    }
}
if (count($TPcolorsList) > 0) {
    $arResult['CATALOG_TP_COLOR'] = $TPcolorsList;
}
unset($colors);
unset($TPcolorsList);
unset($arSelect);
unset($arFilter);
unset($restp);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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