Новости Joomla

Как тестировать Joomla PHP-разработчику? Компонент Patch tester.

👩‍💻 Как тестировать Joomla PHP-разработчику? Компонент Patch tester.Joomla - open source PHP-фреймворк с готовой админкой. Его основная разработка ведётся на GitHub. Для того, чтобы международному сообществу разработчиков было удобнее тестировать Pull Requests был создан компонент Patch Tester, который позволяет "накатить" на текущую установку Joomla именно те изменения, которые необходимо протестировать. На стороне инфраструктуры Joomla для каждого PR собираются готовые пакеты, в которых находится ядро + предложенные изменения. В каждом PR обычно находятся инструкции по тестированию: куда зайти, что нажать, ожидаемый результат. Тестировщики могут предположить дополнительные сценарии, исходя из своего опыта и найти баги, о которых сообщить разработчику. Или не найти, и тогда улучшение или исправление ошибки быстрее войдёт в ядро Joomla. Напомню, что для того, чтобы PR вошёл в ядро Joomla нужны минимум 2 положительных теста от 2 участников сообщества, кроме автора. Видео на YouTubeВидео на VK ВидеоВидео на RuTubeКомпонент на GitHub https://github.com/joomla-extensions/patchtester@joomlafeed#joomla #php #webdev #community

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

Nuta

  • Захожу иногда
  • 59
  • 2 / 0
Код
Главное меню 
  Пункт 1
  -- Подпункт 11
  -- Подпункт 12

  Пункт 2
  -- Подпункт 21
  -- Подпункт 22

  Пункт 3
  -- Подпункт 31
  -- Подпункт 32

Вывод второго уровня Главного меню в модуле на страницах Пункта 1
   
Код
   -- Подпункт 11
   -- Подпункт 12

Вывод второго уровня Главного меню в модуле на страницах Пункта 2
   
Код
   -- Подпункт 21
   -- Подпункт 22

А вопрос в том, как названию модуля на страницах присвоить название текущего пункта меню 1 уровня.
*

ELLE

  • Глобальный модератор
  • 4505
  • 893 / 0
а нельзя создать просто 3 модуля - назвать их по названию пунктов меню первого уровня и выводить только на соответствующих страницах второго уровня?
или в принципе модуль должен быть один, который называется "главное меню" и у него должен меняться заголовок, в зависимости от того, где сейчас находимся........?
*

Nuta

  • Захожу иногда
  • 59
  • 2 / 0
Именно так, модуль должен быть один.
Над первым предложением я думала, но у меня не три пункта главного меню, а больше. Зачем дублировать большое количество одинаковых модулей?
*

ELLE

  • Глобальный модератор
  • 4505
  • 893 / 0
ну. тогда только скриптом могу предложить...подменять заголовки и все

м\б можно через переопределение modules.php как-то решить. вообще задача нестандартная
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
в папке HTML  вашего шаблона файл modules.php (нет скопируйте из шаблона system)
вставляете код
Код: php-brief
function modChrome_menu($module, &$params, &$attribs)
{
    @$menutitle = JMenuSite::getInstance('site')->getActive()->title;
    if (!empty ($module->content)) : ?>
        <div class="moduletable<?php echo htmlspecialchars($params->get('moduleclass_sfx')); ?>">
<?php if ((bool) $module->showtitle) : ?>
            <h3><?php echo ($menutitle ? $menutitle: $module->title); ?></h3>
        <?php endif; ?>
            <?php echo $module->content; ?>
</div>
    <?php endif;
}
соответственно модуль в шаблоне должен выводится так:
<jdoc:include type="modules" name="youname" style="menu" />
*

Nuta

  • Захожу иногда
  • 59
  • 2 / 0
Спасибо!
А не подскажете, как сделать такое подключение для WARP Framework?
там модули в шаблоне подключаются по-другому.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
*

Nuta

  • Захожу иногда
  • 59
  • 2 / 0
