CIBlockElement - uniqcle/Bitrix GitHub Wiki

GetList

Выборка элементов 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

Добавление элементов 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

Изменение 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);
}

GetProperty

<?
/*Без подключения этого класса работать не будет*/
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);
   }

}
?>

SetPropertyValuesEx

Обновление свойств
<!-- Подключение ядра без визуальной части -->
<? 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>';
}

Additional:

Примеры работы с множественными свойствами

⚠️ **GitHub.com Fallback** ⚠️