05 сентября 2009

Хитрости в шаблонах Joomla 1.5. Часть 2: Про оформление модулей

Привет! Сегодня поговорим о внутреннем оформлении модулей, имея ввиду HTML-код, который генерируют позиции модулей (пространство имён jdoc). По умолчанию Joomla 1.5 имеет 6 способов генерации кода. Способ генерации указывается в атрибуте «style», например:
<jdoc:include type="modules" name="top" style="none" />


Рассмотрим все 6 способов более подробно:

1) style=«rounded» — выводит модуль в четырёх вложенных div'ах, для создания закруглённых углов (на самом деле сейчас эта технология устарела, есть менее ресурсоёмкие способы):
<div class="module_menu">
  <div>
    <div>
      <div>
        <h3>Main Menu</h3>
        <ul class="menu">
          <li><!-- various menu items --></li>
        </ul>
      </div>
    </div>
  </div>
</div>


2) style=«table» — выводить модуль в таблице:
<table cellpadding="0" cellspacing="0" class="moduletable_menu">
  <tr>
    <th valign="top">Main Menu</th>
  </tr>
  <tr>
    <td>
      <ul class="menu">
        <li><!-- various menu items --></li>
      </ul>
    </td>
  </tr>
</table>


3) style=«horz» — выводить модуль горизонтально в ячейке окружающей таблицы:
<table cellspacing="1" cellpadding="0" border="0" width="100%">
  <tr>
    <td valign="top">
      <table cellpadding="0" cellspacing="0" class="moduletable_menu">
        <tr>
          <th valign="top">Main Menu</th>
        </tr>
        <tr>
          <td>
            <ul class="menu">
              <li><!-- various menu items --></li>
            </ul>
          </td>
        </tr>
      </table>
    </td>
  </tr>
</table>


4) style=«xhtml» — выводить модуль в одном div-элементе:
<div class="moduletable_menu">
  <h3>Main Menu</h3>
  <ul class="menu">
    <li><!-- various menu items --></li>
  </ul>
</div>


5) style=«none» — выводить модуль без форматирования:
<ul class="menu">
  <li><!-- various menu items --></li>
</ul>