Спасибо, Федор!
Я так и сделала.
Я нашла этот файл и внесла предложенные изменения. Файл был в папке /system. Скопировала измененный  в свой  шаблон в папку /html. После копирования вместо страниц, где должен был отображаться модуль, - белый экран.
Хотела внести также изменения (<jdoc:include type="modules" name="youname" style="menu" />) в template.php.
В WARP есть папка layouts, в которой лежит template.php и module.php. В template.php есть строки вида <?php echo $this['modules']->render('toolbar-l'); ?> для подключения модулей в указанной позиции. В шаблоне нет подключения модулей типа jdoc:include type... У меня Joomla 3.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
В шаблоне system файл modules.php идет по умолчанию. И у вас уже определенный прогресс. Если белый экран стал значит система реагирует на ваш новый файл. Включите в общих настройках сайта отображение ошибок для разработчиков. Внимательно просмотрите ваш код и правки. Да и гляньте функцию render, не может быть, что не реализован вызов стилей к примеру так (может быть совсем по другому)
Код: php-brief
<?php echo $this['modules']->render('toolbar-l', 'mystile'); ?> 
*

Nuta

  • Захожу иногда
  • 59
  • 2 / 0
Да, подключение модулей в шаблоне идет именно так:
Код
<?php echo $this['modules']->render('toolbar-l'); ?>

Я просто не могу понять, как указать мой стиль модуля при таком подключении.


При отладке системы ошибка следующая:
Код
Fatal error: Cannot redeclare modChrome_none() (previously declared in /.../templates/system/html/modules.php:15) in /.../templates/reinfo/html/modules.php on line 18

*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
эта ошибка говорит что вы пытаетесь повторно объявить функцию modChrome_none
что нужно сделать найти файл modules.php где он лежит. не шаблона system и делать в нем правки. Вы его не нашли.
*

Nuta

  • Захожу иногда
  • 59
  • 2 / 0
Спасибо, Федор!
Я, конечно, поищу еще, но ... Есть еще modules.php в templates/reinfo/warp/systems/joomla/layouts и в templates/reinfo/warp/systems/joomla/helpers
Но это совсем не то. Там никакие функции не объявляются. 
Вот жеж какая нетривиальная задача с этим Warp-oм получается! Вот в 1.5 без фреймворка ваше решение работает.
*

Nuta

  • Захожу иногда
  • 59
  • 2 / 0
Федор, ну раз уж вы включились в решение моей задачи, наберусь наглости и попрошу у вас консультации.
Вот файл из директории templates/template_name/warp/systems/joomla/layouts/modules.php
Код
<?php


// load modules
$modules = $this['modules']->load($position);
$count   = count($modules);
$output  = array();

foreach ($modules as $index => $module) {

// set module params
$params           = array();
$params['count']  = $count;
$params['order']  = $index + 1;
$params['first']  = $params['order'] == 1;
$params['last']   = $params['order'] == $count;
$params['suffix'] = $module->parameter->get('moduleclass_sfx', '');

// pass through menu params
if (isset($menu)) {
$params['menu'] = $menu;
}

// get class suffix params
$parts = preg_split('/[\s]+/', $params['suffix']);

foreach ($parts as $part) {
if (strpos($part, '-')!== false) {
list($name, $value) = explode('-', $part, 2);
$params[$name] = $value;
}
}

// remove used parameters from suffix so we dont end up having the wrong css-classes
$params['suffix'] = trim(preg_replace("/(style|color|badge|icon|header)-[a-z0-9]+/", "", $params['suffix']));

// render module
$output[] = $this->render('module', compact('module', 'params'));
}

// render module layout
echo (isset($layout) && $layout)? $this->render("modules/layouts/{$layout}", array('modules' => $output)) : implode("\n", $output);

И вот файл module.php из директории templates/template_name/layouts/module.php
Код
<?php

// init vars
$id = $module->id;
$position = $module->position;
$title = $module->title;
$showtitle = $module->showtitle;
$content = $module->content;
$split_color = '';
$subtitle = '';
$title_template = '';

// init params
foreach (array('suffix', 'style', 'color', 'badge', 'icon', 'dropdownwidth') as $var) {
$$var = isset($params[$var])? $params[$var] : null;
}

// set default module types
if ($style == '') {
if ($module->position == 'top-a') $style = 'box';
if ($module->position == 'top-b') $style = 'box';
if ($module->position == 'bottom-a') $style = 'box';
if ($module->position == 'bottom-b') $style = 'box';
if ($module->position == 'innertop') $style = 'box';
if ($module->position == 'innerbottom') $style = 'box';
if ($module->position == 'sidebar-a') $style = 'box';
if ($module->position == 'sidebar-b') $style = 'box';
}

