Набор полезных рецептов для Bitrix

18.06.2019 02:15:22

Примеры небольших, но часто крайне полезных php сниппетов для Битрикса.

Есть системные пометки.

Все примеры, если они не в модули/компоненты битрикса должны начинаться с подключения файла:

 
  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())
        {
            $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())
        {
            if ($row['UF_SOTYPE'] == 1)
            {
              $aItems1[] = $aItem;
            }
            else
            {
              $aItems2[] = $aItem;            
            }
        }
    }

Получение списка товаров (старый "стиль"):

 
    $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;
    }

Категории: PHP, Bitrix CMS
Пометки: SEO, метатеги, раздел, название раздела, категория, meta,сео, картина раздела категории, фото, все товары. полезное битрикс
Яндекс.Метрика