Короткие заметки о нестандартных или малодокументированных возможностях 1с-Битрикс.
Иногда, после разворачивания копии портала Битрикс, NTLM-авторизация становится недоступна и поэтому невозможно зайти в админку сайта. Авторизация через CUser::Authorize в этом случае тоже не работает.
Код ниже поможет программно выключить NTLM:
<?php
$_SERVER["DOCUMENT_ROOT"] = '/home/bitrix/www/';
$DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"];
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS",true);
define('BX_NO_ACCELERATOR_RESET', true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
if(!CModule::IncludeModule('ldap'))
return false;
CLdapUtil::UnSetBitrixVMAuthSupport(true);
echo 'Ntlm auth off';
Как известно, стандартная функция php json_encode() работает только с строками в кодировке utf-8. В новом ядре 1с-Битрикс появилась замечательная обертка, позволяющая не думать о текущей кодировке сайта:
// encode
$enc_value = \Bitrix\Main\Web\Json::encode($data, $options = null);
// decode
$dec_value = \Bitrix\Main\Web\Json::decode($data);
Параметры $data и $options совпадают с параметрами json_encode().
Если во время преобразования возникла ошибка, генерируется исключение \Bitrix\Main\ArgumentException.
На одном из проектов часть статических страниц не индексировалась стандартным модулем поиска. Функция CSearch::ReIndexFile() для них всегда возвращала 0, хотя для аналогичного файла из соседнего раздела отрабатывала корректно.
Для корректной индексации файлов необходимо наличие заголовка, установленного функцией $APPLICATION->SetTitle(). Вызов этой функции обязательно должен находиться в первом php-блоке кода страницы.
Такая страница будет доступна для поиска:
<?
require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");
$APPLICATION->SetPageProperty("keywords", "keywords");
$APPLICATION->SetPageProperty("description", "description");
$APPLICATION->SetTitle("Title");
?>
А такая нет:
<?require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php");?>
<?$APPLICATION->SetPageProperty("keywords", "keywords");?>
<?$APPLICATION->SetPageProperty("description", "description");?>
<?$APPLICATION->SetTitle("Title");?>
Дано: многосайтовость на разных доменах (2й способ), разные шаблоны для сайтов.
Проблема: периодически показывается контент нужного сайта в шаблоне другого. Преимущественно при первом заходе.
Решение: выключить html-кэширование. Периодически владельцы сайтов сами его включают, думая что так будет лучше.
На любом шаге установщика достаточно добавить параметр clear_db=Y в адресную строку и база данных будет очищена в процессе установки 1с-Битрикс.
Код, который позволяет в админке для заданного инфоблока установить свою иконку (автор Максим Смирнов, идея).
Для этого нужно:
1. в css создать правило #my_menu_icon { background:url(путь до иконки); }
2. в /bitrix/php_interface/init.php дописать
AddEventHandler("main", "OnBuildGlobalMenu", array("MyClass", "OnBuildGlobalMenu"));
class MyClass
{
function OnBuildGlobalMenu(&$aGlobalMenu, &$aModuleMenu)
{
$type = "articles"; // тип инфоблока
$iblock_id = 19; // ID нужного инфоблока
foreach($aModuleMenu as $i1 => $aMenu1)
{
if($aMenu1["items_id"] == "menu_iblock_/$type")
{
foreach($aMenu1["items"] as $i4 => $aMenu4)
{
if($aMenu4["items_id"] == "menu_iblock_/$type/$iblock_id")
{
$aModuleMenu[$i1]["items"][$i4]["icon"] = "my_menu_icon";
//<a id="my_menu_icon"></a> + css = result
}
}
}
}
}
}
Ссылки для печати обычно имеют вид Домен/Адрес_страницы/?print=Y Чтобы всегда иметь в ссылке актульный адрес страницы, его необходимо выводить с помощью встроенной функции GetCurPageParam(), которая позволяет удалять и добавлять параметры к текущему адресу. Соответственно html-код будет иметь вид:
<a href="<?=$APPLICATION->GetCurPageParam("print=Y", array("print"))?>" title="Версия для печати">Версия для печати</a>
CMS 1c-Bitrix отличается большой любовью везде упоминать свое название. Одним из таких мест является ответ сервера, куда автоматически подставляется строка X-Powered-CMS:Bitrix Site Manager (DEMO или хеш ключа). Если вдруг понадобится отключить, то сделать это можно 2 способами — удалить соответствующую строку в /bitrix/modules/main/include.php или добавить следующий код в /bitrix/php_interface/init.php
AddEventHandler("main", "OnBeforeProlog", "ChangeHeaders");
function ChangeHeaders() {
header("X-Powered-CMS: any_string", true);
}
Иногда в битриксе невозможно отредактировать пункты меню, кликнув на соответствующую ссылку из меню компонента в режиме правки. Проблема возникает при использовании нестандартного типа меню (в стандартной поставке это .top и .left). Для исправления ситуации нужно в настройках модуля «Управление структурой» прописать новый тип.
