0 Пользователей и 1 Гость просматривают эту тему.
  • 8 Ответов
  • 12540 Просмотров
*

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
Тема такая что мне часто приходится делать шаблоны под Joomla. К счастью почти все модули написаны по канонам Joomla, и их можно перешаблонизировать в папке html/module_name/layout_name.php

Однако иногда нужно для разных экземпляров модуля иметь разный layout. Такая проблема часто возникает с mod_mainmenu и mod_newsflash.
Решение достаточно простое - добавлять к модулям параметр выбора шаблона. делается это очень просто:

1)добавляем в манифест (xml-файл модуля) новый параметр:
Код: xml
<param name="layout" type="modulelayout" module="mod_имя_модуля" label="Layout" description="Select layout" />
Типа modulelayout Joomla не знает, поэтому мы его создадим сами.
2)добавляем атрибут addpath элементу params:
Код: xml
<params addpath="/modules/mod_имя_модуля/elements">
Таким образом мы указываем что неизвестные типы параметров надо искать в данной папке
3)создаем /modules/mod_имя_модуля/elements/modulelayout.php . Вставляем туда следующий код:
[spoiler title="modulelayout.php"]
Код: php
<?php

// no direct access
defined('_JEXEC') or die('Restricted access');
jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.file');

class JElementModuleLayout extends JElement
{
var $_name = 'ModuleLayout';

function fetchElement($name, $value, &$node, $control_name)
{
global $mainframe;
$db =& JFactory::getDBO();

// get current template
$query = 'SELECT template'
.' FROM #__templates_menu'
.' WHERE client_id = 0'
.' AND menuid = 0'
;
$db->setQuery( $query );
$template = $db->loadResult();
$module = $node->attributes('module');

// If a template, extension and view are present build the options.
if ($template && $module) {

// Build the search paths for layouts.
$bPath = JPath::clean(JPATH_SITE.DS.'modules'.DS.$module.DS.'tmpl');
$tPath = JPath::clean(JPATH_SITE.DS.'templates'.DS.$template.DS.'html'.DS.$module);

// Add the default option.
$options[] = JHTML::_('select.option', '', JText::_('Default'));

// Add the layout options from the first path.
if (is_dir($bPath) && ($files = JFolder::files($bPath, '^[^_]*\.php$'))) {
$options[] = JHTML::_('select.option',  '<OPTGROUP>', JText::_( 'Module' ) );
foreach ($files as $file) {
$options[] = JHTML::_('select.option', JFile::stripExt($file));
}
//$options[] = JHTML::_('select.option',  '</OPTGROUP>' );
}

// Add the layout options from the second path.
if (is_dir($tPath) && ($files = JFolder::files($tPath, '^[^_]*\.php$'))) {
$options[] = JHTML::_('select.option',  '<OPTGROUP>', JText::_( '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);
}

}
}
[/spoiler]
Мы создали новый тип параметра, который генерирует список найденных layout'ов в папке модуля и шаблона.
4)Меняем в mod_имя_модуля.php вызов layout'а на следующий:
Код: php
require( JModuleHelper::getLayoutPath('mod_имя_модуля', $params->get('layout', 'default')) );


К счастью в Joomla 1.6 тип modulelayout уже содержится в библиотеке, и все стандартные модули имеют этот параметр слава тапочкам.
Ну а пока мы живем с j 1.5 прошу разработчиков проделать эти нехитрые 4 шага чтобы помочь бедным верстальшикам обуздать ваши модули )
« Последнее редактирование: 12.09.2010, 20:16:21 от danik.html »
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
*

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
Сделал маленькую правку благодаря которой layout'ы в списке разделяются на те что из модуля (родные) и те что из шаблона.
Если в шаблоне layout перекрыт, то не имеет значения какой из них выбрать в списке...
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
*

beliyadm

