Мало кто знает, что в Битриксе есть стандартные средства для отправки 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 очень простая 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 основного товара:
$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-параметры нужного нам раздела с помощью 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'); |