AJAX запрос средствами Битрикс

Мало кто знает, что в Битриксе есть стандартные средства для отправки AJAX запросов, без использования jQuery или чистого JS.

BX.ajax({   
	url: '/include/page.php',
	data: {
	},
	method: 'GET',
	timeout: 0,
	async: true,
	processData: true,
	scriptsRunFirst: true,
	emulateOnload: true,
	start: true,
	cache: true,
	onsuccess: function(data){
	   // выполняем в случае успеха
	},
	onfailure: function(){
	   // в случае ошибки
	}
});

Создание диалоговых (модальных) окон в Битрикс

В Битриксе есть стандартная js библиотека для создания таких окон, но почему-то она плохо задокументировано.
А ведь там все просто:
Подключаем JS библиотеку через php на странице:

CJSCore::Init(array('window'));

Воздать окно с вызовом /include/page.php в нем:

var popup = new BX.CDialog({
'title':'Выбрать товары', 
'content_url':'/include/page.php', 
'width':'550', 
'height':'350'
});

где content_url — ссылка на страницу, которая будет показана, вместо этого параметра можно использовать content — который выведет произвольное содержимое, width и height размеры окна

Показать окно:

popup.Show();

Закрыть окно:

popup.Close();

Изменить на лету содержимое окна:

popup.SetContent("html внутри окна")

Изменять CSS стили окна можно как душе угодно.

Обновить или добавить значение свойства элемента Битрикс

Тут все просто, в документации функция CIBlockElement::SetPropertyValuesEx добавляет/обновляет свойство.
Есть момент, для свойств «список», нужно указывать id значения свойства,
а для свойств типа «справочник» нужно указывать символьный код значения.
Пример использования:

CIBlockElement::SetPropertyValuesEx($ID, false, array('SVOYSTVO' => 228));

где $ID — ид элемента, SVOYSTVO — символьный код свойства, 228 — значение свойства (т.к. у меня свойство список, указывает id нужного значения)

Поиск и замена значения в базе данных MySQL

Команда замены в MySQL очень простая REPLACE.
Предположим, нам нужно найти во всех записях wp_posts слово «staroe» и заменить его на «novoe»

UPDATE `wp_posts` SET `post_content` = REPLACE(`post_content`, 'staroe', 'novoe') WHERE post_content LIKE "%staroe%";

где post_content — имя столбца (в нашем случае тело записи)

Возвращение минимальной цены товара по торговому предложению Битрикс

Функцию можно добавить в init.php и получить минимальную цену любого товара.

CModule::IncludeModule('catalog');
function GetOfferMinPrice($IBLOCK_ID,$item_id){
	// получаем все торг. предложения
	$arSKU = CCatalogSKU::getOffersList($item_id, $IBLOCK_ID, array('ACTIVE' => 'Y'), array(), array());	
	// Если у товара есть торговые предложения
	if(count($arSKU)>0){
		$arr_price = array();
		foreach($arSKU as $item_s)
		{
		  foreach($item_s as $item_sku)
		  {
			// получаем цену, где 1 - тип цены
			$ret_sku = GetCatalogProductPrice($item_sku['ID'], 1);
			  if ($ret_sku['PRICE']){
				$arr_price[] = ceil($ret_sku['PRICE']);
			  }		
		  }
		}
	$itog_price_sku = min($arr_price);
	} else {
		$ret_sku = GetCatalogProductPrice($item_id, 1);
		if ($ret_sku['PRICE']){
			$itog_price_sku = ceil($ret_sku['PRICE']);
		}
	}
 
	return $itog_price_sku;
}

где, $IBLOCK_ID — ид инфоблока ,$item_id — ид товара с торговыми предложениями, если тп нет — вернет цену товара.
Пример вызова:

GetOfferMinPrice(2,10);

Добавить пункт в меню админки Битрикс

Для добавления своего пункта меню в административный раздел Битрикс, нужно в init.php
добавить функцию:

AddEventHandler("main", "OnBuildGlobalMenu", "ChangeIblockMenu");
function ChangeIblockMenu(&$adminMenu, &$moduleMenu){
	$moduleMenu[] = array(
		"parent_menu"	=> "global_menu_services", // поместим в раздел "Сервис"
		"section"	=> "change_iblock_elements",
		"sort"        => 10,                    // сортировка пункта меню
		"url"         => "change_iblock_elements.php?lang=".LANG,  // ссылка на пункте меню
		"text"        => 'Изменить категорию',       // текст пункта меню
		"title"       => 'Изменить категорию', // текст всплывающей подсказки
		"icon"        => "fileman_menu_icon", // малая иконка
		"page_icon"   => "fileman_page_icon", // большая иконка
		"items_id"    => "change_iblock_elements",  // идентификатор ветви
		"items"       => array()          // остальные уровни меню сформируем ниже.
	);
}

