Отключение скриптов mootools на уровне шаблона

Поговорим немного о том, как облегчить вывод страниц сайта на Joomla 2.5. Ни для кого не открою секрета, что в погоне за универсализацией, разработчики Joomla подгружают на все страницы сайта фреймворк Mootools. Не будем обсуждать решения разработчиков, скажу только, что это не всегда оправдано, прежде всего в плане соотношения Функционал/скорость загрузки страницы.

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


Вносить изменения будем в файл templates\имя_шаблона\index.php

Для того что бы выяснить какие переменные содержит объект нашего шаблона после строчки

defined('_JEXEC') or die;
добавим строку 

print_r($this);
В результате мы увидим структуру объекта, состоящую из массивов, с переменными вашего шаблона, весь вывод приводить не буду, кому интересно сами попробуют, приведу только то что нам пригодится для работы.

 

JDocumentHTML Object
(
    ...
    [_scripts] => Array
        (
            [/media/system/js/mootools-core.js] => Array
                (
                    [mime] => text/javascript
                    [defer] =>
                    [async] =>
                )
            [/media/system/js/core.js] => Array
                (
                    [mime] => text/javascript
                    [defer] =>
                    [async] =>
                )
            [/media/system/js/caption.js] => Array
                (
                    [mime] => text/javascript
                    [defer] =>
                    [async] =>
                )
            [/media/system/js/mootools-more.js] => Array
                (
                    [mime] => text/javascript
                    [defer] =>
                    [async] =>
                )
        )
    [_script] => Array
        (
            [text/javascript] => window.addEvent('load', function() {
                new JCaption('img.caption');
            });
        )
    ...
)

Теперь, когда мы знаем имена нужных нам переменных нашего шаблона, произведем действия, по обеспечению вывода всего этого богатства только там где это требуется или другими словами вырежем на тех страницах где он не нужен.

Когда нам может погрузка этих скриптов? На ум приходит создание нового материала или редактирование существующего. Сделаем в шаблоне проверку на эти условия.

 

$view = JRequest::getVar('view', null, 'get', 'word');
$layout = JRequest::getVar('layout', null, 'get', 'word');
if (!(($view=='form')and($layout='edit'))) {
    //выполняем код по ограничению вывода mootools
    if (isset($this->_scripts)and(count($this->_scripts))){
        foreach ($this->_scripts as $key => $value) {
            if (preg_match("/media\/system\/js/i", $key)) {
                unset ($this->_scripts[$key]);
            }
        }
    }
    //вырезаем строку  window.addEvent('load', function() { new JCaption('img.caption');    });
    if (isset($this->_script)and(count($this->_script))){
        preg_match("/window\.addEvent\('load',\sfunction\(\)\s\{[\s]*new\sJCaption\('img\.caption'\);[\s]*\}\);/iU", $this->_script['text/javascript'],$match);
        if (isset($match[0])) {
            $this->_script['text/javascript']=str_replace($match[0],'',$this->_script['text/javascript']);
        }
        //вырезаем тултип
        preg_match("/window\.addEvent\('domready',\sfunction\(\)\s\{[\s]*[$]+\('\.hasTip'\)\.each\(function\(el\)\s\{[\s]*var\stitle\s=\sel\.get\('title'\);[\s]*if\s\(title\)\s\{[\s]*var\sparts\s=\stitle\.split\('::', 2\);[\s]*el\.store\('tip:title',\sparts\[0\]\);[\s]*el\.store\('tip:text',\sparts\[1\]\);[\s]*\}[\s]*\}\);[\s]*var\sJTooltips\s=\snew\sTips\([$]+\('\.hasTip'\),\s\{\smaxTitleChars:\s50,\sfixed:\sfalse\}\);[\s]*\}\);/iU", $this->_script['text/javascript'],$match2);
        if (isset($match2[0])) {
            $this->_script['text/javascript']=str_replace($match2[0],'',$this->_script['text/javascript']);
        }
    }
}
Почему я не стал обнулять объекты _scripts и _scripts, а сделал по ним поиск, да потому что на страницах могут быть установлены компонент или модули использующие свои скрипты, без которых страница будет отображаться не корректно.

Для тех, кто хочет добиться полного уничтожения всех скриптов на страницах своего сайта, код будет следующим:

$view = JRequest::getVar('view', null, 'get', 'word');
$layout = JRequest::getVar('layout', null, 'get', 'word');
if (!(($view=='form')and($layout='edit'))) {
    //выполняем код по ограничению вывода mootools
    if (isset($this->_scripts)and(count($this->_scripts))){
        $this->_scripts=array();
    }
  
    if (isset($this->_script)and(count($this->_script))){
       $this->_script['text/javascript']='';
     
    }
}

Статья сделана по материалам JoomlaForum joomlaforum.ru/index.php/topic,197566.0.html

Выражаю благодарность участнику форума Poznakomlus за раскрытие данной темы.

Благодарю читателей за внимание!

7 комментариев
Грамматика и запятые!
Благодарю, вроде исправился.
Этого мало. Нужно еще выпиливать все behavior инициализации из шаблонов расширений. Случалось такое, когда при включении стандартного модуля авторизации страница вставала колом просто. Стандартный валидатор behavior.validate. Или заходя на страницу блога категории, там behavior.tooltips. Все это нужно брать и вычищать. Копировать шаблоны всех расширений в html/ и чистить. Иначе играем в русскую рулетку — как повезет.
Насколько я понимаю что результаты вызывов всех JHtml::_('behavior.********', true) мы как раз и чистим в объекте шаблона
<code><span class="pln">$this</span><span class="pun">-></span><span class="pln">_scrip</span></code>
<code><span class="pln">$this</span><span class="pun">-></span><span class="pln">_script</span></code>
Надеюсь автор меня не закидает камнями за мой метод =)
В продолжение развития данной темы, мои размышления.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.