Тема такая что мне часто приходится делать шаблоны под Joomla. К счастью почти все модули написаны по канонам Joomla, и их можно перешаблонизировать в папке html/module_name/layout_name.php
Однако иногда нужно для разных экземпляров модуля иметь разный layout. Такая проблема часто возникает с mod_mainmenu и mod_newsflash.
Решение достаточно простое - добавлять к модулям параметр выбора шаблона. делается это очень просто:
1)добавляем в манифест (xml-файл модуля) новый параметр:
<param name="layout" type="modulelayout" module="mod_имя_модуля" label="Layout" description="Select layout" />
Типа modulelayout Joomla не знает, поэтому мы его создадим сами.
2)добавляем атрибут addpath элементу params:
<params addpath="/modules/mod_имя_модуля/elements">
Таким образом мы указываем что неизвестные типы параметров надо искать в данной папке
3)создаем /modules/mod_имя_модуля/elements/modulelayout.php . Вставляем туда следующий код:
[spoiler title="modulelayout.php"]
<?php
// no direct access
defined('_JEXEC') or die('Restricted access');
jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.file');
class JElementModuleLayout extends JElement
{
var $_name = 'ModuleLayout';
function fetchElement($name, $value, &$node, $control_name)
{
global $mainframe;
$db =& JFactory::getDBO();
// get current template
$query = 'SELECT template'
.' FROM #__templates_menu'
.' WHERE client_id = 0'
.' AND menuid = 0'
;
$db->setQuery( $query );
$template = $db->loadResult();
$module = $node->attributes('module');
// If a template, extension and view are present build the options.
if ($template && $module) {
// Build the search paths for layouts.
$bPath = JPath::clean(JPATH_SITE.DS.'modules'.DS.$module.DS.'tmpl');
$tPath = JPath::clean(JPATH_SITE.DS.'templates'.DS.$template.DS.'html'.DS.$module);
// Add the default option.
$options[] = JHTML::_('select.option', '', JText::_('Default'));
// Add the layout options from the first path.
if (is_dir($bPath) && ($files = JFolder::files($bPath, '^[^_]*\.php$'))) {
$options[] = JHTML::_('select.option', '<OPTGROUP>', JText::_( 'Module' ) );
foreach ($files as $file) {
$options[] = JHTML::_('select.option', JFile::stripExt($file));
}
//$options[] = JHTML::_('select.option', '</OPTGROUP>' );
}
// Add the layout options from the second path.
if (is_dir($tPath) && ($files = JFolder::files($tPath, '^[^_]*\.php$'))) {
$options[] = JHTML::_('select.option', '<OPTGROUP>', JText::_( 'Template' ) );
foreach ($files as $file) {
$options[] = JHTML::_('select.option', JFile::stripExt($file));
}
//$options[] = JHTML::_('select.option', '</OPTGROUP>' );
}
return JHTML::_('select.genericlist', $options, $control_name.'['.$name.']', null, 'value', 'text', $value);
}
}
}
[/spoiler]
Мы создали новый тип параметра, который генерирует список найденных layout'ов в папке модуля и шаблона.
4)Меняем в mod_имя_модуля.php вызов layout'а на следующий:
require( JModuleHelper::getLayoutPath('mod_имя_модуля', $params->get('layout', 'default')) );
К счастью в Joomla 1.6 тип modulelayout уже содержится в библиотеке, и все стандартные модули имеют этот параметр слава тапочкам.
Ну а пока мы живем с j 1.5 прошу разработчиков проделать эти нехитрые 4 шага чтобы помочь бедным верстальшикам обуздать ваши модули )