// test module styles here
//$style = '';
//$color = '';
//$badge = '';
//$icon = '';
//$title = '';
//$content = '<ul class="line"><li>This is a demo text.</li><li><a href="#">Link</a></li></ul><ul class="zebra"><li>This is a demo text.</li><li><a href="#">Link</a></li></ul><a class="button-default" href="#">Read More</a><ul class="check"><li>Check List</li></ul><em>em Element</em><br /><em class="box">em with class box</em><br /><code>code Element</code><form class="short style"><div><input type="text"></div><div><textarea >Textarea text</textarea></div><div><button type="submit" name="Submit">Log in</button></div></form>';

// force module style
if (in_array($module->position, array('absolute', 'breadcrumbs', 'logo', 'banner', 'search', 'debug'))) {
$style = 'raw';
$showtitle = 0;
}
if (in_array($module->position, array('headerbar', 'toolbar-r' ,'toolbar-l', 'footer'))) {
$style = '';
$showtitle = 0;
}
if ($module->position == 'menu') {
$style = $module->menu ? 'raw' : 'dropdown';
}

// set module template using the style
switch ($style) {

case 'box':
$template = 'default-1';
$style = 'mod-'.$style;
$style .= ($color)? ' mod-box-'.$color : '';
$split_color = 1;
$subtitle = 1;
$title_template = '<h3 class="module-title">%s</h3>';
break;

case 'dropdown':
$template = 'dropdown';
$subtitle = 1;
break;

case 'raw':
$template = 'raw';
break;

default:
$template = 'default-1';
$style = $suffix;
$suffix         = '';
$title_template = '<h3 class="module-title">%s</h3>';
}

$style.=" ".$suffix;

// set badge if exists
if ($badge) {
$badge = '<div class="badge badge-'.$badge.'"></div>';
}

// split title in two colors
if ($split_color) {
$pos = mb_strpos($title, ' ');
if ($pos !== false) {
$title = '<span class="color">'.mb_substr($title, 0, $pos).'</span>'.mb_substr($title, $pos);
}
}

// create subtitle
if ($subtitle) {
$pos = mb_strpos($title, '||');
if ($pos !== false) {
$title = '<span class="title">'.mb_substr($title, 0, $pos).'</span><span class="subtitle">'.mb_substr($title, $pos + 2).'</span>';
}
}

// create title icon if exists
if ($icon) {
$title = '<span class="icon icon-'.$icon.'"></span>'.$title.'';
}

// create title template
if ($title_template) {
$title = sprintf($title_template, $title);
}

// set dropdownwidth if exists
if ($dropdownwidth) {
$dropdownwidth = 'style="width: '.$dropdownwidth.'px;"';
}

// render menu
if ($module->menu) {

// set menu renderer
if (isset($params['menu'])) {
$renderer = $params['menu'];
} else if (in_array($module->position, array('menu'))) {
$renderer = 'dropdown';
} else if (in_array($module->position, array('toolbar-l', 'toolbar-r', 'footer'))) {
$renderer = 'default';
} else {
$renderer = 'accordion';
}

// set menu style
if ($renderer == 'dropdown') {
$module->menu_style = 'menu-dropdown';
} else if ($renderer == 'accordion') {
$module->menu_style = 'menu-sidebar';
} else if ($renderer == 'default') {
$module->menu_style = 'menu-line';
} else {
$module->menu_style = null;
}

$content = $this['menu']->process($module, array_unique(array('pre', 'default', $renderer, 'post')));
}

// render module
echo $this->render("modules/templates/{$template}", compact('style', 'badge', 'showtitle', 'title', 'content', 'dropdownwidth'));

В папке templates/template_name/html нет modules.php

В какой из файлов вставить предложенный код? И там, наверное, другой синтаксис будет?

А вот часть template.php
Код
<!DOCTYPE HTML>
<html lang="<?php echo $this['config']->get('language'); ?>" dir="<?php echo $this['config']->get('direction'); ?>">

<head>
<?php echo $this['template']->render('head'); ?>
</head>

<body id="page" class="page <?php echo $this['config']->get('body_classes'); ?>" data-config='<?php echo $this['config']->get('body_config','{}'); ?>'>

