Битрикс. Переход на php7

Часть 1. Стандартные правки для перехода Битрикса

Битрикс совместим с php7 (конечно, совместимость плагинов не гарантируется, но большинство из них — работают в семерке).

Самое мощное отличие при переходе на php7 — использование расширения mysqli вместо mysql.   Для того, чтобы использовать mysqli, необходимо отредактировать два конфигурационных файла.

В файле /bitrix/php_interface/dbconn.php нужно добавить, если нет, в конец строчку

define("BX_USE_MYSQLI", true);

В файле /bitrix/.settings.php надо настроить connections:

  'connections' => 
  array (
    'value' => 
    array (
      'default' => 
      array (
        'className' => '\\Bitrix\\Main\\DB\\MysqliConnection',
        'host' => 'localhost',
        'database' => '...',
        'login' => '...',
        'password' => '...',
      ),
    ),
  ),

У меня на сайте есть работа напрямую с базой, не через функции Битрикса.  Так уж исторически сложилось, а править сотни строк кода — нет возможности-времени.  Поэтому мне приходилось переключаться между php 5 и 7 несколько раз, чтобы проверить работу того или иного модуля.
Чтобы не править конфигурационные файлы каждый раз при переключении, я внесла в них проверку на версию php:

$ver=phpversion(); if($ver[0]<7) ... else ....

Часть 2. Правка обращений напрямую  к базе

  1. Включаем режим отладки, чтобы видеть ошибки. В файле /bitrix/.settings.php ставим переменную debug в true.
  2. Пишем функцию подключения к базе в отдельный файл, чтобы при смене логина-пароля необходимо было править в одном месте.
      $mysqli= new mysqli('localhost', '...', '...', '...'); 
  3. В темплейтах, где использовалось подключение к базе не через функции Битрикса:
    1. Вызываем функцию подключения к базе.
    2. Меняем конструкции вида
      $rows = mysql_query($qu);
      while($row = mysql_fetch_array($rows))

      на

      $result = $mysqli->query($qu);
      while($row = $result->fetch_array(MYSQLI_BOTH)).
      

      Я меняла не абсолютно, а используя перед вызовом функций проверку на версию php. Если версия стара — то вызов старой функции, если нова — то новой.

    3. Помним, что новшества работой с базой не ограничиваются. Возможно, вы используете устаревшие функции, которые также будут выдавать ошибку. Например — split отменен, за него теперь explode (структура вызова функции — та же). Ereg и его производные больше не используются, заменены на близкие preg. Тут, конечно, включенный режим отладки здорово помогает.

Умный фильтр на Битриксе

«Умный фильтр» — стандартный компонент Битрикса.
Его главная фишка в том, что результаты фильтрации отображаются на налету генерируемой странице с уникальным адресом, содержащим параметры поиска.
Например /topki/filter/brend-is-kratki/apply/
В этой заметочке я хочу написать о правильной настройке фильтра.
1. Красивого адреса мало, для страницы нужны метатеги и уникальное описание. Изобретать велосипед тут не будем, есть уже готовые плагины.
Их много, цены разные. Мы выбрали вот этот:
http://marketplace.1c-bitrix.ru/solutions/grain.seo/#tab-comments-link — есть тестовый период, скромная цена. И функционал не подвел, настроилось за 5 минут и все обещанное работает.
2. Адрес все же выходит не такой уж и красивый.
/topki/filter/brend-is-kratki/apply/ — filter, -is-, apply — лишние служебные слова не украшают адрес.
Поколдуем с ними.
2.1. apply убирается в настройках каталога без проблем.
2.2. filter убрать совсем нельзя. Это маркер для обработчика адресов каталога, он сообщает, что данный адрес на странице показывает не товар, а список отфильтрованных товаров. Но заменить его на что-то другое — возможно. Например — на некоторую короткое слово, возьмем, допустим, «kod». Это делается также в настройках каталога.
2.3. служебное слово -is- можно заменить в коде плагина /bitrix/components/bitrix/catalog.smart.filter/class.php
Для этого строку
$smartPart = preg_split("/-(from|to|is|or)-/", $smartPart, -1, PREG_SPLIT_DELIM_CAPTURE);
меняем на
$smartPart = preg_split("/(-from-|-to-|-|-or-)/", $smartPart, -1, PREG_SPLIT_DELIM_CAPTURE);
Соответственно редактируем и обработку smartpart несколькими строками ниже (учитывая, что «is» у нас стало «-«, а «from» и остальные — имеют формат «-from-«).
А также заменяем в конце файла $urlPart .= urlencode('-is-'.$smartElement);
на $urlPart .= urlencode('-'.$smartElement);
2.3. В результате трансформаций получаем адрес такого типа:
/topki/kod/brend-kratki/, что выглядит уже прилично и полезно.

Экономим место (Битрикс)

Иногда возникает проблема нехватки места.
Из админки битрикса можно удалить без потери функционала демо-данные (более 100мб в сумме):
11M — /bitrix/modules/bitrix.sitecorporate
55M — /bitrix/wizards
42M — /bitrix/modules/bitrix.eshop