Главная » Joomla » Статьи о Joomla » Основы Joomla » Тип ModuleLayout в параметрах модулей Joomla 1.5
Распечатать статью

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

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

Источник: joomlaportal.ru

Вы можете оставить комментарий, или обратную ссылку на Ваш сайт.

Оставить комментарий

Похожие статьи