<?php if ($this['modules']->count('absolute')) : ?>
<div id="absolute">
<?php echo $this['modules']->render('absolute'); ?>
</div>
<?php endif; ?>



<header id="header">
<div class="wrapper clearfix">
<?php if ($this['modules']->count('toolbar-l + toolbar-r') || $this['config']->get('date')) : ?>
<div id="toolbar" class="clearfix">

<?php if ($this['modules']->count('toolbar-l') || $this['config']->get('date')) : ?>
<div class="float-left">

<?php if ($this['config']->get('date')) : ?>
<time datetime="<?php echo $this['config']->get('datetime'); ?>"><?php echo $this['config']->get('actual_date'); ?></time>
<?php endif; ?>

<?php echo $this['modules']->render('toolbar-l'); ?>

</div>
<?php endif; ?>

<?php if ($this['modules']->count('toolbar-r')) : ?>
<div class="float-right"><?php echo $this['modules']->render('toolbar-r'); ?></div>
<?php endif; ?>

</div>
<?php endif; ?>

<?php if ($this['modules']->count('logo + headerbar')) : ?>
<div id="headerbar" class="clearfix">

<?php if ($this['modules']->count('logo')) : ?>
<div id="logo"><?php echo $this['modules']->render('logo'); ?></div>
<?php endif; ?>

<?php echo $this['modules']->render('headerbar'); ?>

</div>
<?php endif; ?>
Т.е. там тоже модули немного по-другому подключаются?
« Последнее редактирование: 22.08.2013, 00:17:27 от Nuta »
*

Nuta

  • Захожу иногда
  • 59
  • 2 / 0
Ну в общем я нашла и вставила предложенный кусок кода. Перестал выдавать ошибку.
Расположение файла: /templates/system/html/modules.php

Код
<?php


defined('_JEXEC') or die;

/*
 * none (output raw module content)
 */
function modChrome_none($module, &$params, &$attribs)
{
echo $module->content;
}

/*
 * html5 (chosen html5 tag and font headder tags)
 */
function modChrome_html5($module, &$params, &$attribs)
{
$moduleTag      = $params->get('module_tag', 'div');
$headerTag      = htmlspecialchars($params->get('header_tag', 'h3'));
$bootstrapSize  = (int) $params->get('bootstrap_size', 0);
$moduleClass    = $bootstrapSize != 0 ? ' span' . $bootstrapSize : '';

if (!empty ($module->content)) : ?>
<<?php echo $moduleTag; ?> class="moduletable<?php echo htmlspecialchars($params->get('moduleclass_sfx')); ?><?php echo $moduleClass; ?>">

<?php if ((bool) $module->showtitle) :?>
<<?php echo $headerTag; ?> class="<?php echo $params->get('header_class'); ?>"><?php echo $module->title; ?></<?php echo $headerTag; ?>>
<?php endif; ?>

<?php echo $module->content; ?>

</<?php echo $moduleTag; ?>>

<?php endif;
}

/*
 * Module chrome that wraps the module in a table
 */
function modChrome_table($module, &$params, &$attribs)
{ ?>
<table cellpadding="0" cellspacing="0" class="moduletable<?php echo htmlspecialchars($params->get('moduleclass_sfx')); ?>">
<?php if ((bool) $module->showtitle) : ?>
<tr>
<th>
<?php echo $module->title; ?>
</th>
</tr>
<?php endif; ?>
<tr>
<td>
<?php echo $module->content; ?>
</td>
</tr>
</table>
<?php
}

/*
 * Module chrome that wraps the tabled module output in a <td> tag of another table
 */
function modChrome_horz($module, &$params, &$attribs)
{ ?>
<table cellspacing="1" cellpadding="0" width="100%">
<tr>
<td>
<?php modChrome_table($module, $params, $attribs); ?>
</td>
</tr>
</table>
<?php
}

/*
 * XHTML (divs and font headder tags)
 */
function modChrome_xhtml($module, &$params, &$attribs)
{
if (!empty ($module->content)) : ?>
<div class="moduletable<?php echo htmlspecialchars($params->get('moduleclass_sfx')); ?>">
<?php if ((bool) $module->showtitle) : ?>
<h3><?php echo $module->title; ?></h3>
<?php endif; ?>
<?php echo $module->content; ?>
</div>
<?php endif;
}

/*
 * Module chrome that allows for rounded corners by wrapping in nested div tags
 */