6) style=«outline» — выводить модуль с названием позиции модуля (словно также, когда к адресу сайта добавляется параметр «tp=1» для просмотра имеющихся позиций модулей в шаблоне:
<div class="mod-preview">
  <div class="mod-preview-info">left[outline]</div>
  <div class="mod-preview-wrapper">
    <ul class="menu">
      <li><!-- various menu items --></li>
    </ul>
  </div>
</div>


Хоть и имеется 6 способов, но реально из них используются только два: «xhtml» и «none». Бывают ситуации когда этого не достаточно для реализации какой-то изюменки. Что же делать? Конечно читать документацию и благодарить разработчиков Joomla, которые позаботились даже об этом и разработали возможность создавать свои типы модулей (пользовательские модули). Чтобы определить пользовательский модуль вы должны в каталоге с вашим шаблон создать каталог «html» и положить туда файл «modules.php». В этом файле вы должны определить функцию, называемую «modChrome_STYLE», где «STYLE» — это имя вашего пользовательского модуля. Эта функция будет принимать три аргумента: $module, &$params и &$attribs:
<?php
	defined('_JEXEC') or die('Restricted access');

	function modChrome_STYLE( $module, &$params, &$attribs ) 
	{
	/* chromed Module output goes here */
	}
?>

В рамках этой функции может быть использовано любое модульное свойство (в т.ч. и параметры, которые содержатся в таблице «jos_modules» вашей БД). Основными же. являются:
— $module->content — переменная выводит содержимое модуля;
— $module->showtitle — переменная возвращает значение 1, если в настройках модуля разрешено показывать заголовок модуля, иначе — 0;
— $module->title — переменная выводит заголовок модуля.

Рассмотрим небольшой пример, в котором показан способ проверки отображения заголовка модуля, а также вывод самого заголовка в случае положительного результата:
<?php
	if ($module->showtitle) 
	{
	echo '<h2>' .$module->title .'</h2>';
	}
?>


Параметры модуля можно использовать через объект $params. Например вывод суффикса класса модуля (по умолчанию это значение хранится в параметре «moduleclass_sfx») осуществляется таким способом:
<div class="moduletable<?php echo $params->get( 'moduleclass_sfx' ); ?>">
	<!-- div contents -->
</div>


Попрактикуемся! Создадим пользовательский модуль, назовём его «custom» (это значит, что при использования его в шаблоне нужно будет написать style=«custom» в <jdoc:include />). Ну а толку да от такого модуля? Нужно сделать что-то интересное, чтобы почувствовать действительную необходимость пользовательских модулей! Сделаем первое слово в заголовке модуля красным цветом, а все остальные слова — цветом по умолчанию, описанному в стилях:
<?php
	defined('_JEXEC') or die('Restricted access');

	function modChrome_custom($module, &$params, &$attribs)
	{ ?>
		<div class="moduletable<?php echo $params->get('moduleclass_sfx'); ?>">
			<?php if ($module->showtitle) : ?>
				<h3>
					<?php
						$title = $module->title;
						$title = split(' ', $title);
						$title[0] = '<span style="color:red">'.$title[0].'</span>';
						$title = implode(' ', $title);
						echo $title; 
					?>
				</h3>
			<?php endif; ?>
				<div>
					<?php echo $module->content; ?>
				</div>
		</div>
	<?php }
?>


Вот так просто, всё зависит только от вашей фантазии и уровня знаний PHP! Для тех кто внимательно читал всё выше описанное, сейчас наступило самое время сделать себе сладкий чай, тем самым подкрепить мозг и дать устоятся полученным знаниям.

Как я уже писал выше, пользовательская функция принимает три аргумента. Для чего нужны два я кое-как объяснил, остался последний — &$attribs, о нём и поговорим. Как уже стало понятно разработчики не остановились на достигнутой гибкости и решили дать возможность использовать дополнительные параметры, которые хранятся в массиве $attribs. Рассмотрим пример:
<?php
	defined('_JEXEC') or die('Restricted access');

	function modChrome_custom( $module, &$params, &$attribs ) {
		if (isset( $attribs['headerLevel'] )) 
		{
			$headerLevel = $attribs['headerLevel'];
		} else {
			$headerLevel = 3;
		}

		if (isset( $attribs['background'] )) 
		{
			$background = $attribs['background'];
		} else {
			$background = 'blue';
		}
		?>
		<div class="moduletable<?php echo $params->get( 'moduleclass_sfx' ); ?>">
			<?php
			if ($module->showtitle) 
			{
				echo '<h' .$headerLevel .'>' .$module->title .'</h' .$headerLevel .'>';
			}
			?>
			<div class="<?php echo $background; ?>">
				<?php echo $module->content; ?>
			</div>
		</div>
		<?php
	}
?>

Затем вы должны установить значения в <jdoc:include />, если вы этого не сделает, то будут использоваться значения по умолчанию: цвет синий, размер заголовка третий. Значения задаются таким образом:
1) <jdoc:include type=«modules» name=«user1» style=«custom» background=«green» /> — задаём значение цвета: background=«green»;
2) <jdoc:include type=«modules» name=«user1» style=«custom» headerLevel=«1» background=«yellow» /> — задаём значение размера заголовка и цвета: headerLevel=«1» и background=«yellow».

На этом всё! Продолжение следует…

Хитрости в шаблонах Joomla 1.5. Часть 1: Про позиции модулей
Хитрости в шаблонах Joomla 1.5. Часть 3: Всякого рода полезности
0

Комментарии:1

avatar
Здрасте!
Это всё здорово, но подскажите как решить такой вопрос
Изменить оформление ЧАСТИ заголовка модуля
НАПРИмер так
т.е. часть слова Прописные буквы, часть — строчные и это в одном слове
я в админке в заголовке модуля ставлю span
пытаюсь сохранить, но всё форматирование режется
как сделать так чтобы не резалось?
когда в sql таблице меняю заголовок как надо он изменяется
стоит войти в модуль и пересохраниться — всё пропадает
что делать?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.