Примеры небольших, но часто крайне полезных php сниппетов для Битрикса.
Набор полезных рецептов для Bitrix
29.09.2020
Получаем "пользовательские свойства" (цвет, картинка, и т.д.):
$aProp = CIBlockElement::GetByID($aItem['ID'])->GetNextElement()->GetProperties();
Битрикс тесторование (Битрикс самопроверка)
Запустить проверку можно из раздел Настройки - Инструменты - Проверка системы (http://SITE.local/bitrix/admin/site_checker.php?lang=ru)
Самопроверка Bitrix выдает ошибку. Проблема с сокетами.
Все примеры, если они не в модули/компоненты битрикса должны начинаться с подключения файла:
require_once($_SERVER['DOCUMENT_ROOT']. "/bitrix/modules/main/include/prolog_before.php");
Получить все категории со значениями SEO метатегов:
$aCategories = CIBlockSection::GetList( array('sort' => 'asc'), array( 'ACTIVE' => 'Y', 'GLOBAL_ACTIVE' => 'Y', 'IBLOCK_ID' => $arParams['arParams']['IBLOCK_ID'], //'SECTION_ID' => $arParams['arParams']['SECTION_ID'] // Можно указать ID родительской категории ) ); $aTMP = array(); $iPos = 0; if ($aCategories->SelectedRowsCount() > 0) { $i = 0; // while ($row = $aCategories->Fetch()) while ($row = $aCategories->GetNext()) { $ipropValues = new \Bitrix\Iblock\InheritedProperty\SectionValues( $row["IBLOCK_ID"], $row["ID"] ); $row["IPROPERTY_VALUES"] = $ipropValues->getValues(); $sTitle = isset($row["IPROPERTY_VALUES"]['SECTION_PAGE_TITLE'])?$row["IPROPERTY_VALUES"]['SECTION_PAGE_TITLE']:$row['NAME']; } }
Получить категорий со значениями пользовательских полей (userfields):
$aCategories = CIBlockSection::GetList( array('sort' => 'asc'), array( 'ACTIVE' => 'Y', 'GLOBAL_ACTIVE' => 'Y', 'IBLOCK_ID' => 1, // !!! Нужно передавать обязательно, иначе user fields не возвращаются 'SECTION_ID' => 98 ), FALSE, array("UF_SOTYPE") // Можно указать "UF_*" ); if ($aCategories->SelectedRowsCount() > 0) { $i = 0; // while ($row = $aCategories->Fetch()) while ($row = $aCategories->GetNext()) { if ($row['UF_SOTYPE'] == 1) { $aItems1[] = $aItem; } else { $aItems2[] = $aItem; } } }
Как получить значение пользовательских полей, для товара Bitrix:
bitrix разработчикам как получить значение поля продукта списка / bitrix каталог получить значение свойства.
$block_id = 1; // block_id магазины, обычно 1 $id = 101; // ID товара $sCode = 'SO_PUBLISHED'; // Имя пользовательского свойства $db_props = \CIBlockElement::GetProperty($block_id, $id, array("sort" => "asc"), Array("CODE" => $sCode)); if ($ar_props = $db_props->Fetch()) { $sPublished = IntVal($ar_props["VALUE"]); } else { $sPublished = false; }
Получение списка товаров (старый "стиль"):
$items = GetIBlockElementList($IBLOCK_ID, false, Array("SORT"=>"ASC")); $aTMP = array(); while ($row = $items->GetNext()) { $sTitle = $row['NAME']; $aTMP[$i] = array( 'url' => $row['DETAIL_PAGE_URL'], 'name' => $sTitle, 'id' => $row['ID'], 'price' => (int) CPrice::GetBasePrice($row['ID'])['PRICE'], ); }
Получение списка товаров:
$arOrder = array('SORT'=>'ASC'); $arFilter = array(); $res = CIBlockElement::GetList($arOrder, $arFilter); while ($aItem = $res->GetNext()) { $id = $aItem['ID']; if($id == 3026) { echo '<pre>'; print_r($aItem); echo '</pre>'; } }
Получение списка товаров для определенной категории со свойствами:
$arOrder = array('SORT'=>'ASC'); $arFilter = array( 'SECTION_ID'=>23, // Id категории 'IBLOCK_ID' => 1 ); $res = CIBlockElement::GetList($arOrder, $arFilter); $i = 0; $aTMP = []; while ($aItem = $res->GetNext()) { $aProp = CIBlockElement::GetByID($aItem['ID'])->GetNextElement()->GetProperties(); $aTMP[$i]['sku'] = $aProp['EL_SKU']; // Артикул $aTMP[$i]['title'] = $aItem['NAME']; // Название товара echo '<pre>'; print_r($aTMP[$i]); print_r($prop); print_r($aItem); echo '</pre>'; $i++; }
Получение всех категорий/разделов, к которым относиться товар:
$id = $arParams['arResult']['ID']; $IBLOCK_ID = $arParams['arResult']['IBLOCK_ID']; $res = CIBlockElement::GetElementGroups( $id, false, array('ID', 'NAME', 'SECTION_PAGE_URL') ); $aItems = array(); while($row = $res->GetNext()) { echo '<pre>'; print_r($row); echo '</pre>'; }
Получение картинки:
// Сразу выводит изображение echo CFile::ShowImage($row['PICTURE'], 200, 200, "", "", true); // Возвращает массив с данными о фотографии $file = CFile::GetFileArray($row['PICTURE']);
Включенние вывода всех товаров каталога, если категория не указана:
// bitrix/components/bitrix/catalog/templates/.default/section.php $APPLICATION->IncludeComponent( 'bitrix:catalog.section', '', array( 'SHOW_ALL_WO_SECTION' => 'Y', // показывать товары, если не задан раздел // … ), $component );
Пример вывода всех товаров из категории, со значением свойства "ASKARON_REVIEWS_COUNT" больше 0
$arSelect = Array("ID", "NAME", "PROPERTY_ASKARON_REVIEWS_COUNT"); $arFilter = Array("IBLOCK_ID"=>1, "SECTION_ID"=>$id_cat, ">PROPERTY_ASKARON_REVIEWS_COUNT" => 0, "ACTIVE"=>"Y"); $res = CIBlockElement::GetList(Array(), $arFilter, false, Array(), $arSelect); while($ob = $res->GetNextElement()) { $arFields = $ob->GetFields(); echo '<pre>'; print_r($arFields); // ASKARON_REVIEWS_COUNT echo '</pre>'; }
Подробнее:
Основная функция
Фильтр по числам
Фильтр по маскам (для определенных типов полей)
Как повлиять на выводимые в каталоге товары:
global $_aSoGlobal, $arrFilter; if($_aSoGlobal['otzyvy-o-tovarakh']) { $arrFilter = Array("IBLOCK_ID"=>1, ">PROPERTY_ASKARON_REVIEWS_COUNT" => 0, "ACTIVE"=>"Y"); } $APPLICATION->IncludeComponent( "bitrix:catalog", "catalog_new", array( ... ...
Получение товаров из корзины:
С проверкой, есть ли товароы в корзине из определенной категории.
// Проверка на наличие продукции "Barrier" $bBarrier = FALSE; $dbBasketItems = CSaleBasket::GetList( array("NAME" => "ASC","ID" => "ASC"), array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL"), false, false, array("ID","MODULE","PRODUCT_ID","QUANTITY","CAN_BUY","PRICE") ); while ($arItems=$dbBasketItems->Fetch()) { $arItems=CSaleBasket::GetByID($arItems["ID"]); $res = CIBlockElement::GetElementGroups( $arItems["PRODUCT_ID"], false, array('ID', 'NAME', 'SECTION_PAGE_URL') ); while($row = $res->GetNext()) { if($row['ID'] == 188) { $bBarrier = TRUE; break; } } }
Обновление цены товара (у товарного предложения):
CModule::IncludeModule("catalog"); $PRODUCT_ID = 3026; $PRICE_TYPE_ID = 1; $arFields = Array( "PRODUCT_ID" => $PRODUCT_ID, "CATALOG_GROUP_ID" => $PRICE_TYPE_ID, "PRICE" => 29.95, ); $res = CPrice::GetList( array(), array( "PRODUCT_ID" => $PRODUCT_ID, "CATALOG_GROUP_ID" => $PRICE_TYPE_ID ) ); if ($arr = $res->Fetch()) { CPrice::Update($arr["ID"], $arFields); } /* else { CPrice::Add($arFields); } */
Подробнее:
Массовое изменение цен товаров.
Массовое изменение цен в 1C-Bitrix
CPrice::Update
CIBlockElement::Add
Как программно запустить экспорт (например в Маркет):
10 - это ID нужной выгрузки. Посмотреть его можно в пенале администрирования.
CCatalogExport::PreGenerateExport(10);
Как программно добавить товар:
<?php //die('!'); error_reporting(E_ALL); ini_set('display_errors', 'On'); require_once($_SERVER['DOCUMENT_ROOT']. "/bitrix/modules/main/include/prolog_before.php"); //CModule::IncludeModule("catalog"); CModule::IncludeModule("iblock"); $IBLOCK_ID = 2; // ID Инфоблока каталога $el = new CIBlockElement; $PROP = array(); $PROP[12] = "Белый"; // свойству с кодом 12 присваиваем значение "Белый" $PROP[3] = 38; $PROP[11] = 111111; $arLoadProductArray = Array( "MODIFIED_BY" => $USER->GetID(), // элемент изменен текущим пользователем //"IBLOCK_SECTION_ID" => false, // элемент лежит в корне раздела "IBLOCK_SECTION_ID" => 7, // ID категории "IBLOCK_ID" => $IBLOCK_ID, "PROPERTY_VALUES"=> $PROP, "NAME" => "Элемент", "ACTIVE" => "N", // активен "CODE" => "MySyperCode2", // Ссылочный код "PREVIEW_TEXT" => "текст для списка элементов", "DETAIL_TEXT" => "текст для детального просмотра", "DETAIL_PICTURE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/image.gif") ); if($PRODUCT_ID = $el->Add($arLoadProductArray)) echo "New ID: ".$PRODUCT_ID; else echo "Error: ".$el->LAST_ERROR; ?> Done <?
По теме: CIBlockElement add
Получение заказа по ID:
if (!($arOrder = CSaleOrder::GetByID($ORDER_ID))) { echo "Заказ с кодом ".$ORDER_ID." не найден"; } else { echo "<pre>"; print_r($arOrder); echo "</pre>"; }
Получение цены товара (стоимость товара) по его ID:
'price' => CPrice::GetBasePrice($arItem['ITEM_ID'])['PRICE'];
bitrix includearea:
Как добавить в bitrix Include Area
Данные из заказа (текущей корзины):
/** * Возвращает сумму текущего заказа из в корзине * * @return float */ static function getCurrentOrderTotalPrice() { $arBasketItems = array(); $dbBasketItems = CSaleBasket::GetList( array("NAME" => "ASC","ID" => "ASC"), array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL"), false, false, array("ID","MODULE","PRODUCT_ID","QUANTITY","CAN_BUY","PRICE") ); $fRet = 0; while ($arItems=$dbBasketItems->Fetch()) { $arItems=CSaleBasket::GetByID($arItems["ID"]); $arBasketItems[]=$arItems; //$cart_num+=$arItems['QUANTITY']; $fRet += $arItems['PRICE']*$arItems['QUANTITY']; } return $fRet; }
Как получить ссылку на товар в Bitrix:
$res= \CIBlockElement::GetByID( $id ); $aTMP = $res->GetNext(); echo $aTMP[ 'DETAIL_PAGE_URL' ];