где global_menu_services — параметр ID одного из глобальных разделов (в нашем случае Сервис), узнать можно через инспектор кода в dom html нужного раздела id=»***»;
change_iblock_elements — название нашего пункта меню в виде символьного кода;
«change_iblock_elements.php?lang=».LANG — путь к файлу php, все они должны храниться в /bitrix/admin/ ;
fileman_menu_icon — название класса css иконки рядом с пунктом меню, можно добавить свою или использовать с другого пункта меню (в нашем случае взяли в пункта «Структура сайта»)

По ID торгового предложения получить остальные предложения в Битрикс

Предположим у нас уже есть Ид торгового, сначало нужно получить Ид основного товара, а потом по нем все его торговые предложения.
Получаем ID основного товара:

$MainElenemt = CCatalogSku::GetProductInfo( $ID_SKU );

где $ID_SKU — id торгового предложения, а $MainElenemt[‘ID’] — id товара
Получаем все остальные предложения в виде массива:

$arSKU = CCatalogSKU::getOffersList($MainElenemt['ID'], $IBLOCK_ID, array('ACTIVE' => 'Y'), array(), array());
foreach($arSKU as $item_s)
 {
   foreach($item_s as $item_sku)
   {
     var_dump($item_sku);
   }
}

где $MainElenemt[‘ID’] — ид основного товара, $IBLOCK_ID — ид инфоблока, $item_sku — массив торговых предложений

Путь из символьных кодов к разделу в Битрикс

По непонятной причине в документации api битрикса нет функции:

CIBlockSection::getSectionCodePath($ID)

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

main_section/sub_section_1/sub_section_2/this_section

Обращаю внимание, что в начале и в конце не будет слешов!

Получить SEO параметры раздела в Битрикс

Получаем SEO-параметры нужного нам раздела с помощью D7

$ipropValues = new \Bitrix\Iblock\InheritedProperty\SectionValues($id_iblock,$id_section);
$arSection_seo["IPROPERTY_VALUES"] = $ipropValues->getValues();
$page_title = $arSection_seo['IPROPERTY_VALUES']['SECTION_PAGE_TITLE'];

где
$id_iblock — ID инфоблока
$id_section — ID раздела

Получим массив всех seo-свойств в $arSection_seo[«IPROPERTY_VALUES»], можете проверить в var_dump($arSection_seo[«IPROPERTY_VALUES»]). Их может быть много.

Получить конкретное свойство, например, title раздела:

$arSection_seo['IPROPERTY_VALUES']['SECTION_PAGE_TITLE'];

Получить свойства элемента в Битрикс

Если кто не знает, то все свойства элемента ввиде массива можно получить так:

$res = CIBlockElement::GetList(Array(), Array(«IBLOCK_ID»=>2, «ID»=>10));
if ($ob = $res->GetNextElement()){
$arFields = $ob->GetFields(); // поля элемента
$arProps = $ob->GetProperties(); // свойства элемента
}

Можно упростить жизнь и написать простую функцию, поместим её в init.php

function GetValueProp($id_tov, $iblock_id, $name_prop){
$arFilter = Array("IBLOCK_ID"=> $iblock_id , "ID"=>$id_tov);
$res = CIBlockElement::GetList(Array(), $arFilter2);
if ($ob = $res->GetNextElement()){
$arFields = $ob->GetFields(); // поля элемента
$arProps = $ob->GetProperties(); // свойства элемента
$prop_value = $arProps; // массив всех свойств
if(isset($name_prop)) $prop_value = $arProps[$name_prop]['VALUE'];
}
return $prop_value;}

где
$id_tov — ID элемента,
$iblock_id — ID инфоблока, 
$name_prop — символьный код свойства

Если указать, только  $id_tov и  $iblock_id, то получить массив со всеми свойствами элемента.

Если указать еще в  $name_prop, то получим только значение нужного свойства элемента.

Пример использования:

GetValueProp(2, 10, 'DLINA');