Давно мучаюсь с этой задачей. Мне не нравится стандартное расположение тегов и ссылок в head.
Удалось переписать весь head под себя в шаблоне. При этом убрал из шаблона строку <jdoc:include type="head" />.
Но, при подключении сторонних модулей, как и ожидал, появились "нюансы".
Покажу на примере подключения файлов скриптов. Для этого использую в head следующую конструкцию (взял и немного переделал под себя из файла libraries\joomla\document\html\renderer\head.php):
$static_domain = preg_replace('/\/$/','',str_replace('www','static',JURI::base())); // тут для статичного контента меняю адрес на другой домен
foreach ($this->_scripts as $strSrc => $strAttr) {
$mime = (!is_null($strAttr['mime']))? ' type="'.$strAttr['mime'].'"' : '';
$defer = ($strAttr['defer'])? ' defer="defer"' : '';
$async = ($strAttr['async'])? ' async="async"' : '';
echo '<script src="'.$static_domain.$strSrc.'"'.$mime.$defer.$async.'></script>'."\n";
}
В итоге нормально подключаются стандартные скрипты Joomla. В исходном коде страницы в нужном месте появляются ссылки:
<script src="http://static.mydomain.com/media/system/js/core.js" type="text/javascript"></script>
<script src="http://static.mydomain.com/media/system/js/mootools-core.js" type="text/javascript"></script>
<script src="http://static.mydomain.com/media/system/js/caption.js" type="text/javascript"></script>
Аналогичным образом работают links. При включении в админке "отображать ссылки на rss-ленту" в исходном коде в head появляются соответствующие ссылки *.feed...
Для ссылок использую в файле шаблона конструкцию (тоже слегка модифицированную из файла libraries\joomla\document\html\renderer\head.php):
foreach ($this->_links as $link => $linkAtrr) {
$attribs = ($linkAtrr['attribs'])? ' '.JArrayHelper::toString($linkAtrr['attribs']) : '';
echo '<link href="'.$link.'" '.$linkAtrr['relType'].'="'.$linkAtrr['relation'].'"'.$attribs.' />'."\n";
}
В исходном коде страницы появляются ожидаемые ссылки:
<link href="/power/heat-guns/gas-heat-guns-direct-heating.feed?type=rss" rel="alternate" type="application/rss+xml" title="RSS 2.0" />
<link href="/power/heat-guns/gas-heat-guns-direct-heating.feed?type=atom" rel="alternate" type="application/atom+xml" title="Atom 1.0" />
Я был безмерно счастлив. В принципе, всё работает. Ссылки, когда надо подключаются, когда надо - отключаются.
Но потребовалось установить модуль RokTabs. И вот тут столкнулся с неприятностью.
Сам модуль подключает свои файлы в head следующим образом:
$document =& JFactory::getDocument();
$path = JPATH_SITE . '/modules/mod_roktabs/tmpl/';
$uri_path = JURI::Root(true).'/modules/mod_roktabs/tmpl/';
$style_css = $path . $style . '/roktabs.css';
$css = $uri_path . $style . '/roktabs.css';
if (file_exists($style_css)) $document->addStyleSheet($css);
if (!defined('ROKTABS_JS')) {
$document->addScript($uri_path . 'roktabs'.modRokTabsHelper::_getJSVersion().'.js');
define('ROKTABS_JS',1);
Соответственно, я ожидаю, что новые файлы от стороннего модуля будут помещены в массив данных head, вместе со стандартными файлами mootools. И оттуда (из массива) я их выберу и включу в файле шаблона.
Но там их нет!Проверил, поместив следующий код в файл index.php шаблона:
<?php $head = $this->getHeadData();
$output = print_r ($head, true);
echo $output; ?></p>
В результате при обновлении страницы с опубликованным модулем RokTabs получил содержимое всего массива head в следующем виде:
Array (
[title] => Главная
[description] => Тут выводится описание (description)
[link] =>
[metaTags] => Array (
[http-equiv] => Array (
[content-type] => text/html
)
[standard] => Array (
[robots] => index, follow
[keywords] => Тут отображаются мои ключевые слова
[rights] =>
)
)
[links] => Array ( )
[styleSheets] => Array ( )
[style] => Array ( )
[scripts] => Array (
[/media/system/js/core.js] => Array (
[mime] => text/javascript
[defer] =>
[async] =>
)
[/media/system/js/mootools-core.js] => Array (
[mime] => text/javascript
[defer] =>
[async] =>
)
[/media/system/js/caption.js] => Array (
[mime] => text/javascript
[defer] =>
[async] =>
)
)
[script] => Array ( )
[custom] => Array ( )
)
Я привёл вывод содержимого массива head при отображении главной страницы сайта, с включенным модулем RokTabs (модуль опубликован на главной странице и на всех остальных).
Я констатирую, что в исходном коде страницы при использовании в head стандарной строки <jdoc:include type="head" /> скрипты и стили от модуля RokTabs присутствуют вместе со скриптами mootools.js.
Также из вывода массива видно, что скрипты в массиве head присутствуют. НО ТОЛЬКО СТАНДАРТНЫЕ (mootools и т.п.). Сторонних скриптов (от модуля RokTabs) там нет! Они есть в исходном коде страницы, но их нет в массиве head! Вопрос: почему?
Куда тогда помещаются скрипты и файлы стилей сторонних модулей, если не в массив head? Как в таком случае их перехватить и включить в head в файле шаблона? К переменной $buffer обращаться чтоли? Или как?
Читал по этому поводу документацию по ссылке: _http://docs.joomla.org/JDocument/addScript
Там, в частности, сказано:
To add a link to some JavaScript code at a specific URL, you could use:
$doc =& JFactory::getDocument();
$doc->addScript("http://www.example.com/js/myscript.js");
How this is rendered depends on the document type. If the document type is HTML then this code will produce following link in the HTML HEAD section:
<script type="text/javascript" src="http://www.example.com/js/myscript.js"></script>
Как там написано, так скрипты от модуля RokTabs и подключаются. Но почему в массиве-то их нет, а на HTML странице они есть? Откуда они берутся?
Если эту проблему решить, то head можно будет генерировать в файле шаблона самостоятельно, и размещать теги в нужной последовательности.
Кстати, скрипты я вообще подключаю в самом конце страницы, перед закрывающим тэгом </body>.