Тип ModuleLayout в параметрах модулів Joomla 1.5
18.11.2011, 22:53 | Прочитано: 6983 раз | Для розробників | Автор: smart
В Joomla 1.7 у модулів з'явився досить зручний функціонал — можливість вибору layout'а в параметрах модуля зі списку (причому, якщо в якомусь із шаблонів сайту даний layout перевизначений або доданий альтернативний — він теж буде присутній у списку). А ось в Joomla 1.5 цього сильно не вистачало.
Нещодавно я знайшов на форумі непогане рішення від користувача danik.html і трохи його допрацював.
Рішення досить просте — додаємо аналогічний елемент в дистрибутив модуля, додаємо XML-маніфесті модуля посилання на папку з елементом і додаємо новий параметр до існуючих параметрах модуля. Як ім'я умовного модуля (для прикладу) вибрано mod_latestnews
.
Увага! Незабудьте змінити назву модуля на свою!
-
Створюємо файл
modulelayout.php
такого змісту:<?php defined('_JEXEC') or die; 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 = array(); $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 (is_dir($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 (is_dir($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-маніфест модуля зміни описані в цій статті.