API
убрать вкладку «реклама»
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->unRegisterEventHandler("main", "OnAdminIBlockElementEdit", "seo", "\\Bitrix\\Seo\\AdvTabEngine", "eventHandler");
Пути к файлам
Получение всяких разных путей
начиная от константы __FILE__
а дальше используем это
$io = CBXVirtualIo::GetInstance();
Как получить относительный путь
$relativePath = str_replace($_SERVER["DOCUMENT_ROOT"],"",__FILE__);
CAdminList
формат массива для заголовков
array("id" => "NAME", // индекс поля в ассоциативном массиве "content" => "NAME", // текст выводимый в заголовке "sort" => "NAME", // поле для сортировки "default" => "true" ),
Создаём массив для заголовков
$arHeaders[]=array("id" => "ID", "content" => "ИД", "sort" => "ID", "default" => "true" ); $arHeaders[]=array("id" => "NAME", "content" => "Название", "sort" => "NAME", "default" => "true" );
Создаём экземпляр класса CAdminList и добавляем заголовки
$tableCode = "tbl_product_list_".md5($type.".".$IBLOCK_ID); $lAdmin = new CAdminList($tableCode, $oSort); $lAdmin->AddHeaders($arHeaders);
tableCode — должен начинаться с префикса tbl_
Добавляем данные
$row =& $lAdmin->AddRow(13,array("ID"=>13,"NAME"=>"Штаны полосатый рейс"));
$lAdmin->table_id; // ид таблицы
Для вывода корректной постраничной навигации необходимо ещё такое заклинание )
$title = 'Рекемендованные товары'; $rsData = new CAdminResult($rsData, $tableID); $rsData->NavStart(); $lAdmin->NavText($rsData->GetNavPrint($title));
Вывод списка
$lAdmin->DisplayList();
Cсылка на API bitrix
CAdminList
Форматировать дату в Bitrix
Форматирование даты
В Битрикс форматировать дату обычно удобно с функцией FormatDateEx
FormatDateEx(поле с датой, формат даты в поле, формат даты на выходе);
$dateFormatted = FormatDateEx($arItem["DATE_CREATE"],"DD.MM.YYYY","j F Y");
Cоздание highload инфоблоков
создание highload инфоблоков из sql файлов ;)
$arrErrors = $DB->RunSqlBatch($_SERVER["DOCUMENT_ROOT"]."/local/install/b_tablename.sql");
Эрмитаж Bitrix
Для того чтобы подключить эрмитаж в своей компоненте на d7
нужно сделать следующее:
в классе компонента
прописать
// Добавляем кнопки Изменить, добавить, удалить protected function setEditButtons() { global $APPLICATION; // так и не избавились от глобальных переменных if (!$APPLICATION->GetShowIncludeAreas() || $this->showEditButtons === false) { return false; } $arButtons = \CIBlock::GetPanelButtons( $this->arParams['IBLOCK_ID'], $this->arResult['ID'], $this->arParams['SECTION_ID'], array("SECTION_BUTTONS"=>false, "SESSID"=>false) ); $APPLICATION->SetEditArea( $this->getEditAreaId($this->arResult['ID']), \CIBlock::GetComponentMenu("configure",$arButtons)); }
в методе executeComponent можем вызвать этот метод перед тем как начнём создавать шаблон
$this->includeModules(); $this->getResult(); ... $this->setEditButtons(); ... $this->includeComponentTemplate($this->page);
в шаблоне компонента
вставить
<div class="element_detail" id="<?=$this->GetEditAreaId($arResult['ID']);?>" > ... </div>
ссылки по теме
свойства инфоблока
Тип Дата
"PROPERTY_TYPE"=>"S", // строка "USER_TYPE"=>"DateTime", // Дата
Тип привязка к разделу
"PROPERTY_TYPE"=>"G", // привязка к разделам (секкциям, категориям) "IBLOCK_ID" => 3, // ID инфолока в котором создаём свойство "LINK_IBLOCK_ID"=> 2 // ID инфолока категории которого привязываем "USER_TYPE"=> false,
Фильтр по свойству тип Дата
$arFilter[">=PROPERTY_DATE_END"] = date("Y-m-d", time());
Кеш в Bitrix
Вариант 1 (CPHPCache)
$cacheTime = 3600*24; // время кеширования $cacheID = $iblockCode.'/'.$sectionCode; $cachePath = '/menu'; $obCache = new \CPHPCache(); $bValidCache = $obCache->InitCache( $cacheTime, // задать ttl $cacheID, // cacheID $cachePath.'/'.$cacheID // и cachePath ); if($bValidCache)// Если кэш валиден { $arResult = $obCache->GetVars(); // Извлекаем данные из кэша } elseif( $obCache->StartDataCache() )// Если кэш невалиден { /* ------------- put to cache ------------------------------------------------ */ // вычисления $arResult["ELEMENTS"] = getElements(); // выполняем запросы к БД и заносим результаты в массив $arResult; $obCache->EndDataCache($arResult); // Пишем массив в кеш /* ------------- /put to cache ------------------------------------------------ */ }
Важно, чтобы $cacheID НЕ заканчивался слешем «/»
По-умолчанию кеш лежит в /bitrix/cache/
Шаблоны кеш-путей
- Шаблон кэш-пути для детальной страницы
сache/[iblockID]/[templateСomponentName]/[detail_elementID]
- Шаблон пути к списку элементов
cache/[iblockID]/[templateID]/[page_Num]
Вариант 2 (Встроенное автокеширование)
if ($this->startResultCache($this->cacheTime,$cacheID,$this->cachePath)){ // если кеш не валиден, делаем расчёты $arResult = getResultFromDB(); // выполняем запросы к БД и заносим результаты в массив $arResult; $this->arResult = $arResult; $this->includeComponentTemplate($this->page); // при автокеширование шаблон также кешируется за компанию }
Как прописать права для инфоблока
Задача:
Изменить права информационных блоков
Дано:
1 пользовательская группа
3 информационных блока
Решение:
//Подключаем API битрикса require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); use \Bitrix\Main\Loader; if(Loader::includeModule('iblock')){ $groupCode = 'weeks_editors'; // символьный код группы редакторов $groupID = CGroup::GetIDByCode($groupCode); // получаем ID группы // список символьных кодов инфоблоков для которых нам требуется изменить права $arIBlockCodes = array( 'candles', 'holidays', 'weekly_parts' ); $actionPermission = "W"; // права для группы на изменение / запись foreach($arIBlockCodes as $codeIBlock){ $arIBlockID[] = CIBlockWrapper::GetIdByCode($codeIBlock,SITE_ID); // конвертим символьный код инфоблока в его ID } foreach($arIBlockID as $iblockID) { $arPermissions = CIBlock::GetGroupPermissions($iblockID); // поллучаем уже существующие // права чтбы не затереть их при записи новых прав $arPermissions[$groupID]= $actionPermission; // права для группы на изменение / запись CIBlock::SetPermission($iblockID, $arPermissions); // выставляем права на инфоблок } $info[] = 'Успешно: [3] Права '.$actionPermission.' прописаны для инфоблоков('.implode(', ',$arIBlockID).')'; }else{ $errors[] = 'Ошибка: [1] Модуль информационных блоков не подключен'; }
Получить название страны по ID
Получить название страны по ID
Вариант 1
GetCountryByID($arResult["PERSONAL_COUNTRY"], "ru");
Получить список стран
$arCountries = GetCountryArray();
Положить массив в select
SelectBoxFromArray("COUNTRY_ID",$arCountries, $countryID, "выберите страну" );
Как узнать ID группы пользователя по её символьному коду
Получаем ID группы
$userGreoupBlogsID = CGroup::GetIDByCode('blogs');
недокументированная функция, забавно, но факт
Заглушка
После написания модуля заглушки для Market Place я полагал, что тема с подобными заглушками для меня закрыта, но пришла следующая.
Задача:
Во время определённого периода времени сайт должен быть:
- закрыт для посетителей
- открыт для редакторов
- открыт для администраторов
Мат. часть
Битрикс реализует закрытие публичной части от посещений отслеживая состояние site_stopped — опции главного модуля в файле prolog_after.php.
Соответственно для закрытия сайта нам необходим вызов вида
COption::SetOptionString("main","site_stopped","Y");
после этого битрикс заглянет в
/bitrix/php_interface/<ID-сайта>/include/site_closed.php
и если не обнаружит там файла, то заглянет сюда
/bitrix/php_interface/include/site_closed.php
пример содержимого такого файла
<? require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); CHTTP::SetStatus("503 Service Unavailable"); ?> <!DOCTYPE html> <html> <head> <title>Название информационного русурса</title> </head> <body> <div class="main"> <p> В связи с такими-то праздниками сайт закрыт для посещений. Бла-бла-бла с такого-то по такое-то вермя, число нужное зачеркнуть... </p> </div> </body> </html>
Решение
пришлось повесить на крон два скрипта, которые:
- в час X выключает сайт
- в час Z включает обратно
Bitrix: Кол-во страниц
$rsItems->NavPageCount - это и есть заветное кол-во страниц после выборки