Исправляем ошибку обновления «Statement violates GTID consistency»

При обновлении старых версий битрикса можно столкнуться с ошибкой

Некоторые обновления не были установлены

Ошибка в updater’e 18.5.500 модуля main: [1786] Statement violates GTID consistency: CREATE TABLE … SELECT.. Установка обновлений модуля main прервана. [CL04] Ошибка обновления модулей.

Проблема возникает, если вы используете репликацию MySQL на базе GTID. Конструкция СREATE TABLE … SELECT запрещена, т.к. существует неоднозначность при записи этой транзакции в binlog в зависимости от настроек мастера и слейва.

Читать дальше…

Расчет стоимости корзины с учетом купона на d7

При классическом использовании функционала работы с купонами в Битриксе, размер скидки и обновление цен в корзине происходит в момент сохранения заказа. До этого момента объект Basket содержит «исходную» цену товара, а DiscountCouponsManager знает о примененных купонах.

Разбираемся, как показывать цену товаров в корзине до момента оформления заказа с учетом примененных скидок.

Читать дальше…

Программно отключить NTLM авторизацию

Иногда, после разворачивания копии портала Битрикс, 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';

Json_encode для кириллицы (windows-1251)

Как известно, стандартная функция 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-кэширование. Периодически владельцы сайтов сами его включают, думая что так будет лучше.

Своя иконка для инфоблока в админке

Код, который позволяет в админке для заданного инфоблока установить свою иконку (автор Максим Смирнов, идея).

Для этого нужно:
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>

Как изменить заголовок X-Powered-CMS, отсылаемый сервером

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);
}