Git Hub
коротко
50 заметок с тегом

Bitrix

Ctrl + ↑ Позднее

CAdminList

19 января 2016, 21:14

формат массива для заголовков

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

Admin   API   Bitrix

Административная страница модуля

19 января 2016, 11:53

Административная страница модуля в своём минимальном состоянии должна содержать следующий код:

<?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
Admin   Bitrix

Bitrix: Подключение LESS препроцессора

14 января 2016, 12:48

Подключение 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

Bitrix $_POST пустой

14 января 2016, 5:03

используйте константу POST_FORM_ACTION_URI

POST

API   Bitrix

Форматировать дату в Bitrix

7 января 2016, 13:27

Форматирование даты

В Битрикс форматировать дату обычно удобно с функцией FormatDateEx

FormatDateEx(поле с датой, формат даты в поле, формат даты  на выходе);
$dateFormatted = FormatDateEx($arItem["DATE_CREATE"],"DD.MM.YYYY","j F Y");
API   Bitrix   Date

Cоздание highload инфоблоков

4 января 2016, 12:00

создание highload инфоблоков из sql файлов ;)

$arrErrors = $DB->RunSqlBatch($_SERVER["DOCUMENT_ROOT"]."/local/install/b_tablename.sql");
API   Bitrix

Bitrix работа с БД

29 декабря 2015, 13:43

вариант 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   ORM

Эрмитаж Bitrix

11 декабря 2015, 17:59

Для того чтобы подключить эрмитаж в своей компоненте на 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>

ссылки по теме

Интерфейс «Эрмитаж» с точки зрения разработчика

API   Bitrix   Ermitage

свойства инфоблока

9 декабря 2015, 15:44

Тип Дата

"PROPERTY_TYPE"=>"S", // строка
"USER_TYPE"=>"DateTime",  // Дата

Тип привязка к разделу

"PROPERTY_TYPE"=>"G",      // привязка к разделам (секкциям, категориям)
"IBLOCK_ID" => 3,                  // ID инфолока в котором создаём свойство
"LINK_IBLOCK_ID"=> 2          // ID инфолока категории которого привязываем
"USER_TYPE"=> false,
API   Bitrix   Date

Фильтр по свойству тип Дата

9 декабря 2015, 13:04
$arFilter[">=PROPERTY_DATE_END"] = date("Y-m-d", time());
API   Bitrix   Date

Uncaught ReferenceError: BX is not defined

16 ноября 2015, 18:26

Ошибка Uncaught ReferenceError: BX is not defined

Решение

  • Вариант 1
    В header.php подключаем ядро BX следующей строчкой
CJSCore::Init();
Bitrix   Javascript

Кеш в Bitrix

16 ноября 2015, 13:08

Вариант 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); // при автокеширование шаблон также кешируется за компанию
 }
API   Bitrix   Cache

Как прописать права для инфоблока

2 ноября 2015, 15:42

Задача:

Изменить права информационных блоков

Дано:

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] Модуль информационных блоков не подключен';
}
API   Bitrix

Получить название страны по ID

26 октября 2015, 20:01

Получить название страны по ID

Вариант 1

GetCountryByID($arResult["PERSONAL_COUNTRY"], "ru");

Получить список стран

$arCountries = GetCountryArray();

Положить массив в select

SelectBoxFromArray("COUNTRY_ID",$arCountries, $countryID, "выберите страну" );
API   Bitrix

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

25 октября 2015, 13:44
$this->arResult["PREVIEW_PICTURE"] = \CFile::GetFileArray($this->arResult["PREVIEW_PICTURE"]);
        $this->arResult["DETAIL_PICTURE"] = \CFile::GetFileArray($this->arResult["DETAIL_PICTURE"]);
Bitrix

Как узнать ID группы пользователя по её символьному коду

21 октября 2015, 15:15

Получаем ID группы

$userGreoupBlogsID = CGroup::GetIDByCode('blogs');

недокументированная функция, забавно, но факт

API   Bitrix   User

Bitrix d7 создание таблицы

19 октября 2015, 12:14
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;
    }
#SQL   Bitrix   D7

Bitrix: Resize Image

13 октября 2015, 14:31
$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"]],
                );
        }
Bitrix   Images   Товар

Подключение скриптов в компонент

9 октября 2015, 12:28

В  компоненте создаём файл 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 файл
Bitrix   D7

Заглушка

22 сентября 2015, 17:19

После написания модуля заглушки для Market Place я полагал, что тема с подобными заглушками для меня закрыта, но пришла следующая.

Задача:

Во время определённого периода времени сайт должен быть:

  1. закрыт для посетителей
  2. открыт для редакторов
  3. открыт для администраторов

Мат. часть

Битрикс реализует закрытие публичной части от посещений отслеживая состояние 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>

Решение

пришлось повесить на крон два скрипта, которые:

  1. в час X выключает сайт
  2. в час Z включает обратно
API   Bitrix
Ctrl + ↓ Ранее