CIBlockElement - uniqcle/Bitrix GitHub Wiki
Выборка элементов CIBlockElement::GetList
protected function doAction()
{
$this->arResult['ITEMS'] = [];
$rs = CIBlockElement::GetList(
['CODE' => 'ASC'], // Порядок
['ACTIVE' => 'Y', 'IBLOCK_ID' => $this->arParams['IBLOCK_ID']], // Фильтрация
false,
['nTopCount' => $this->arParams['COUNT']], // Кол-во на странице
['IBLOCK_ID', 'ID', 'NAME', 'PREVIEW_TEXT', 'CODE'] // Выборка
);
$rs ->SelectedRowsCount(); // Кол-во записей, кот. вернулись
//GetNextElement() возвращает объект
// - Если используете GetNextElement то $arSelect не учитывается.
// - Когда используем свойства DETAIL PAGE URL
// - Когда выбираем св-ва с множественным типом
// - Когда используем расчетные поля SEO(meta, alt)
//Такой вариант выборки очень не оптимальный и если у вас много данных выборка будет очень долгая,
// лучший вариант это сделать выборку через Fetch и указать только нужные поля и свойства в $arSelect
while( $ob = $rs->GetNextElement() ){
$arFields = $ob->GetFields();// получаем поля инфоблока итерации
$arProp = $ob->GetProperties();// получаем свойства итерации
pre($arFields);
}
// Fetch возвращает массив
while( $elem = $rs->Fetch() ){
$this->arResult['ITEMS'][$elem['ID']] = $elem;
}
}
Добавление элементов Add D7
<!-- Подключение ядра без визуальной части -->
<? require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
$urlRoot = __DIR__ . '/data/data.xml';
//Подключаем объект XML
$xmlObj = simplexml_load_file($urlRoot);
$elemObj = new CIBlockElement;
$countProduct = 0;
$countOffer = 0;
foreach($xmlObj->product as $product) {
//Для удобства работы переводим объект в массив
$product = xml2array($product);
//Заполняем свойства, кот. необходимо предварительно добавить в админке
$arProps = [
'SYKNO' => $product['SYKNO']['VARIANT'],
'VIKRASKA' => $product['VIKRASKA']['VARIANT'],
'IMAGES' => $product['IMAGES']['OPTION'],
];
foreach ($product['IMAGES']['OPTION'] as $img) {
$arProps['IMAGES'][] = CFile::MakeFileArray($img);
}
//Заполняем стандартные поля Элемента
$arFields = [
'NAME' => $product['NAME'],
'IBLOCK_ID' => CONST_IBLOCK_ID, //ID инфоблока
'IBLOCK_SECTION_ID' => CONST_SECTION_ID, //ID раздела
'CODE' => $product['CODE'],
'DETAIL_TEXT' => $product['DESCRIPTION'],
'PROPERTY_VALUES' => $arProps,
'ACTIVE' => 'Y'
];
//Добавили элемент
if ($elemID = $elemObj->Add($arFields)) {
//Элемент инфоблока создан.
//Теперь превращаем его в товар. Для примера зададим товару общее количество и вес.
$arFields = [
'ID' => $elemID,
'QUANTITY' => 1,
'PURCHASING_CURRENCY' => 'USD',
'WEIGHT' => 100
];
//Добавили св-ва торг. каталога
CCatalogProduct::Add($arFields);
$offerElem = new CIBlockElement();
//Обработка торговых предложений
foreach ($product['OFFERS']['OFFER'] as $offer) {
$offer = xml2array($offer);
//Свойство торгового предложения
$propsOffer = [
'CML2_LINK' => $elemID,
'TABLE_TYPE' => $offer['TABLE_TYPE'],
'SIZE_FIELD' => $offer['SIZE_FIELD'],
'QTY_LEGS' => $offer['QTY_LEGS']
];
//Формирует название торг. предложения
$nameOffer = implode(',', [
$offer['TABLE_TYPE'],
$offer['SIZE_FIELD'],
$offer['QTY_LEGS']
]);
$arFields = [
'NAME' => $nameOffer,
'IBLOCK_ID' => CONST_OFFERS_IBLOCK_ID,
'PROPERTY_VALUES' => $propsOffer,
'ACTIVE' => 'Y'
];
if ($elemOfferID = $offerElem->Add($arFields)) {
//Добавляем свойств торг. каталога для торгового предложения
$arrOffersFields = [
'ID' => $elemOfferID,
'QUANTITY' => 10,
'WEIGHT' => $offer['VES']
];
CCatalogProduct::Add($arrOffersFields);
// добавляем цены нашему товару
// собираем массив
$arFields = Array(
"CURRENCY" => "RUB", // валюта
"PRICE" => $price, // значение цены
"CATALOG_GROUP_ID" => 1, // ID типа цены
"PRODUCT_ID" => $elemOfferID, // ID товара (элемента инфоблока)
);
// добавляем цену
CPrice::Add( $arFields );
//Теперь добавим количество по складам. Пример для склада с ID 1:
$arFields = Array(
"PRODUCT_ID" => $ID,
"STORE_ID" => $storeID,
"AMOUNT" => $rest,
);
CCatalogStoreProduct::Add($arFields);
$countOffer++;
} else {
echo $elemOfferID->LAST_ERROR;
}
$countProduct++;
}
}
}
echo 'Товаров добавлено '.$countProduct. '</br>';
echo 'Торговых предложений добавлено '.$countOffer. '</br>';
Изменение Update D7
К примеру изменим описание для анонса.
// создаем объект класса для работы
$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);
}
<?
/*Без подключения этого класса работать не будет*/
if(CModule::IncludeModule("iblock")){
/*Вместо IBLOCK_ID, впишите id инфоблока, вместо ELEMENT_ID впишите id элемента*/
$db_props = CIBlockElement::GetProperty(IBLOCK_ID, ELEMENT_ID, "sort", "asc", array("CODE"=>"CATEGORIES"));
/*Перечисляем все его свойства*/
while($ar_props = $db_props->Fetch()){
/*Выводим все параметры данного свойства*/
print_r($ar_props);
}
}
?>
Обновление свойств
<!-- Подключение ядра без визуальной части -->
<? require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
$urlRoot = $_SERVER['DOCUMENT_ROOT'].'/local/dev/sibagro/generatexml/pdf.xml';
$xmlObj = simplexml_load_file($urlRoot);
$elemObj = new CIBlockElement;
foreach($xmlObj->PRODUCT as $key => $product) {
$product = xml2array($product);
//Выборка по свойству КОД
$res = CIBlockElement::GetList(
['CODED' => 'ASC'],
['ACTIVE' => 'Y', "PROPERTY_CODED" => $product['CODED']],
false,
false,
['IBLOCK_ID', 'ID', 'NAME', 'PROPERTY_*']
);
while($elem = $res->Fetch()){
$arPdf = [];
if($elem['ID']){
foreach ($product['PDF']['OPTION'] as $pdf) {
$arPdf[] = array("VALUE" => CFile::MakeFileArray($pdf),"DESCRIPTION"=>"");
}
//Добавление, без удаления старых
//CIBlockElement::SetPropertyValueCode($elem['ID'], "PDF", $arPdf );
//Обновление, обновление без удаления старых
CIBlockElement::SetPropertyValuesEx($elem['ID'], 4, array("PDF" => $arPdf));
//Удаление
// $arPdf["del"] = "Y";
//CIBlockElement::SetPropertyValueCode($elem['ID'], "PDF", Array ("38" => Array("VALUE"=>$arPdf) ) );
unset($arPdf);
}
}
echo '<hr>';
}