В Joomla 1.7 у модулей появился достаточно удобный функционал — возможность выбора layout’а в параметрах модуля из выпадающего списка (причем, если в каком-то из шаблонов сайта данный layout переопределен или добавлен альтернативный — он тоже будет присутствовать в списке). А вот в Joomla 1.5 этого сильно не хватало. Недавно я нашел на форуме неплохое решение от пользователя danik.html и немного его доработал.
Решение довольно простое — добавляем аналогичный элемент в дистрибутив модуля, добавляем XML-манифесте модуля ссылку на папку с элементом и добавляем новый параметр к существующим параметрам модуля. В качестве имени условного модуля (для примера) выбрано mod_latestnews. Естественно, вам его нужно будет заменить на название вашего модуля.
- Создаем файл modulelayout.php следующего содержания:
<?php ('_JEXEC') or ; class JElementModuleLayout extends JElement { var $_name = 'ModuleLayout'; function fetchElement($name, $value, &$node, $control_name) { $module = $node->attributes('module'); $clientId = ($v = $node->attributes('client_id')) ? $v : 0; $db =& JFactory::getDBO(); $db->setQuery('SELECT template FROM #__templates_menu WHERE client_id = ' . $clientId); $templates = $db->loadResultArray(); $options = (); $options[] = JHTML::('select.option', '', JText::('Default')); if ($module) { jimport('joomla.filesystem.folder'); jimport('joomla.filesystem.file'); $moduleFolder = JPath::clean(JPATH_SITE.DS.'modules'.DS.$module.DS.'tmpl'); if (($moduleFolder) && ($files = JFolder::files($moduleFolder, '^[^_]*\.php$'))) { $options[] = JHTML::('select.option', '<OPTGROUP>', JText::('Module')); foreach ($files as $file) { $options[] = JHTML::('select.option', JFile::stripExt($file)); } $options[] = JHTML::('select.option', '</OPTGROUP>'); } if ($templates) { foreach ($templates as $template) { $templateFolder = JPath::clean(JPATH_SITE.DS.'templates'.DS.$template.DS.'html'.DS.$module); if (($templateFolder) && ($files = JFolder::files($templateFolder, '^[^_]*\.php$'))) { $options[] = JHTML::('select.option', '<OPTGROUP>', JText::('Template') . ' ' . $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); } }И помещаем этот файл в дистрибутив вашего модуля. Чтобы не было путаницы, лучше всего создать папку elements и поместить файл в нее.
- В XML-манифест модуля, в группу элементов files добавляем папку elements:
<folder>elements</folder>
- В XML-манифест модуля добавляем новый параметр:
<param name="layout" type="modulelayout" module="mod_latestnews" label="Layout" description="Select layout" />
Необходимо заменить mod_latestnews на название вашего модуля. В Joomla 1.7 такой атрибут не требуется, потому, что из наследника JElement можно получить информацию о модуле, а в Joomla 1.5, к сожалению, нет.
- Так как в стандартном дистрибутиве Joomla такого элемента как modulelayout нет, то нам необходимо «рассказать» Joomla об этом. Поэтому добавляем в XML-манифесте к элементу params атрибут addpath:
<params addpath="/modules/mod_latestnews/elements">
Необходимо заменить mod_latestnews на название вашего модуля.
- В самом модуле меняем строчку:
require(JModuleHelper::getLayoutPath('mod_latestnews'));на
require(JModuleHelper::getLayoutPath('mod_latestnews', $params->get('layout', 'default'))); - Все, после этого в параметрах нашего модуля можно будет выбирать layout.
Если вы хотите добавить описанный функционал в какой-то из существующих на сайте модулей, то достаточно в папке с модулем создать директорию elements, скопировать в нее файл modulelayout.php и внести в XML-манифест модуля изменения описанные в данной статье.
Источник: joomlaportal.ru



Май 25th, 2012
Archi
Опубликовано в рубрике
Метки: