Примеры небольших, но часто крайне полезных 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' ];