В Joomla, начиная с версии 1.5, появился очень удобный вспомогательный класс JHTML с набором статичных методов для упрощения работы с HTML-разметкой документа. В том числе, присутствует метод JHTML::stylesheet, позволяющий быстро подключить требуемый CSS-файл стилей. На днях я обнаружил одно неприятное различие в работе этого метода в Joomla 1.5 и Joomla 1.7, которое создает небольшие проблемы в реализации универсального кода модуля для обеих версий Joomla.
Проблема кроется в различии сигнатур метода в этих версиях Joomla. Изначально данный метод был объявлен вот так:
function stylesheet($filename, $path = 'media/system/css/', $attribs = array())
Как видно из объявления функции в Joomla 1.5, у метода stylesheet первым параметром идет у нас имя файла стилей, вторым путь к нему (с значением по умолчанию) и далее набор атрибутов. Поэтому, если нам требовалось ранее подключить некий файл стилей для компонента и задать ему определенный атрибут, то мы вызывали данный метод так:
JHTML::stylesheet('style.css','components/com_mycomponent/css/', array('media'=>'all'));
А вот в Joomla 1.7 сигнатура метода изменилась:
public static function stylesheet($file, $attribs = array(), $relative = false, $path_only = false, $detect_browser = true)
С одной стороны - это безусловно универсально, появилась возможность подключать условные CSS-файлы для текущего браузера, но потеряна совместимость с кодом, написанным для Joomla 1.5, ибо в новой версии функции у нас есть выбор - либо мы вторым параметром передаем строку, и тогда она интерпретируется как путь, либо это массив атрибутов, и то и другое сразу - не получится.
Есть ли универсальное решение данной проблемы? Есть - отказаться от использования JHTML::stylesheet и вместо этого пользоваться методом addStylesheet класса JDocument - его сигнатура не менялась. В результате, тот же самый функционал достигается кодом:
$document = JFactory::getDocument(); $document->addStylesheet('components/com_mycomponent/css/style.css', 'text/css', null, $attribs);
Вот и все, теперь данный код будет работать одинаково в Joomla 1.5 и Joomla 1.7).