function modChrome_rounded($module, &$params, &$attribs)
{ ?>
<div class="module<?php echo htmlspecialchars($params->get('moduleclass_sfx')); ?>">
<div>
<div>
<div>
<?php if ((bool) $module->showtitle) : ?>
<h3><?php echo $module->title; ?></h3>
<?php endif; ?>
<?php echo $module->content; ?>
</div>
</div>
</div>
</div>
<?php
}

/*
 * Module chrome that add preview information to the module
 */
function modChrome_outline($module, &$params, &$attribs)
{
static $css = false;
if (!$css)
{
$css = true;
$doc = JFactory::getDocument();

$doc->addStyleDeclaration(".mod-preview-info { padding: 2px 4px 2px 4px; border: 1px solid black; position: absolute; background-color: white; color: red;}");
$doc->addStyleDeclaration(".mod-preview-wrapper { background-color:#eee; border: 1px dotted black; color:#700;}");
}
?>
<div class="mod-preview">
<div class="mod-preview-info"><?php echo 'Position: ' . $module->position . ' [ Style: ' . $module->style . ']'; ?></div>
<div class="mod-preview-wrapper">
<?php echo $module->content; ?>
</div>
</div>
<?php
}
function modChrome_menu($module, &$params, &$attribs)
{
    @$menutitle = JMenuSite::getInstance('site')->getActive()->title;
    if (!empty ($module->content)) : ?>
        <div class="moduletable<?php echo htmlspecialchars($params->get('moduleclass_sfx')); ?>">
<?php if ((bool) $module->showtitle) : ?>
            <h3><?php echo ($menutitle ? $menutitle: $module->title); ?></h3>
        <?php endif; ?>
            <?php echo $module->content; ?>
</div>
    <?php endif;
}

Вот, а как его теперь подключить в шаблон с этим стилем?
*

Nuta

  • Захожу иногда
  • 59
  • 2 / 0
Чуть выше я приводила код template.php
Там модули так не подключаются
<jdoc:include type="modules" name="younamemodule" style="menu" />

Вот позиция в шаблоне, где должен находиться мой модуль
Код
<?php if ($this['modules']->count('sidebar-b')) : ?>
<aside id="sidebar-b" class="grid-box"><?php echo $this['modules']->render('sidebar-b', array('layout'=>'stack')); ?></aside>
<?php endif; ?>
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Код: php-brief
<?php echo $this['modules']->render('younamemodule', array('style'=>'menu')); ?>
или
Код: php-brief
<?php
$mod_id=10; //посмотрите в админ панели ид модуля
$db = JFactory::getDBO();
$query = $db->getQuery(true)->select('*')->from('#__modules')->where('id=' . (int)$mod_id);
$module = $db->setQuery($query)->loadObject();
@$menutitle = JMenuSite::getInstance('site')->getActive()->title;
echo ($menutitle ? $menutitle: $module->title);
echo JModuleHelper::renderModule($module);
?>
или
Код: php-brief
<?php
//$module = JModuleHelper::getModule('mod_name');
$module = JModuleHelper::getModule('mod_name', 'Заголовок модуля');
@$menutitle = JMenuSite::getInstance('site')->getActive()->title;
echo ($menutitle ? $menutitle: $module->title);
echo JModuleHelper::renderModule($module);
?>
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Алиас пункта меню совпадает с именем подкаталога в каталоге с сист.файлами

Автор Andrey N.

Ответов: 14
Просмотров: 4177
Последний ответ 07.10.2021, 23:57:15
от Garrr
Главное меню

Автор Анастасия87

Ответов: 7
Просмотров: 2001
Последний ответ 21.05.2021, 08:40:40
от arma
Как вывести все категории VirtueMart 3 второго уровня списком?

Автор Damarkuzz

Ответов: 0
Просмотров: 1262
Последний ответ 06.07.2020, 18:58:23
от Damarkuzz
Как сократить вертикальное расстояние между меню сайта и баннером?

Автор MultiMatrix83

Ответов: 2
Просмотров: 1648
Последний ответ 16.02.2020, 19:30:25
от MultiMatrix83
Редактирование Модуля - в меню не удаляется пункт

Автор bovinkm

Ответов: 4
Просмотров: 1830
Последний ответ 16.08.2019, 15:00:22
от bovinkm