После интересных обсуждений по поводу переопределения CSS и JS в Joomla! я (Michael Babker) совершенно случайно наткнулся на маленький и изящный секрет Joomla. Самое лучшее то, что это поддерживается в Joomla! 2.5 и Joomla! 3.0.
Так в чем же секрет!?
Секрет заключается в том, чтобы следовать правильной практике; использовать папку media для хранения медиаданных (js, css, images) ваших расширений. Если вы будете следовать тому же, как это настроено в папке /media/system, и подключать ваши медиаданные с помощью JHtml::script()
или JHtml::stylesheet()
, то API автоматически проверит наличие файла сначала в шаблоне, а потом в папке media. Больше нет причин для придумывания хаков чтобы переопределить медиаданные, если мы все станем использовать этот кусочек API.
Как это работает?
Используя мой модуль Tweet Display Back в качестве примера, для переопределения CSS я подключаю таблицу стилей вот так:
JHtml::stylesheet('mod_tweetdisplayback/construct-css3.css', false, true, false);
Важный параметр – это true
в серединке; он говорит API искать файл в папке media (параметр true
) или в другом месте (параметр false
). Если в другом месте, то просто пытается добавить файл, который вы указали. А если вы используете папку media, тогда происходит "волшебство". Используя имя файла в первом параметре, мой CSS теперь расположен в /media/mod_tweetdisplayback/css/construct-css3.css. Как я уже говорил, перед тем как искать здесь, API заглянет в ваш шаблон. Для таблиц стилей, API проверит /templates/my_template/css/mod_tweetdisplayback/construct-css3.css. Для файлов JavaScript:
JHtml::script('com_finder/indexer.js', false, true);
проверит /templates/my_template/js/com_finder/indexer.js перед тем, как использовать файл /media/com_finder/js/indexer.js. Слишком просто, не так ли?
Как мне узнать, поддерживает ли это расширение?
Ну, вы можете либо посмотреть исходный код расширения, либо попытаться проверить это на практике. Если вы видите в элементе <head>
исходного кода страницы, что файлы медиаданных загружаются из папки media, то существует большой шанс, что расширение уже это поддерживает. Например, для изменения представленного ранее примера mod_tweetdisplayback/construct-css3.css, если путем элемента <link>
является /media/mod_tweetdisplayback/css/construct-css3.css, то вы отбрасываете media из пути и тип медиа (css) из серединки, и получаете /mod_tweetdisplayback/construct-css3.css. Потом создаете переопределение /templates/my_template/css/mod_tweetdisplayback/construct-css3.css.
Если расширение это не поддерживает, то попробуйте подергать разработчика, чтобы он внес изменения в код, в противном случае вам по-прежнему придется выдумывать, как переопределять их медиаданные.
Предлагаю всем разработчикам переходить на этот метод, если вы этого еще не сделали.