  • Легенда
  • 8985
  • 1626 / 63
  • Севастополь == Россия
То ли я туплю, то ли не пойму практического применения, поясните?
Все истины, которые я хочу вам изложить, — бесстыдная ложь.
Записки нетрезвого кодера || -=Joomla FAQ=- || -=все плохо=- || skype: beliyadm_pb
*

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
Практическое применение в основном разработчикам шаблонов - к одному модулю можно создать несколько layout'ов, которые будут доступны для выбора в параметрах модуля.

Неоднократно сталкивался с такой задачей, и очень обрадовался когда ковырялся в Joomla 1.6 beta и увидел решение данной проблемы.

Так же плюс в том что юзеры модуля могут создавать свои layout'ы, и делиться ими друг с другом. Другими словами это добавляет возможность расширять модуль сторонними лицами, и отображать модуль в разных вариантах.

К примеру: в планах сделать модуль меню, и наделать layout'ов, скажем аккордион, выпадающий список и тп, что избавит пользователей от установки кучи модулей меню...
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
*

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
более близкий пример тебе, beliyadm - mod_virtuemart_universal. Скажем у нас два экземпляра модуля, и оба они должны выглядеть по-разному, причем CSS задачу не решит. Вот тут и приходит на помошь параметр modulelayout )
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
*

beliyadm

  • Легенда
  • 8985
  • 1626 / 63
  • Севастополь == Россия
Все, понял смысл, чегой то затупил :)
Все истины, которые я хочу вам изложить, — бесстыдная ложь.
Записки нетрезвого кодера || -=Joomla FAQ=- || -=все плохо=- || skype: beliyadm_pb
*

Roberta

  • Захожу иногда
  • 182
  • 0 / 0
Тема такая что мне часто приходится делать шаблоны под Joomla. К счастью почти все модули написаны по канонам Joomla, и их можно перешаблонизировать в папке html/module_name/layout_name.php

Однако иногда нужно для разных экземпляров модуля иметь разный layout. Такая проблема часто возникает с mod_mainmenu и mod_newsflash.
Решение достаточно простое - добавлять к модулям параметр выбора шаблона. делается это очень просто:

1)добавляем в манифест (xml-файл модуля) новый параметр:
Код: xml
<param name="layout" type="modulelayout" module="mod_имя_модуля" label="Layout" description="Select layout" />
Типа modulelayout Joomla не знает, поэтому мы его создадим сами.
2)добавляем атрибут addpath элементу params:
Код: xml
<params addpath="/modules/mod_имя_модуля/elements">
Таким образом мы указываем что неизвестные типы параметров надо искать в данной папке
3)создаем /modules/mod_имя_модуля/elements/modulelayout.php . Вставляем туда следующий код:
[spoiler title="modulelayout.php"]
Код: php
<?php

// no direct access
defined('_JEXEC') or die('Restricted access');
jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.file');

