Joomla! Україна

Блоги — цікаві статті та записи про Joomla, програмування, верстку та інше.
  • Версія Joomla! від 13.08.2019
  • 1229 користувачі
  • 60 записи в блогах
  • 788 новини та статті
     

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

18.11.2011, 22:53 |  Прочитано: 5030 раз  |  Для розробників  |  Автор: smart

(0 голоси)

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