Не так давно столкнулся с проблемой. Партнерский модуль на разрабатываемом сайте подключал jquery с помощью CJSCore::init().
Это привело к тому, что при работе сайта подключалась устаревшая и вобщем-то ненужная в проекте битриксовая версия jquery (1.8.3). Это в дополнение к версии jquery, подключаемой в шаблоне. Как же заставить подключать нужную версию jquery?
Решено было переделать подключение моей версии jquery посредством регистрации в CJSCore расширения с таким же именем:
Поместил этот код в шапку шаблона сайта - и мой jquery перестал вообще загружаться. Зато стал грузиться исключительно битриксовый. Даже когда я отключил партнерский модуль для проверки - все равно в итоге инициализируется битриксовый jquery.
Стало очевидно, что проблема в битриксе, точнее его внутренностях.
Немножко нырнул в глубины ядра и сразу наткнулся на следующее:
Осознав причину, нашелся и выход из ситуации.
1. Сначала инициализировать каким-либо способом любое расширение. Можно пустое.
1.2. Автоматически зарегистрируются стандартные расширения (их список можно найти в /bitrix/modules/main/jscore.php).
2. Инициализировать свою версию расширения, обозвав ее также, как и стандартное расширение. Это позволит переопределить содержимое расширения. В моем случае - размещение и версию библиотеки.
Получился такой метод
Вешаем этот код на такое событие, чтобы обойти возможные попытки другого кода подключить одноименное расширение:
И подключаем расширение в нужном нам месте (в моем случае это был хедер шаблона):
Теперь будет загружено уже переопределенное расширение.
Аналогично можно действовать и с остальными стандартными расширениями. В частности, это также способ предоставлять более свежие версии js-библиотек, загружаемых битриксом.
Это привело к тому, что при работе сайта подключалась устаревшая и вобщем-то ненужная в проекте битриксовая версия jquery (1.8.3). Это в дополнение к версии jquery, подключаемой в шаблоне. Как же заставить подключать нужную версию jquery?
Решено было переделать подключение моей версии jquery посредством регистрации в CJSCore расширения с таким же именем:
$jquery = [ 'js' => "https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js", 'skip_core' => true, ]; \CJSCore::RegisterExt('jquery', $jquery); \CJSCore::Init('jquery'); |
Стало очевидно, что проблема в битриксе, точнее его внутренностях.
Немножко нырнул в глубины ядра и сразу наткнулся на следующее:
public static function Init($arExt = array(), $bReturn = false) { global $USER; if (!self::$bInited) { self::_RegisterStandardExt(); self::$bInited = true; } |
1. Сначала инициализировать каким-либо способом любое расширение. Можно пустое.
1.2. Автоматически зарегистрируются стандартные расширения (их список можно найти в /bitrix/modules/main/jscore.php).
2. Инициализировать свою версию расширения, обозвав ее также, как и стандартное расширение. Это позволит переопределить содержимое расширения. В моем случае - размещение и версию библиотеки.
Получился такой метод
public static function registerJquery () { //Hack: when init first extension - bitrix register standart extensions $emptyHack = [ 'css' => "", 'skip_core' => true, ]; \CJSCore::RegisterExt('emptyHack', $emptyHack); \CJSCore::Init('emptyHack'); $jquery = [ 'js' => "https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js", 'skip_core' => true, ]; \CJSCore::RegisterExt('jquery', $jquery); } |
AddEventHandler("main", "OnBeforeProlog", array("\Custom\Tools", "registerJquery"), 1); |
\CJSCore::Init('jquery'); |
Аналогично можно действовать и с остальными стандартными расширениями. В частности, это также способ предоставлять более свежие версии js-библиотек, загружаемых битриксом.