Если после переезда на новый хостинг у вас перестали работать некоторые функции сайта на 1С-Битрикс, то эта публикация для вас. В моем случае не работали впадающие меню, не работали функции самотестирования сайта и т.д. Браузер Google Chrome при попытке разобраться в причине неработающих выпадающих меню в консоли выдавал ошибку:
Uncaught SyntaxError: Unexpected token )
Не буду ходить вокруг до около. Причина оказалась в том, что на хостинге (в моем случае на VDS) был установлен последний релиз PHP 5.4.x, из-за чего не работали функции htmlspecialchars()
и htmlentities()
. Точнее сказать, не работали они в том виде, в каком их использует 1С-Битрикс в своем коде.
Как известно 1С-Битрикс очень привязан к кодировке windows-1251 (cp1251). В то время, как весь цивилизованный мир давно перешел на utf-8, данный движок до сих пор предлагает по умолчанию создавать сайты именно в windows-1251. Вариант использования utf-8 есть, но это, что называется, «на свой страх и риск». Ну еще бы, «по-человечески» адаптировать код движка под utf-8 разработчики долгое время не хотели. Не знаю, сделано ли это сейчас. Не слежу за новостями.
Еще совсем недавно, чтобы подружить сайт на 1С-Битрикс с кодировкой utf-8 в руководстве официально давалась рекомендация включить на хостинге для PHP «костыль», вроде mbstring.func_overload = 2
.
Функции htmlspecialchars()
и htmlentities()
имеют ряд входящих параметров, третий по счету задает кодировку. Его обычно не указывают. Зачем, если и так все работает? Видимо так и рассуждали разработчики 1С-Битрикс. Но вот незадача, начиная с версии PHP 5.4 по умолчанию для функций используется кодировка utf-8.
Если сайт использует windows-1251 и для данных функций это не сообщается, то на выходе получается пустота. Отсюда и проблемы. Для выпадающих меню в админке 1С-Битрикс просто не дописывались важные параметры в JavaScript:
<a href="javascript:void(0);" hidefocus="true" onclick="this.blur();tbl_fileman_admin_menu.ShowMenu(this, );return false;" title="Действия" class="action context-button icon"><img src="/bitrix/themes/.default/images/arr_down.gif" class="arrow" alt=""></a>
Что делать? Лучше всего не использовать 1С-Битрикс. Я серьезно! Полно других хороших движков, развивающихся в ногу со временем, тот же Drupal. Если так поступить не получится, то можете воспользоваться хостингом или сервером, где установлен PHP версии ниже 5.4. Лично меня такой вариант не устраивает, другие сайты успешно работают с новым PHP, с чего я ради какого-то «битрикса» должен менять настройки на сервере?
Через php.ini
или еще каким-нибудь способом глобально поменять кодировку по умолчанию тоже нельзя. Да и опять же, это могло бы затронуть другие сайты, что мне нафиг не надо.
Какие еще варианты? Можно попробовать обновится на более новую версию движка 1C-Битрикс, может быть там уже реализована совместимость с последними релизами PHP. Обращаю внимание, что это лишь предположение. Я не проверял! Дело в том, что текущий сайт, с которым были разбирательства, использует «1С-Битрикс Управление сайтом 11.5.6», сейчас доступна версия 12.5, которая сильно отличается, соответственно переход затруднителен. На мой взгляд, если уж заморачиваться с такими глобальными изменениями на сайте, то лучше перейти с 1С-Битрикс на другой движок.
Что в итоге сделал я? Чтобы в админке 1С-Битрикс работали выпадающие менюшки пришлось залезть в код движка и изменить одну строчку кода. Остальное править не стал, т.к. работе сайта и его наполнению это не мешает. Хотя, может я еще столкнусь с проблемами.
Итак, чтобы работали выпадающие менюшки открываем файл /bitrix/modules/main/interface/admin_lib.php
.
В нем ищем строчку:
$sMenuItems = htmlspecialchars(CAdminPopup::PhpToJavaScript($this->aActions));
и меняем на:
$sMenuItems = htmlspecialchars(CAdminPopup::PhpToJavaScript($this->aActions), null, "windows-1251");
UPD
Только этим дело не ограничилось. Уже в процессе работы с сайтом периодически возникали проблемы с наполнением. То там, то здесь, что-то не работало. Решились проблемы тем же образом. Обычно править надо тот файл, который открыт (смотрите ссылку при наполнении сайта), изредка приходится лезть в другие, подключенные выше файлы. Подключенных обычно много, поэтому сразу совет, проще искать нужный файл по названию функции.
Например, если открывается пустой редактор анонса и полного текста, то кроме bitrix/modules/iblock/admin/iblock_element_edit.php
придется пофиксить bitrix/modules/fileman/fileman.php
.