Мастерская iPloGic
+7 (926) 961-66-26

 — База знаний — Создание и изменение товара через Битрикс API

Создание и изменение товара через Битрикс API

Работа с товарами через API это то с чем постоянно приходится сталкиваться всем разработчикам Битрикс. По большому счету тема в интернете освещена вполне подробно, но как-то раздроблено. Чтобы понять процесс работы с товарами полностью неопытным битрикс программистам нужно собирать информацию по крохам. Поэтому была написана эта статья, включающая все стадии создания и изменения товаров через Битрикс API.

Для начала нужно разобраться что представляет собой товар в концепции Битрикса.

В основе любого товара или предложения лежит, как и требует того концепция Битрикса, инфоблок. Создавая его не забудьте поставить галочку "Является торговым каталогом", а также "Инфоблок имеет торговые предложения" если это предполагается. Создание инфоблока через API здесь мы рассматривать не будем, это отдельная тема. Для товарных предложений создается свой инфоблок. То есть создание товара начинается с создания элемента инфоблока. Но товара у нас еще нет.

Далее к элементам инфоблока добавляется уже собственно экземпляр товара, который имеет характерные именно для товара свойства.

И уже к товару добавляются цены, скидки остатки по складам и т.д.

Теперь к практике.

При работе с товаром мы постоянно будем составлять массивы полей объектов. Их полное описание можно найти здесь для инфоблоков и здесь для товаров. Настоятельно рекомендуем ознакомиться с ними, так как это даст более полное понимание процесса. Так же мы не будем описывать получение переменных, подставляемых в код. Это уже зависит от вашего кода. Для примера опишем добавление цен и остатков по складам. Принцип работы с другими связанными параметрами товаров (например, скидками) такой же, а методы можно найти в документации. Также будем считать, что инфоблоки, цены, склады уже созданы.

Создание товара через API Битрикса

Сначала подключаем нужные нам модули

<?
use Bitrix\Main\Loader;

Loader::includeModule("iblock");
Loader::includeModule("catalog");
 
Как писалось выше, первым делом создаем элемент инфоблока.

// все переменные для массива определяются как строки и числа
// отдельно стоит описать добавлкение изображений
// детальная картинка (картинка анонса устанавливается так же)
$detailPicture = CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/img/det_pict.jpg");
// дополнительные картинки
// для их добавления инфоблок должен иметь свойство с кодом "MORE_PHOTO" типа "файл"
$photos = Array(
	"n0" = Array("VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/img/pict_1.jpg")),
	"n1" = Array("VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/img/pict_2.jpg")),
	"n2" = Array("VALUE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/img/pict_3.jpg")),
);

//собираем массив полей
$arFields = Array(
	"IBLOCK_ID"          => $IBlock_ID,
	"IBLOCK_SECTION_ID"  => $section,
	"NAME"               => $name,
	"CODE"               => $code,
	"ACTIVE"             => "Y",
	"DETAIL_TEXT_TYPE"   => "html",
	"DETAIL_TEXT"        => $text,
	"DETAIL_PICTURE"]    => $detailPicture;
	"PROPERTY_VALUES"    => Array(            // массив со свойствами инфоблока
		"ARTNUMBER"  => $artnumber,
		"MORE_PHOTO" => $photos,
	),
);

// создаем объект класса для работы
$obElement = new CIBlockElement();

// добавляем элемент, а ели не получается, то выводим ошибку
$ID = $obElement->Add($arFields);
if( $ID < 1 ) { echo $obElement->LAST_ERROR; }

Важный момент. Для торговых предложений инфоблок должен иметь свойство CML2_LINK (название может быть другим) типа "Привязка к товарам (SKU)" в который обязательно заносится ID товара, которому принадлежит предложение.

Элемент массива создан. Теперь превращаем его в товар. Для примера зададим товару общее количество и вес.

$productID = CCatalogProduct::add(array("ID" => $ID, "QUANTITY" => $total, "WEIGHT" =>$weight));

Тем самым мы не просто добавили значения свойств, а создали запись в таблице товаров.

Даже без цены мы уже получили товар в понимании Битрикса. Просто он "бесценный" и его нельзя продать. Но мы же понимаем, что каждый товар должен иметь свою цену, а возможно и не одну. Потому добавляем их. предположим, что у нас есть базовая цена с ID 1. Для других типов цен порядок такой же.

// добавляем цены нашему товару
// собираем массив
$arFields = Array(
	"CURRENCY"         => "RUB",       // валюта
	"PRICE"            => $price,      // значение цены
	"CATALOG_GROUP_ID" => 1,           // ID типа цены
	"PRODUCT_ID"       => $productID,  // ID товара
);
// добавляем
CPrice::Add( $arFields );

Теперь добавим количество по складам. Пример для склада с ID 1:

$arFields = Array(
	"PRODUCT_ID" => $productID,
	"STORE_ID"   => $storeID,
	"AMOUNT"     => $rest,
)
CCatalogStoreProduct::Add($arFields);

Теперь мы получили товар, имеющий все нежные необходимые характеристики.

Изменение свойств товаров через API Битрикса

При изменении свойств товаров в Битриксе нужно четко понимать какую именно его составляюoe. нужно изменить (элемент инфоблока, продукт, цену и т.д.). В зависимости от этого необходимо использовать Те или иные методы Битрикса.

Рекомендуем при работе с существующими товарами использовать только методы update, а не add даже если это разрешено документацией. Конечно это не касается случаев когда добавляется новый склад или цена.

Не забываем подключать модули (см. выше). 

Работа с элементом инфоблока. К примеру изменим описание для анонса.

// создаем объект класса для работы
$obElement = new CIBlockElement();
// обновляем элемент
$obElement->Update($ID, Array("PREVIEW_TEXT"=>$text));

Работа с продуктом. Изменим значение зарезервированного количества товаров.

CCatalogProduct::Update($ID, array('QUANTITY_RESERVED' => $reserv));

Изменение цены. Тут нужно отметить, что при работе с ценами и другими подобными параметрами товаров мы работаем не с товаром, а , в данном случае, с ценовым предложением, которое связано с товаром, но является совершенно отдельной сущностью. Обновим цену с ID 1.

// получаем ID ценового предложения
$ppID = false;
$res = CPrice::GetList( array(), array( "PRODUCT_ID" => $productID, "CATALOG_GROUP_ID" => 1 ) );
if ($arr = $res->Fetch()) {
	$ppID = $arr["ID"];
}
// собираем массив
$arFields = Array(
	"CURRENCY"         => "RUB",       // валюта
	"PRICE"            => $price,      // значение цены
);
if ( $ppID ) {
	// обновляем
	CPrice::Update( $ppID, $arFields );
}
else {
	// добавляем
	CPrice::Add( $arFields );
}

Проделаем то же самое для склада с ID 2. При этом все пояснения по ценовому предложению актуальны и здесь.

// получаем ID остатка товара на складе
$sID = false;
$res = CCatalogStoreProduct::GetList( array(), array( "PRODUCT_ID" => $productID, "STORE_ID" => 2 ) );
if ($arr = $res->Fetch()) {
	$sID = $arr["ID"];
}
// собираем массив
$arFields = Array(
	"AMOUNT"     => $rest,
);
if ( $sID ) {
	// обновляем
	CCatalogStoreProduct::Update($sID,$arFields);
}
else {
	// добавляем
	CCatalogStoreProduct::Add($arFields);
}


Конечно, о работе с товарами можно рассказывать долго, но для знакомства и начала понимания принципов управления товарами через Битрикс API этого, надеюсь, достаточно.


27.07.2017