После интересных обсуждений по поводу переопределения 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.

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

Предлагаю всем разработчикам переходить на этот метод, если вы этого еще не сделали.