Как использовать headjs с Joomla?

Попытка использовать HeadJS в Joomla. Я добавил код в свой шаблон — он захватывает файлы javascript в выводе head, подготавливает строку для их вывода между кодом head.js, затем удаляет все файлы javascript из тега вывода joomla head.

Проблема в том, что некоторые скрипты загружаются после шаблона. Например, модуль поставит в очередь некоторые файлы сценариев после загрузки шаблона, поэтому его файлы появятся за пределами моего кода head.js. Любые идеи, как я могу это контролировать?

$data = $this->getHeadData();

if( $data['scripts'] ){
    foreach ($data['scripts'] as $url=>$type){
        if( !strstr($url, 'ajax.googleapis.com/ajax/libs/jquery') )
        $headjs[] = $url;
    }
    unset( $data['scripts'] );
    $data['scripts'][$template . '/js/head.js'] = array(
        'mime' => 'text/javascript',
        'defer' => false,
        'async' => false);
    $this->setHeadData($data);
}

А потом...

 <script>
        head.js(
        <? foreach($headjs as $script): ?>
            '<?=$script?>',
        <? endforeach; ?>
            function(){
            }
        );
    </script>

person codemonkey613    schedule 31.08.2011    source источник


Ответы (1)


Различные расширения могут подключаться к различным событиям, которые запускаются во время обработки вывода (даже после рендеринга шаблона).

Лучший вариант, который я нашел до сих пор, - это создать системный плагин и переместить его в последний из доступных системных плагинов.

Теперь у вас есть два варианта:

  1. используйте событие onBeforeCompileHead (думаю, это было введено в Joomla 1.5.23) для перемещения скриптов в headjs .
  2. используйте событие onAfterRender и проанализируйте HTML-код заголовка, чтобы он загружался с использованием headjs.

Это нормально, если вы играете с асинхронной загрузкой скриптов, где у вас есть полный контроль над веб-сайтом, но это почти невозможно реализовать в качестве универсального расширения для Joomla. Некоторые расширения используют встроенные скрипты в голове, некоторые в теле html, и вам придется сохранить порядок выполнения (простой пример: Mootools должны загружаться первыми).

Я использую для асинхронной загрузки только те сценарии, которые я включил сам (в свой шаблон или расширение). Любые скрипты, которые добавляются вместе с ядром Joomla (Mootools, core.js и т.д.) или другими расширениями, я не трогаю.

person piotr_cz    schedule 25.10.2011