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

29.09.2020

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

Получаем "пользовательские свойства" (цвет, картинка, и т.д.):

1
$aProp = CIBlockElement::GetByID($aItem['ID'])->GetNextElement()->GetProperties();

Битрикс тесторование (Битрикс самопроверка)

Запустить проверку можно из раздел Настройки - Инструменты - Проверка системы (http://SITE.local/bitrix/admin/site_checker.php?lang=ru)

Самопроверка Bitrix выдает ошибку. Проблема с сокетами.

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

1
require_once($_SERVER['DOCUMENT_ROOT']. "/bitrix/modules/main/include/prolog_before.php");

Получить все категории со значениями SEO метатегов:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    $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):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    $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 каталог получить значение свойства.

1
2
3
4
5
6
7
8
9
10
11
$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;  
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$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'],
    );
}

Получение списка товаров:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$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>';
  }
}

Получение списка товаров для определенной категории со свойствами:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$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++;
}

Получение всех категорий/разделов, к которым относиться товар:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$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>';
}

Получение картинки:

1
2
3
4
5
// Сразу выводит изображение
echo CFile::ShowImage($row['PICTURE'], 200, 200, "", "", true);
 
// Возвращает массив с данными о фотографии
$file = CFile::GetFileArray($row['PICTURE']); 

Включенние вывода всех товаров каталога, если категория не указана:

1
2
3
4
5
6
7
8
9
10
11
// bitrix/components/bitrix/catalog/templates/.default/section.php
 
$APPLICATION->IncludeComponent(
  'bitrix:catalog.section',
  '',
  array(
      'SHOW_ALL_WO_SECTION' => 'Y', // показывать товары, если не задан раздел
      // …
  ),
  $component
);

Пример вывода всех товаров из категории, со значением свойства "ASKARON_REVIEWS_COUNT" больше 0

1
2
3
4
5
6
7
8
9
10
$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>';
}

Подробнее:
Основная функция
Фильтр по числам
Фильтр по маскам (для определенных типов полей)

Как повлиять на выводимые в каталоге товары:

1
2
3
4
5
6
7
8
9
10
11
12
13
  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(
      ...
  ...

Получение товаров из корзины:

С проверкой, есть ли товароы в корзине из определенной категории.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Проверка на наличие продукции "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;
    }
  }
}

Обновление цены товара (у товарного предложения):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  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 нужной выгрузки. Посмотреть его можно в пенале администрирования.

1
CCatalogExport::PreGenerateExport(10);

Как программно добавить товар:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?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:

1
2
3
4
5
6
7
8
9
10
if (!($arOrder = CSaleOrder::GetByID($ORDER_ID)))
{
   echo "Заказ с кодом ".$ORDER_ID." не найден";
}
else
{
   echo "<pre>";
   print_r($arOrder);
   echo "</pre>";
}

Получение цены товара (стоимость товара) по его ID:

1
'price' => CPrice::GetBasePrice($arItem['ITEM_ID'])['PRICE'];

bitrix includearea:

Как добавить в bitrix Include Area

Данные из заказа (текущей корзины):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* Возвращает сумму текущего заказа из в корзине
*
* @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:

1
2
3
$res= \CIBlockElement::GetByID( $id );
$aTMP = $res->GetNext();
echo $aTMP[ 'DETAIL_PAGE_URL' ];

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