Очень часто бывают ситуации, когда возможностей привязки модулей на определенные ссылки в меню недостаточно, либо требуется более точечно отладить шаблон.
В FAQ уже существуют две замечательные темы:
Небольшие хитрости с позициями модулейОтображение модулей в зависимости от параметра переменной $taskНо здесь рассмотрим более тривиальные и простые задачи.
Задача 1 - отображать\скрывать блоки сайта в зависимости от наличия публикации модулейДля примера возьмем трехколоночный табличный резиновый шаблон, правая левая колонки по 25% ширины, центр тянется
<table width="100%">
<tr>
<td width="25%"><?php mosLoadModules ( 'left' ); ?></td>
<td>
<?php echo mosMainBody(); ?>
</td>
<td width="25%"><?php mosLoadModules ( 'right' ); ?></td>
</tr>
</table>
Делаем вот так:
<table>
<tr>
<td width="25%"><?php mosLoadModules ( 'left' ); ?></td>
<td>
<?php echo mosMainBody(); ?>
</td>
<?php
if ( mosCountModules( 'right' ) ) { ?>
<td width="25%"><?php mosLoadModules ( 'right' ); ?></td>
<?php } else {} ?>
</td>
</tr>
</table>
Что там это дает - при отсутствии опубликованных модулей в позиции RIGHT правая колонки исчезнет с сайта, и центральная с блоком mainbody будет занимать 75% ширины, вместо 50% как ранее.
Если подобную процедуру применить к левой ячейке - то mainbody вытянется на всю ширину экрана.
Задача 2 - популярный вопрос по отображению модулей (к примеру последних новостей) только на главной страницеПусть блок наших новостей расположен в центральной колонке в позиции TOP, над ним PATHWAY. Нам надо чтобы на главной были последние новости но не мешался mainbody и не было pathway, на других страницах убирался модуль и был pathway с mainbody
<table width="100%">
<tr>
<td width="25%"><?php mosLoadModules ( 'left' ); ?></td>
<td>
<?php if ( !isset($option) || @$option=='com_frontpage' ) {
mosLoadModules ( 'top' ); } else { ?>
<div><?php echo mosPathWay(); ?></div>
<div><?php echo mosMainBody(); ?></div>
<?php } ?>
</td>
<td width="25%"><?php mosLoadModules ( 'right' ); ?></td>
</tr>
</table>
Должен сказать - весьма популярная конструкция, сам часто пользуюсь.
Задача 3 - "как скрыть правую колонку для форума"Конструкция аналогично вопросу 2, только заменяем com_frontpage на название компонента.
К примеру com_firebird и применяем условие к правой колонке.
Задача 4 - разные картинки для разных страниц сайтаМожно найти какой нибудь модуль, написать свой, я же приведу одно из решений - когда мало того, что надо менять картинку на заранее определенную для страницы, так эта картинка должна быть фоновой для какого то элемента.
<?php
if (@$Itemid == '1') {
$modulecss = 'img1';
} if (@$Itemid == '44') {
$modulecss = 'img2';
} else { $modulecss = 'img1'; }
?>
<div class="<?php echo $modulecss; ?>"></div>
В файле стилей делаю два класса:
img1 { background: url(img1.jpg); }
img2 { background: url(img2.jpg); }
У главной страницы ItemID равен 1 - будет работать класс img1 с фоновой картинкой img1.jpg
Для страницы с ItemID 44 - соответственно класс img2 с картинкой img2.jpg
Для всех остальных страниц по умолчанию класс img1
Что такое ItemID
здесьЕсли же нам требуется просто поместить разные картинки на разные пункты меню, то будет выглядеть примерно так:
<?php
if (@$Itemid == '11' ) { echo "<img src='images/ico/1.gif' border='0' />";
} elseif (@$Itemid == '12' ) { echo "<img src='images/ico/2.gif' border='0' />";
} elseif (@$Itemid == '13' ) { echo "<img src='images/ico/3.gif' border='0' />";
} else {}
?>
Совмещяя данный пример с любым предыдущим - можно отображать элементы также и по идентификаторам пункта меню.
Кстати данный пример можно использовать для задания разным страницам сайта различного оформления CSS (е примеру background-color) без подключения дополнительных файлов стилей.
Обычно подобный прием я использую, если надо сделать разные шапки для разных страниц
Задача 5 - как избежать множества шаблонов, но сохранить возможность индивидуальной настройки главной и внутренних страницОткрываем index.php нашего шаблона и в нем пишем:
<?php
defined( '_VALID_MOS' ) or die( 'ERROR' );
switch ($option) {
case 'com_frontpage': //for main page
include_once ('front.php');
break;
default: // default for all pages
include_once ('inner.php');
break;
}
?>
Что происходит - front.php и inner.php становятся как бы индексными из разных шаблонов, содержимое каждого такого файла уже будет в точности соответствовать index.php разных шаблонов. Можно подключать различные стили CSS, графику, скрипты.
Можно продолжить данный кейс и отдавать разные страницы другим компонентам.
ИтогиКомбинируя данные приемы можно очень гибко управлять шаблоном, адаптируя практически любой дизайн под joomla
Внимание - в лоб применить данные приемы возможно лишь тогда, когда шаблон вы делаете самостоятельно. В большинстве же случаев (особенно если шаблон на DIV) - придется хорошенько покопаться в файле template_css.css