Тип ModuleLayout в параметрах модулей Joomla 1.5

  • 18.11.2011

В Joomla 1.7 у модулей появился достаточно удобный функционал - возможность выбора layout'а в параметрах модуля из выпадающего списка (причем, если в каком-то из шаблонов сайта данный layout переопределен или добавлен альтернативный - он тоже будет присутствовать в списке). А вот в Joomla 1.5 этого сильно не хватало. Недавно я нашел на форуме неплохое решение от пользователя danik.html и немного его доработал.

Решение довольно простое - добавляем аналогичный элемент в дистрибутив модуля, добавляем XML-манифесте модуля ссылку на папку с элементом и добавляем новый параметр к существующим параметрам модуля. В качестве имени условного модуля (для примера) выбрано mod_latestnews. Естественно, вам его нужно будет заменить на название вашего модуля.

  1. Создаем файл 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 и поместить файл в нее.

  2. В XML-манифест модуля, в группу элементов files добавляем папку elements:

    <folder>elements</folder> 
  3. В XML-манифест модуля добавляем новый параметр:

    <param name="layout" type="modulelayout" module="mod_latestnews" label="Layout" description="Select layout" />

    Необходимо заменить mod_latestnews на название вашего модуля. В Joomla 1.7 такой атрибут не требуется, потому, что из наследника JElement можно получить информацию о модуле, а в Joomla 1.5, к сожалению, нет.

  4. Так как в стандартном дистрибутиве Joomla такого элемента как modulelayout нет, то нам необходимо «рассказать» Joomla об этом. Поэтому добавляем в XML-манифесте к элементу params атрибут addpath:

    <params addpath="/modules/mod_latestnews/elements">

    Необходимо заменить mod_latestnews на название вашего модуля.

  5. В самом модуле меняем строчку:

    require(JModuleHelper::getLayoutPath('mod_latestnews'));

    на

    require(JModuleHelper::getLayoutPath('mod_latestnews', $params->get('layout', 'default')));
  6. Все, после этого в параметрах нашего модуля можно будет выбирать layout.

Если вы хотите добавить описанный функционал в какой-то из существующих на сайте модулей, то достаточно в папке с модулем создать директорию elements, скопировать в нее файл modulelayout.php и внести в XML-манифест модуля изменения описанные в данной статье.

Обсуждение данной статьи на форуме: Предложение разработчикам модулей включать параметр выбора layout'а модуля.

Для того, чтоб оставить комментарий, авторизуйтесь через социальные сети.

Joomla!® CMS — пожалуй, лучшая система управления контентом с открытым исходным кодом

Joomla! — это больше, чем просто программное обеспечение, это люди, включающие разработчиков, дизайнеров, системных администраторов, переводчиков, копирайтеров, и, что самое главное — простых пользователей.

Мы рады пригласить вас в ряды нашего сообщества!

Скачать Joomla! 3.9.6 Документация Joomla! CMS Свернуть

Расширения Joomla

Новости портала

Новое в блогах