Шпаргалка Битрикс

Проверка пользователя - администратор он или нет

global $USER;
if ($USER->IsAdmin()): // администратор
if ($USER->IsAuthorized()): // авторизован ли
if(in_array(2,$USER->GetUserGroupArray()) // пользователь в группе 2
if (CSite::InGroup( array(4,5) ) ): // пользователь в группе 4 или 5 (или в обеих)

Информация о пользователе

$rsUser = CUser::GetByID(123);
$arUser = $rsUser->Fetch();
echo $arUser["ADMIN_NOTES"];

Объекты Context, Request в Битрикс D7

// Подключение
use Bitrix\Main\Application, 
    Bitrix\Main\Context, 
    Bitrix\Main\Request, 
    Bitrix\Main\Server;

$application = Application::getInstance(); // Объект приложения
$docRoot = Application::getDocumentRoot(); // root
$connection = Application::getConnection(); // соединение с БД

$context = Context::getCurrent(); // контекст текущего хита
$request = $context->getRequest(); // объект Request
$server = $context->getServer();   // объект Server
$siteId = $context->getSite();     // ID текущего сайта ("s1")
$langId = $context->getLanguage(); // ID текущего языка ("ru")

$request = Context::getCurrent()->getRequest(); // Объект запроса
$request = $context->getRequest(); // альтернатива

$value = $request->get("param"); // получение параметра
$value = $request["param"]; // получение параметра
$values = $request->getQueryList(); // список параметров
$value = $request->getQuery("param"); // получение GET-параметра
$value = $request->getPost("param"); // получение POST-параметра
$values = $request->getPostList(); // получение списка POST-параметров
$value = $request->getFile("param"); // получение загруженного файла
$values = $request->getFileList(); // получение списка загруженных файлов
$value = $request->getCookie("param"); // получение значения куки
$values = $request->getCookieList(); // получение списка
$method = $request->getRequestMethod(); // получение метода запроса
$flag = $request->isGet(); // true - GET-запрос, иначе false
$flag = $request->isPost(); // true - POST-запрос, иначе false
$flag = $request->isAjaxRequest(); // true - AJAX-запрос, иначе false
$flag = $request->isHttps(); // true - HTTPS-запрос, иначе false
$flag = $request->isAdminSection(); // true - находимся в админке, иначе false
$requestUri = $request->getRequestUri(); // Запрошенный адрес (напр. "/catalog/category/?param=value")
$requestPage = $request->getRequestedPage(); // Запрошенная страница (напр. "/catalog/category/index.php")
$rDir  = $request->getRequestedPageDirectory(); // Директория запрошенной страницы (напр. "/catalog/category")

$server = Context::getCurrent()->getServer(); // сервер
$server->getDocumentRoot(); // DOCUMENT_ROOT
$server->getHttpHost(); // HTTP_HOST 
$server->getServerName(); // SERVER_NAME 
$server->getServerAddr(); // SERVER_ADDR 
$server->getServerPort(); // SERVER_PORT 
$server->getRequestUri(); // REQUEST_URI 
$server->getRequestMethod(); // REQUEST_METHOD 
$server->getPhpSelf(); // PHP_SELF 
$server->getScriptName(); // SCRIPT_NAME
$server->get('HTTP_ACCEPT'); // Любое значение из $_SERVER

Дата в D7

// подключение
use Bitrix\Main\Type\DateTime;
$objDateTime = DateTime::createFromPhp(new \DateTime('2020-07-10'));
$objDateTime = DateTime::createFromTimestamp(1594383132);
// или
$objDateTime = new DateTime();
$objDateTime = new DateTime("25.12.2012 12:30:00"); // из строки в формате сайта
$objDateTime = new DateTime("2007-05-14 12:10:00", "Y-m-d H:i:s"); // из строки указав формат

$objDateTime->getTimestamp(); // timestamp
$objDateTime->toString(); // формат текущего сайта
$objDateTime->format("Y-m-d H:i:s"); // произвольный формат
$objDateTime->add("1 day"); // плюс 1 день
$objDateTime->add("-1 day"); // минус 1 день
$objDateTime->add("2 months - 10 days + 15 minutes");

Информация о файле

$arFile = CFile::GetFileArray($arElement["PREVIEW_PICTURE"]);
if($arFile)
    echo '<img src="'.$arFile["SRC"].'" />';

Нарезать фото "на лету"

Полезность этой функции в том, что фото нарезается 1 раз, а потом нарезанное в нужном размере фото хранится на сервере. При повторном запуске функции нарезка не происходит и ресурсы не используются.

Таким образом мы можем показывать на сайте фото в разном размере, что сложно сделать изначально настройками инфо-блоков.

https://dev.1c-bitrix.ru/api_help/main/reference/cfile/resizeimageget.php

$resizedImage = CFile::ResizeImageGet(123, array('width'=>200, 'height'=>150), BX_RESIZE_IMAGE_PROPORTIONAL, false );
if($arFile)
    echo '<img src="'.$resizedImage["src"].'" />';

Возможные варианты:

  • BX_RESIZE_IMAGE_EXACT - точные размеры

  • BX_RESIZE_IMAGE_PROPORTIONAL

  • BX_RESIZE_IMAGE_PROPORTIONAL_ALT

Настройки сайта

$APPLICATION->GetCurPage(true); // страница
SITE_ID // ID сайта (например, s1)
LANGUAGE_ID // язык
SITE_TEMPLATE_PATH // путь к шаблону
SITE_SERVER_NAME // адрес сайта (без http://)

$rsSites = CSite::GetByID(SITE_ID);
$arSite = $rsSites->Fetch();

Хлебные крошки / breadcrumbs

$APPLICATION->SetPageProperty("NOT_SHOW_NAV_CHAIN", "Y"); // не показывать строку навигации
$APPLICATION->AddChainItem("TITLE", "PATH"); // добавить элемент
$APPLICATION->AddChainItem("TITLE"); // добавить элемент без ссылки

// Вызов компонента в шаблоне
$APPLICATION->IncludeComponent("bitrix:breadcrumb","",Array(
        "START_FROM" => "0", 
        "PATH" => "", 
        "SITE_ID" => SITE_ID 
    )
);

Подключение компонента

$APPLICATION->IncludeComponent(
    "bitrix:menu", // название компонента
    ".default",  // шаблон
    array(
        "ALLOW_MULTI_SELECT" => "N", // параметры
    ),
    false
);

Файлы в компоненте

template.php - обязательный
.parameters.php
component_epilog.php
result_modifier.php 
style.css 
style.min.css

Страница 404

require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
    CHTTP::SetStatus("404 Not Found");
    @define("ERROR_404","Y");
    require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");
    exit;

Установка заголовков

$APPLICATION->SetTitle('заголовок');
$APPLICATION->SetPageProperty("title", "Мета заголовок");
$APPLICATION->SetPageProperty("description", "Мета описание");
$APPLICATION->SetPageProperty("keywords", "Ключевые слова");

Информация о заказе

use Bitrix\Sale;
\Bitrix\Main\Loader::includeModule('sale');         
$order = Sale\Order::loadByAccountNumber('N44EM3'); // получаем заказ по коду
$order = Sale\Order::load(7); // получаем заказ по номеру

// публичную ссылку на заказ можно получить так:
if (Sale\Helpers\Order::isAllowGuestView($order))
$publicLink = Sale\Helpers\Order::getPublicLink($order);

// данные заказа
$order->getId(); // ID заказа
$order->getSiteId(); // ID сайта
$order->getDateInsert(); // дата, объект Bitrix\Main\Type\DateTime
$order->getPersonTypeId(); // ID типа покупателя
$order->getUserId(); // ID пользователя
// состояние
$order->isPaid(); // оплачен
$order->isAllowDelivery(); // разрешена доставка
$order->isShipped(); // отправлен
$order->isCanceled(); // отменен
// суммы
$order->getPrice(); // Сумма заказа
$order->getDiscountPrice(); // Размер скидки
$order->getDeliveryPrice(); // Стоимость доставки
$order->getSumPaid(); // Оплаченная сумма
$order->getCurrency(); // Валюта заказа

// массив доступных полей
$ar = $order->getAvailableFields();
$order->getField("ORDER_WEIGHT"); // Вес заказа
$order->getField('PRICE'); // Сумма заказа
$order->getField('USER_DESCRIPTION'); // Комментарий к заказу

// сохранение заказа
$order->setField('STATUS_ID', 'N');
$order->save();

Подключение файлов

// подключение служебной части пролога и эпилога
require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/epilog_after.php");

// подключение настроек при многосайтовости
require_once($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/main/include/mainpage.php");
$site_id = CMainPage::GetSiteByHost();
$page = CMainPage::GetIncludeSitePage($site_id);

// header и footer
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");

// в шапке файлов header / footer / result_modifier.php
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>

// компонент подключения файла
<?$APPLICATION->IncludeFile(SITE_DIR . "include/fileName.php",
   Array(),
   Array("MODE" => "php")
);?>

Не желательно подключать файлы css и js напрямую.

Для этого лучше всего использовать соответствующие функции 1С-Битрикс, что позволит их объединить, сжать и значительно экономить время загрузки страницы.

Включение сжатия происходит в настройках главного модуля в разделе Оптимизация CSS.

// Подключение css, js и jquery
<?$APPLICATION->SetAdditionalCSS(SITE_TEMPLATE_PATH . "/css/style.css");?>
<?$APPLICATION->AddHeadScript(SITE_TEMPLATE_PATH . "/js/script.js");?>
<?$APPLICATION->SetHeadString('<meta name="viewport" content="width=device-width, initial-scale=1">'); 
<?CJSCore::Init(array("jquery"));?>

// Подключение файлов CSS и JS в D7
use Bitrix\Main\Page\Asset; 
Asset::getInstance()->addCss(SITE_TEMPLATE_PATH . '/css/style.css');
Asset::getInstance()->addJs(SITE_TEMPLATE_PATH . '/js/script.js'); 
Asset::getInstance()->addString('<meta name="viewport" content="width=device-width, initial-scale=1">'); 

// Подключение js и css в шаблоне компонента
$this->addExternalJS('/local/js/script.js');
$this->addExternalCss('/local/css/style.css');

Шаблон

<? $APPLICATION->ShowTitle(); ?> // мета-заголовок 
<? $APPLICATION->ShowTitle(false); ?> // заголовок H1
<? $APPLICATION->ShowHead(); ?> // вывод основных тегов (Content-Type, robots, keywords, description; стили CSS; скрипты javascript)
<? $APPLICATION->ShowPanel(); ?> // выводит панель управления
<?=SITE_TEMPLATE_PATH;?> // путь к шаблону
<?=SITE_SERVER_NAME;?> // сайт
<?=LANG_CHARSET;?> // Кодировка сайта

// Мета-теги по отдельности
<? $APPLICATION->ShowMeta("description") ?>
<? $APPLICATION->ShowMeta("keywords") ?> 
<? $APPLICATION->ShowCSS(); ?> // template_styles.css и styles.css
<? $APPLICATION->ShowHeadStrings() ?> // специальные стили, JavaScript
<? $APPLICATION->ShowHeadScripts() ?> // служебные скрипты

Доступные переменные в шаблоне компонента

// путь к компоненту относительно корня сайта
$componentPath;
// путь к файлу шаблона компонента относительно корня сайта
$templateFile; 
// путь к папке шаблона компонента относительно корня сайта
$templateFolder; 
// путь к папке родительского шаблона
$parentTemplateFolder; 
// имя шаблона
$templateName; 
// массив языковых сообщений (переводов) шаблона
$arLangMessages;
// объект текущего компонента
$component; 
// ссылка на текущий шаблон (объект, описывающий шаблон, тип CBitrixComponentTemplate)
$this; 
// массив с параметрами
$arParams; 
// массив с результатом
$arResult; 
// массив для записей (обратите внимание, что здесь данные template.php могут быть переданы в файл component_epilog.php, и эти данные будут отправлены в кэш, потому что файл component_epilog.php выполняется при каждом запросе)
$templateData; 
// глобальная переменная, базовая точка входа для обращения к глобальным методам ядра
$APPLICATION;
// глобальная переменная с информацией о поситители
$USER;
// глобальная переменная для подключения к базе данных
$DB;

Пример простой страницы

<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Заголовок страницы"); ?>
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php"); ?>

Пример страницы без дизайна

require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/epilog_after.php");

Прототип страницы для работы с ajax

const NO_KEEP_STATISTIC = true;
const PUBLIC_AJAX_MODE = true;
const STOP_STATISTICS = true;
const NO_AGENT_STATISTIC = true;
const NO_AGENT_CHECK = true;
const NOT_CHECK_PERMISSIONS = true;

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

/*
code 
*/

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");

Вывод данных из справочника (highload)

Выводим массив элемента highload-блока на примере вывода данных расширенных настроек сайта. Так удобно хранить настройки сайтов, если их много в панели администратора.

// подключаем пространство имен класса HighloadBlockTable
use Bitrix\Highloadblock\HighloadBlockTable as HLBT;

// id highload-инфоблока
const MY_HL_BLOCK_ID = 1;

//подключаем модуль highloadblock
CModule::IncludeModule('highloadblock');

//Функция получения экземпляра класса
function GetEntityDataClass($HlBlockId) {
    if (empty($HlBlockId) || $HlBlockId < 1)
    {
        return false;
    }
    $hlblock = HLBT::getById($HlBlockId)->fetch();   
    $entity = HLBT::compileEntity($hlblock);
    $entity_data_class = $entity->getDataClass();
    return $entity_data_class;
}

$entity_data_class = GetEntityDataClass(MY_HL_BLOCK_ID);
$arFilter = Array(
   Array(
      "LOGIC"=>"OR",
      Array(
         "UF_SITE"=> SITE_SERVER_NAME
      ),
      Array(
         "UF_SITE"=> 'www.'.SITE_SERVER_NAME
      ),
      Array(
         "UF_SITE"=> str_replace('www.','',SITE_SERVER_NAME)
      )
   )
);
$rsData = $entity_data_class::getList(array(
   'select' => array('*'),
   'filter' => $arFilter
));

while($el = $rsData->fetch()){
    $site_info = $el;
}

Накручиваем циферки для сервиса Pagespeed

В init.php пишем код

if(stripos($_SERVER['HTTP_USER_AGENT'], 'Lighthouse') !== false){
    define('BOT_PAGESPEED',true);
    AddEventHandler("main", "OnEndBufferContent", "deleteKernelAndImage");
}
else{
    define('BOT_PAGESPEED',false);
}

function deleteKernelAndImage(&$content) {
    global $APPLICATION;
    if (strpos($APPLICATION->GetCurDir(), "/bitrix/") !== false) {
        return;
    }

    $arPatternsToRemove = Array(
        // Убираем лишние скрипты битрикса
        '/<script.+?src=".+?bitrix\/js\/main\/core\/core[^"]+"><\/script\>/',
        '/<script.+?>BX\.(setCSSList|setJSList)\(\[.+?\]\).*?<\/script>/',
        '/<script.+?src=".+?loadext[\w\d_\.\/]+\.js\?\d+"><\/script\>/',
        '/<script[^>]+?>.+?bx-core.+?<\/script>/',
        '/<script.+?src=".+?kernel_main[\w\d_\-\/]+\.js\?\d+"><\/script\>/',
        '/<script.+?>if\(\!window\.BX\)window\.BX.+?<\/script>/',
        '/<script[^>]+?>\(window\.BX\|\|top\.BX\)\.message[^<]+<\/script>/',
        // Убираем лишние стили битрикса
        '/<link.+?href=".+?kernel_main\/kernel_main_v1\.css\?\d+"[^>]+>/',
        '/<link.+?href=".+?bitrix\/js\/main\/core\/css\/core[^"]+"[^>]+>/',
        '/<link.+?href=".+?bitrix\/js\/ui\/fonts\/opensans\/ui\.font\.opensans\.min\.css\?\d+"[^>]+>/',
        '/<link.+?href=".+?bitrix\/templates\/[\w\d_-]+\/styles.css[^"]+"[^>]+>/',
        '/<link.+?href=".+?bitrix\/templates\/[\w\d_-]+\/template_styles.css[^"]+"[^>]+>/',
    );

    $content = preg_replace($arPatternsToRemove, "", $content);

    // заменяем картинки пустышками
    function getURL($matches) {
        return $matches[1] . NO_PHOTO_IMAGES;// путь типа '/bitrix/components/bitrix/catalog.element/templates/.default/images/no_photo.png'
    }

    $content = preg_replace_callback("/(<img[^>]*src *= *[\"']?)([^\"']*)/i", getURL, $content);
}

В шаблоне и прочих местах, где надо, пишем вроде такого

if (!BOT_PAGESPEED) {
    $assets->addCss(SITE_TEMPLATE_PATH . '/css/font-awesome/css/font-awesome.min.css');
}

Закрыть страницу

Где-то в начале, после пролога:

if(!$USER->IsAdmin()) 
    if (!defined("ERROR_404")) {
        define("ERROR_404", "Y");
    }

    \CHTTP::setStatus("404 Not Found");
    if ($APPLICATION->RestartWorkarea()) {
        require(\Bitrix\Main\Application::getDocumentRoot() . "/404.php");
        die();
    }
}

Проверка на Административный раздел

Определение, находимся ли мы на административной странице или нет.

Функция проверяет что мы находимся в папках "/bitrix/admin/" или "/bitrix/updates/", установлены ли константы "ADMIN_SECTION" или "BX_PUBLIC_TOOLS".

$request = \Bitrix\Main\Context::getCurrent()->getRequest();
if($request->isAdminSection())
{
    ...
}