Bitrix
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
Административная страница модуля
Административная страница модуля в своём минимальном состоянии должна содержать следующий код:
<?php require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php"); $APPLICATION->SetTitle("Заголовок административной страницы"); // какие нить вычисления require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php"); ?> <?="какой-то функциональный код..."?> <? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php"); ?>
путь к ней:
/bitrix/modules/[partner_code].[module_name]/admin/[page_name].php
Bitrix: Подключение LESS препроцессора
Подключение LESS препроцессора
<?$APPLICATION->IncludeComponent( "olegpro:olegpro.csscompiler", "", array( "PATH" => "/bitrix/templates/aspro-scorp/less/", // Путь к папке с файлами, которые нужно компилировать "FILES" => array( // Список файлов для компиляции 0 => "style.less", ), "PATH_CSS" => "/bitrix/templates/aspro-scorp/", // Путь к папке, куда складывать скомпилированный css "CLASS_HANDLER" => "\\Olegpro\\Csscompiler\\LESSCompiler", // PHP класс-обработчик, наследуемый от класса \Olegpro\Csscompiler\Compiler(должен реализовывать метод toCss) "USE_SETADDITIONALCSS" => "Y", // Подключать скомпилированный css файл через CMain::SetAdditionalCSS()? "REMOVE_OLD_CSS_FILES" => "Y", // Удалять старые скомпилированные css файлы? "TARGET_FILE_MASK" => "styles_%s.css" // Маска файла для записи css файла. (%s обязателен, он заменится на таймштамп файла) ), false, array( "HIDE_ICONS" => "Y" ) );?>
Форматировать дату в 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 работа с БД
вариант 1
$conn = \Bitrix\Main\Application::getInstance()->getConnection(); $rsItems = $conn->query("select ID,NAME from b_iblock_element as el WHERE limit 0,5 "); while($item = $rsItems->fetch()){ // всякие манипуляции с данными }
вариант 2
use \Bitrix\Iblock\ElementTable; \Bitrix\Main\Loader::includeModule('iblock'); $LIMIT = 5; $IBLOCK_ID__VIDEO = 13; $query = new \Bitrix\Main\Entity\Query(ElementTable::getEntity()); $query->setSelect(array("ID", "NAME")) ->setFilter(array("IBLOCK_ID" => $IBLOCK_ID__VIDEO)) ->setOrder(array("ID" => "ASC")) ->setLimit($LIMIT); $rsItems = $query->exec(); while($item = $rsItems->fetch()){ // всякие манипуляции с данными }
Эрмитаж 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());
Uncaught ReferenceError: BX is not defined
Ошибка Uncaught ReferenceError: BX is not defined
Решение
- Вариант 1
В header.php подключаем ядро BX следующей строчкой
CJSCore::Init();
Кеш в 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, "выберите страну" );
Bitrix: Получаем картинки
$this->arResult["PREVIEW_PICTURE"] = \CFile::GetFileArray($this->arResult["PREVIEW_PICTURE"]); $this->arResult["DETAIL_PICTURE"] = \CFile::GetFileArray($this->arResult["DETAIL_PICTURE"]);
Как узнать ID группы пользователя по её символьному коду
Получаем ID группы
$userGreoupBlogsID = CGroup::GetIDByCode('blogs');
недокументированная функция, забавно, но факт
Bitrix d7 создание таблицы
public static function createTable(){ $connection = Application::getInstance()->getConnection(); if (!$connection->isTableExists(static::getTableName())) { static::getEntity()->createDbTable(); return true; } else return false; } public static function dropTable(){ $connection = Application::getInstance()->getConnection(); $connection->dropTable(static::getTableName()); return true; }
Bitrix: Resize Image
$arSlider=[]; foreach ($arItem["PROPS"]["MORE_PHOTO"]["VALUE"] as $fileId){ $detail = \CFile::ResizeImageGet($fileId,array("width"=>1009,"height"=>487),BX_RESIZE_IMAGE_PROPORTIONAL,true); $preview = \CFile::ResizeImageGet($fileId,array("width"=>285,"height"=>134),BX_RESIZE_IMAGE_EXACT,true); $arSlider[] = array( "DETAIL_PICTURE"=>["SRC"=>$detail["src"]], "PREVIEW_PICTURE"=>["SRC"=>$preview["src"]], ); }
Подключение скриптов в компонент
В компоненте создаём файл component_epilog.php
<? use Bitrix\Main\Page\Asset; Asset::getInstance()->addJs($templateFolder.'/your.js'); // подключаем скрипт
аналогично подключаем стили (файлы css)
<? use Bitrix\Main\Page\Asset; Asset::getInstance()->addCss($templateFolder.'/your.css'); // подключаем ваш css файл
Заглушка
После написания модуля заглушки для 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 включает обратно