class JElementModuleLayout extends JElement
{
var $_name = 'ModuleLayout';

function fetchElement($name, $value, &$node, $control_name)
{
global $mainframe;
$db =& JFactory::getDBO();

// get current template
$query = 'SELECT template'
.' FROM #__templates_menu'
.' WHERE client_id = 0'
.' AND menuid = 0'
;
$db->setQuery( $query );
$template = $db->loadResult();
$module = $node->attributes('module');

// If a template, extension and view are present build the options.
if ($template && $module) {

// Build the search paths for layouts.
$bPath = JPath::clean(JPATH_SITE.DS.'modules'.DS.$module.DS.'tmpl');
$tPath = JPath::clean(JPATH_SITE.DS.'templates'.DS.$template.DS.'html'.DS.$module);

// Add the default option.
$options[] = JHTML::_('select.option', '', JText::_('Default'));

// Add the layout options from the first path.
if (is_dir($bPath) && ($files = JFolder::files($bPath, '^[^_]*\.php$'))) {
$options[] = JHTML::_('select.option',  '<OPTGROUP>', JText::_( 'Module' ) );
foreach ($files as $file) {
$options[] = JHTML::_('select.option', JFile::stripExt($file));
}
//$options[] = JHTML::_('select.option',  '</OPTGROUP>' );
}

// Add the layout options from the second path.
if (is_dir($tPath) && ($files = JFolder::files($tPath, '^[^_]*\.php$'))) {
$options[] = JHTML::_('select.option',  '<OPTGROUP>', JText::_( '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);
}

}
}
[/spoiler]
Мы создали новый тип параметра, который генерирует список найденных layout'ов в папке модуля и шаблона.
4)Меняем в mod_имя_модуля.php вызов layout'а на следующий:
Код: php
require( JModuleHelper::getLayoutPath('mod_имя_модуля', $params->get('layout', 'default')) );


К счастью в Joomla 1.6 тип modulelayout уже содержится в библиотеке, и все стандартные модули имеют этот параметр слава тапочкам.
Ну а пока мы живем с j 1.5 прошу разработчиков проделать эти нехитрые 4 шага чтобы помочь бедным верстальшикам обуздать ваши модули )

сделала все вышесказанное с XML файлом.
но в php файле модуля уже прописан вызов layout'a следующим образом

$layout = $params->get('layout','default');
$layout = JFilterInput::clean($layout, 'word');
$path = JModuleHelper::getLayoutPath('mod_hbooking', $layout);
if (file_exists($path)) {
   require($path);
}

результат: дополнительный layout из админки не виден, только default

что делать??
« Последнее редактирование: 18.12.2010, 23:12:34 от Roberta »
*

smart

  • Администратор
  • 6485
  • 1316 / 15
  • Хочешь сделать хорошо — сделай!
Случайно набрел на эту тему. Задумка действительно неплохая, тем более, что многие еще на 1.5 сидят. Но посмотрев код возникло 2 вопроса:

1. Почему layout'ы ищутся только в текущем шаблоне? А если у пользователя 5 шаблонов и в них разный набор layout'ов?
2. Почему при формировании списка закомментированы строки </OPTGROUP>

Может быть есть более свежий элемент? Просто я как раз переписывал модули для JComments под 1.7 и 1.5, и в случае с 1.7 выбор layout'а есть, а в 1.5 пока нет. Я готов добавить, но нужно какое-то более универсальное решение.
*

smart

  • Администратор
  • 6485
  • 1316 / 15
  • Хочешь сделать хорошо — сделай!
Хм, подумал, подумал и решил чуток улучшить элемент:
[spoiler title=JElementModuleLayout]
Код: php
<?php
 
defined('_JEXEC') or die('Restricted access');

jimport('joomla.filesystem.folder');
jimport('joomla.filesystem.file');
 
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;

global $mainframe;
$db =& JFactory::getDBO();
 
$query = 'SELECT template'
.' FROM #__templates_menu'
.' WHERE client_id = ' . $clientId
;

$db->setQuery( $query );
$templates = $db->loadResultArray();

$options = array();
$options[] = JHTML::_('select.option', '', JText::_('Default'));

if ($module) {
$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);
}
}
[/spoiler]
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вставка кода вызова модуля в тело шаблона другого модуля

Автор Dorfman

Ответов: 15
Просмотров: 342
Последний ответ 19.11.2018, 21:45:54
от beliyadm
Как создать дополнительный параметр(по типу published) для элемента списка?

Автор borro

Ответов: 4
Просмотров: 351
Последний ответ 08.02.2018, 17:03:11
от borro
Нужна помощь в доработке модуля под Joomla 3

Автор kik84

Ответов: 5
Просмотров: 1253
Последний ответ 30.01.2018, 22:40:30
от Елeна
Модификация модуля lastet_news вывод времени перед заголовком

Автор Morphiss

Ответов: 9
Просмотров: 1229
Последний ответ 19.04.2016, 12:41:55
от spsyper
Создание платного модуля

Автор fiter

Ответов: 7
Просмотров: 962
Последний ответ 04.08.2014, 18:27:05
от neo85r