Новости 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

Вышел релиз Revo PageBuilder Toolkit for YOOtheme Pro 1.6

Вышел релиз Revo PageBuilder Toolkit for YOOtheme Pro 1.6.2PageBuilder Toolkit - это специализированный плагин для конструктора страниц Yootheme Pro, содержит набор различных утилит для ускорения процесса работы и отладки макета, множественные улучшения в интерфейсе, включая поддержку dark mode, подсказки, быстрая смена разрешения в окне просмотра и много чего еще.v.1.6.2 Что нового?- Индикатор статусов: теперь не просто показывает состояние запросов, но и делает автоматические попытки их отправки при кратковременных сбоях в сети, а если это не помогло, то переводит конструктор в ручной режим, что позволяет сохранит макет и настройки темы прежде чем вы потеряете все, что было сделано с момента последнего сохранения- Подсветка ошибок в макете: плагин анализирует код страницы и может автоматически подсвечивать data атрибуты с кучей мусора, которые попадают в код страницы при копипасте из Figma в TinyMCE (пригодится для старых макетов, в текущей работе плагин сам очищает код мусора). Также есть подсветка семантических ошибок сборки - дубли h1 тега на странице и вложенных друг в друга заголовков.- Улучшена поддержка будущего релиза Yootheme Pro 5 и редактора CodeMirror 6Плагин для русскоязычных пользователей доступен в каталоге расширений SovMart и распространяется за символическую плату (100р). Разработчики Joomla расширений и партнеры автора могут получить плагин бесплатно.Для работы плагина необходим конструктор страниц Yootheme Pro.Разработчик плагина - участник нашего сообщества Александр Судьбинов (@alexrevo), член официальной группы поддержки Yootheme Pro. Страница расширенияОписание на сайте автора@joomlafeed#joomla #yootheme

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

AlexSims

  • Захожу иногда
  • 314
  • 38 / 0
  • кручу верчу
Модуль mod_adsmanager_menu
« : 04.12.2014, 06:56:25 »
Кто-нибудь переделывал стандартный модуль mod_adsmanager_menu

вот код почти оригинала

Спойлер
[свернуть]


мой вариант, который пилю
Спойлер
[свернуть]





чтоб он только в интервалах делал основной ( сильно грузящий запрос), а в остальное время обходился попроще?


Если в деталях.
То для каждой категории создается поле, в котором будет хранится кол-во объяв ( а обновляться данные будут к примеру раз в час)
Как записать в конечные категории количество объяв, через модуль проблем нет ( вот с записью в промежуточные подкатегории трабла), посчитать общее кол-во тоже нет.
На данный момент проблемы такие:
- Не понял как сделать, чтоб основная часть модуля-обновление данных производилось через интервал
- Думал написать отдельную функцию под свой облегченный запрос, но там траблы ( а если использовать частично код основной то хрень пока выходит)
С фантазией плохо.
*

Grendy

  • Захожу иногда
  • 247
  • 26 / 0
Re: Модуль mod_adsmanager_menu
« Ответ #1 : 05.12.2014, 16:59:28 »
Если я правильно понял вашу задумку, при её реализации, чтобы обновить данные о количестве объявлений в каждой категории, нужно будет сделать N запросов на обновление данных, где N - число категорий. Это при том, что прежде то же N число запросов нужно будет сделать, чтобы подсчитать количество объявлений в них. Не дёшево выйдет, если выполнять подсчёты даже раз в час.
Плюс в репутацию больше говорит о благодарности, чем слово "Спасибо" в теме, которую повторно, возможно, никогда уже не посетишь.
*

Grendy

  • Захожу иногда
  • 247
  • 26 / 0
Re: Модуль mod_adsmanager_menu
« Ответ #2 : 05.12.2014, 18:26:28 »
Попробуйте так

Код
<?php
defined('_JEXEC') or die('Restricted access');

function mod_adsmanager_menu_categories($id, $level, &$children, $itemid, $current_list, $expand, $order, $displaynumads) {
global $cur_template, $option;
if (@$children[$id]) {
foreach ($children[$id] as $row) {
if ($level == 0) {
?>
<tr align="left"><td>
<?php
$class='menu_ads';
} else {
echo '<div style="padding-left: '.($level*4).'px"><span id="arrow"></span>';
$class='sublevel';
}
if ($option)
$link = sefRelToAbs($option."?page=show_category&amp;catid=".$row->id);
else
$link = sefRelToAbs("index.php?option=com_adsmanager&amp;page=show_category&amp;catid=".$row->id);

if ($children[$id] == $row->id)
$class='menu_ads_1';

if ($displaynumads == 1) {
$num = $row->num_ads;
$nums = number_format($num,0,'.',' ');
echo '<a href="'.$link.'" class="'.$class.'">'.$row->name.'<sup style="font-weight:normal;color:#999;">&nbsp;'.$nums.'</sup></a>';
} else {
echo '<a href="'.$link.'" class="'.$class.'">'.$row->name.'</a>';
}
if (@$current_list[count($current_list) - 1 - $level] == $row->id) {
mod_adsmanager_menu_categories($row->id, $level + 1, $children, $itemid, $current_list, $expand, $order, $displaynumads);
}
if ($level == 0) {
?>
</td></tr>
<?php
} else {
?>
</div>
<?php
}
}
}
}

function calc_nb_ads($id, &$children, $sqltype) {
switch($sqltype) {
case 1:
$nb_ads = 0;
if (@$children[$id]) {
$nb = count($children[$id]);
for($i=0; $i < $nb; $i++) {
$children[$id][$i]->num_ads += calc_nb_ads($children[$id][$i]->id, $children, $sqltype);
$nb_ads += $children[$id][$i]->num_ads;
}
}
return $nb_ads;
break;
case 0:
$nb_ads = 0;
if (@$children[$id]) {
$nb = count($children[$id]);
for($i = 0; $i < $nb; $i++) {
if (!isset($children[$id][$i]->not_empty))
$children[$id][$i]->num_ads = 0;
$children[$id][$i]->num_ads += calc_nb_ads($children[$id][$i]->id,$children,$sqltype);
if (isset($children[$id][$i]->not_empty))
$nb_ads += $children[$id][$i]->num_ads;
}
}
return $nb_ads;
break;
}
}

/****************************************************/

$itemid = intval($params->get('default_itemid', mosGetParam($_GET, 'Itemid', 0)));
$option = $params->get('option', '');
$catid = intval(mosGetParam($_GET, 'catid', -1));
$expand = intval(mosGetParam($_GET, 'expand', 0));
$order = intval(mosGetParam($_GET, 'order', 0));
$displaynumads = $params->def('displaynumads', 1);
$sqltype = $params->def('sqltype', 1);

$database->setQuery("SELECT c.*, COUNT(a.id) AS num_ads ".
"FROM #__adsmanager_categories AS c ".
"LEFT JOIN #__adsmanager_ads AS a ON a.category = c.id AND a.published = 1 ".
"WHERE c.published = 1 GROUP BY c.id ORDER BY c.parent, c.ordering");
$rows = $database->loadObjectList();
if ($database->getErrorNum()) {
echo $database->stderr();
return false;
}

// establish the hierarchy of the menu
$children = array();
$orderlist = array();
// first pass - collect children
foreach($rows as $v) {
$pt = $v->parent;
$list = @$children[$pt] ? $children[$pt] : array();
array_push($list, $v);
$children[$pt] = $list;
$orderlist[$v->id] = $v;
}


if ($displaynumads == 1)
$nb_ads = calc_nb_ads(0, $children, $sqltype);

$current_list[] = $catid;
if ($catid != -1) {
$current = $catid;
while((isset($orderlist[$current])) && ($orderlist[$current]->parent != 0)) {
$current_list[] = $orderlist[$current]->parent;
$current = $orderlist[$current]->parent;
}
}

if (file_exists($mosConfig_absolute_path.'/components/com_adsmanager/lang/lang_'.$mosConfig_lang.'.php'))
include_once($mosConfig_absolute_path.'/components/com_adsmanager/lang/lang_'.$mosConfig_lang.'.php');
else
include_once($mosConfig_absolute_path.'/components/com_adsmanager/lang/lang_english.php');
?>
<table class="moduletable_menu" width="100%" border="0" cellpadding="0" cellspacing="0">
<?php

if($option)
$link_show_all = sefRelToAbs($option."?page=show_all");
else
$link_show_all = sefRelToAbs("index.php?option=com_adsmanager&page=show_all");
?>
<?php
if ($displaynumads == 1) {
$nb_ads1 = number_format($nb_ads, 0, '.', ' ');
$all = ADSMANAGER_MENU_ALL_ADS. '<sup style="color:#666;font-weight:normal;">'.$nb_ads1.'<sup style="color:green;font-size:8px;">+'.$nb_ads_1.'</sup></sup>';
}
else
$all = ADSMANAGER_MENU_ALL_ADS;
    ?>
<tr align="left"><td><ul><li><a href="<?php echo $link_show_all; ?>" style="font-size:10px;"><?php echo $all; ?></a></li></ul></td></tr>

<?php
mod_adsmanager_menu_categories(0, 0, $children, $itemid, $current_list, $expand, $order, $displaynumads);
?>
</table>
Плюс в репутацию больше говорит о благодарности, чем слово "Спасибо" в теме, которую повторно, возможно, никогда уже не посетишь.
*

AlexSims

  • Захожу иногда
  • 314
  • 38 / 0
  • кручу верчу
Re: Модуль mod_adsmanager_menu
« Ответ #3 : 06.12.2014, 05:40:46 »
Если я правильно понял вашу задумку, при её реализации, чтобы обновить данные о количестве объявлений в каждой категории, нужно будет сделать N запросов на обновление данных, где N - число категорий. Это при том, что прежде то же N число запросов нужно будет сделать, чтобы подсчитать количество объявлений в них. Не дёшево выйдет, если выполнять подсчёты даже раз в час.

Задумка была такая.

при глобальном подсчете раз в час к примеру,
чтоб записывались данные в ячейки с кол-вом объв и
потом запрос осуществлялся только к этим данным и по таблице категорий ( по сути всего один запрос на выборки из таблицы категорий всего 260 ячеек).

А так обычно стандартный модуль делает даже при оптимизации количество вычислений = кол-во объявлений * кол-во категорий ( а это дофига получается когда объявлений становиться больше 3000)

на данный момент это 1157388

С фантазией плохо.
*

AlexSims

  • Захожу иногда
  • 314
  • 38 / 0
  • кручу верчу
Re: Модуль mod_adsmanager_menu
« Ответ #4 : 06.12.2014, 05:59:56 »
Попробуйте так

Код
<?php
defined('_JEXEC') or die('Restricted access');

function mod_adsmanager_menu_categories($id, $level, &$children, $itemid, $current_list, $expand, $order, $displaynumads) {
global $cur_template, $option;
if (@$children[$id]) {
foreach ($children[$id] as $row) {
if ($level == 0) {
?>
<tr align="left"><td>
<?php
$class='menu_ads';
} else {
echo '<div style="padding-left: '.($level*4).'px"><span id="arrow"></span>';
$class='sublevel';
}
if ($option)
$link = sefRelToAbs($option."?page=show_category&amp;catid=".$row->id);
else
$link = sefRelToAbs("index.php?option=com_adsmanager&amp;page=show_category&amp;catid=".$row->id);

if ($children[$id] == $row->id)
$class='menu_ads_1';

if ($displaynumads == 1) {
$num = $row->num_ads;
$nums = number_format($num,0,'.',' ');
echo '<a href="'.$link.'" class="'.$class.'">'.$row->name.'<sup style="font-weight:normal;color:#999;">&nbsp;'.$nums.'</sup></a>';
} else {
echo '<a href="'.$link.'" class="'.$class.'">'.$row->name.'</a>';
}
if (@$current_list[count($current_list) - 1 - $level] == $row->id) {
mod_adsmanager_menu_categories($row->id, $level + 1, $children, $itemid, $current_list, $expand, $order, $displaynumads);
}
if ($level == 0) {
?>
</td></tr>
<?php
} else {
?>
</div>
<?php
}
}
}
}

function calc_nb_ads($id, &$children, $sqltype) {
switch($sqltype) {
case 1:
$nb_ads = 0;
if (@$children[$id]) {
$nb = count($children[$id]);
for($i=0; $i < $nb; $i++) {
$children[$id][$i]->num_ads += calc_nb_ads($children[$id][$i]->id, $children, $sqltype);
$nb_ads += $children[$id][$i]->num_ads;
}
}
return $nb_ads;
break;
case 0:
$nb_ads = 0;
if (@$children[$id]) {
$nb = count($children[$id]);
for($i = 0; $i < $nb; $i++) {
if (!isset($children[$id][$i]->not_empty))
$children[$id][$i]->num_ads = 0;
$children[$id][$i]->num_ads += calc_nb_ads($children[$id][$i]->id,$children,$sqltype);
if (isset($children[$id][$i]->not_empty))
$nb_ads += $children[$id][$i]->num_ads;
}
}
return $nb_ads;
break;
}
}

/****************************************************/

$itemid = intval($params->get('default_itemid', mosGetParam($_GET, 'Itemid', 0)));
$option = $params->get('option', '');
$catid = intval(mosGetParam($_GET, 'catid', -1));
$expand = intval(mosGetParam($_GET, 'expand', 0));
$order = intval(mosGetParam($_GET, 'order', 0));
$displaynumads = $params->def('displaynumads', 1);
$sqltype = $params->def('sqltype', 1);

$database->setQuery("SELECT c.*, COUNT(a.id) AS num_ads ".
"FROM #__adsmanager_categories AS c ".
"LEFT JOIN #__adsmanager_ads AS a ON a.category = c.id AND a.published = 1 ".
"WHERE c.published = 1 GROUP BY c.id ORDER BY c.parent, c.ordering");
$rows = $database->loadObjectList();
if ($database->getErrorNum()) {
echo $database->stderr();
return false;
}

// establish the hierarchy of the menu
$children = array();
$orderlist = array();
// first pass - collect children
foreach($rows as $v) {
$pt = $v->parent;
$list = @$children[$pt] ? $children[$pt] : array();
array_push($list, $v);
$children[$pt] = $list;
$orderlist[$v->id] = $v;
}


if ($displaynumads == 1)
$nb_ads = calc_nb_ads(0, $children, $sqltype);

$current_list[] = $catid;
if ($catid != -1) {
$current = $catid;
while((isset($orderlist[$current])) && ($orderlist[$current]->parent != 0)) {
$current_list[] = $orderlist[$current]->parent;
$current = $orderlist[$current]->parent;
}
}

if (file_exists($mosConfig_absolute_path.'/components/com_adsmanager/lang/lang_'.$mosConfig_lang.'.php'))
include_once($mosConfig_absolute_path.'/components/com_adsmanager/lang/lang_'.$mosConfig_lang.'.php');
else
include_once($mosConfig_absolute_path.'/components/com_adsmanager/lang/lang_english.php');
?>
<table class="moduletable_menu" width="100%" border="0" cellpadding="0" cellspacing="0">
<?php

if($option)
$link_show_all = sefRelToAbs($option."?page=show_all");
else
$link_show_all = sefRelToAbs("index.php?option=com_adsmanager&page=show_all");
?>
<?php
if ($displaynumads == 1) {
$nb_ads1 = number_format($nb_ads, 0, '.', ' ');
$all = ADSMANAGER_MENU_ALL_ADS. '<sup style="color:#666;font-weight:normal;">'.$nb_ads1.'<sup style="color:green;font-size:8px;">+'.$nb_ads_1.'</sup></sup>';
}
else
$all = ADSMANAGER_MENU_ALL_ADS;
    ?>
<tr align="left"><td><ul><li><a href="<?php echo $link_show_all; ?>" style="font-size:10px;"><?php echo $all; ?></a></li></ul></td></tr>

<?php
mod_adsmanager_menu_categories(0, 0, $children, $itemid, $current_list, $expand, $order, $displaynumads);
?>
</table>


Спасибо. Запрос чуть менее нагружает мускул, но если одновременно 10 человек делают такой запрос, то сайт на секунд 20 уходит.

Я сначала думал кэшировать хоть как то, но при кэше модуль не расскрывает пункты меню.
С фантазией плохо.
*

Grendy

  • Захожу иногда
  • 247
  • 26 / 0
Re: Модуль mod_adsmanager_menu
« Ответ #5 : 06.12.2014, 09:00:11 »

Спасибо. Запрос чуть менее нагружает мускул, но если одновременно 10 человек делают такой запрос, то сайт на секунд 20 уходит.

Я сначала думал кэшировать хоть как то, но при кэше модуль не расскрывает пункты меню.

Если полей в таблице adsmanager_categories много, можно попробовать делать выборку только нужных для результата. Что-то типа

Код
SELECT c.id, c.parent, c.name, COUNT(a.id) AS num_ads

вместо

Код
SELECT c.*, COUNT(a.id) AS num_ads

Боюсь, это максимум, чего можно добиться без кэширования.

Ваш вариант реализации с записью количества объявлений будет намного более нагруженным этого решения, так как тот же запрос на выборку числа (из ячейки, в которую записывается количество объявлений) всё равно нужно будет выполнять, а к нему в добавок прибавится n*2 либо n+1 запросов, где n - количество категорий, которые будут обновлять это число в обозначенные промежутки времени.

Если не секрет, какое количество объявлений на вашей доске? У себя не припомню, чтобы запросы выполнялись более секунды даже при выборке из таблицы с ~350000 строками.
Плюс в репутацию больше говорит о благодарности, чем слово "Спасибо" в теме, которую повторно, возможно, никогда уже не посетишь.
*

AlexSims

  • Захожу иногда
  • 314
  • 38 / 0
  • кручу верчу
Re: Модуль mod_adsmanager_menu
« Ответ #6 : 06.12.2014, 21:13:56 »
Если полей в таблице adsmanager_categories много, можно попробовать делать выборку только нужных для результата. Что-то типа

Код
SELECT c.id, c.parent, c.name, COUNT(a.id) AS num_ads

вместо

Код
SELECT c.*, COUNT(a.id) AS num_ads

Боюсь, это максимум, чего можно добиться без кэширования.

Ваш вариант реализации с записью количества объявлений будет намного более нагруженным этого решения, так как тот же запрос на выборку числа (из ячейки, в которую записывается количество объявлений) всё равно нужно будет выполнять, а к нему в добавок прибавится n*2 либо n+1 запросов, где n - количество категорий, которые будут обновлять это число в обозначенные промежутки времени.

Если не секрет, какое количество объявлений на вашей доске? У себя не припомню, чтобы запросы выполнялись более секунды даже при выборке из таблицы с ~350000 строками.

не секрет пока что около 4500
С фантазией плохо.
*

Grendy

  • Захожу иногда
  • 247
  • 26 / 0
Re: Модуль mod_adsmanager_menu
« Ответ #7 : 07.12.2014, 16:54:20 »
Хм. Есть возможность выполнить предложенный мною запрос в командной строке MySQL или через phpMyAdmin? Интересует время его выполнения. Что-то мне подсказывает, что есть другой, какой-то более тяжёлый запрос либо для генерации страницы делается очень много запросов.
« Последнее редактирование: 07.12.2014, 20:05:22 от Grendy »
Плюс в репутацию больше говорит о благодарности, чем слово "Спасибо" в теме, которую повторно, возможно, никогда уже не посетишь.
*

AlexSims

  • Захожу иногда
  • 314
  • 38 / 0
  • кручу верчу
Re: Модуль mod_adsmanager_menu
« Ответ #8 : 07.12.2014, 22:10:31 »
Хм. Есть возможность выполнить предложенный мною запрос в командной строке MySQL или через phpMyAdmin? Интересует время его выполнения. Что-то мне подсказывает, что есть другой, какой-то более тяжёлый запрос либо для генерации страницы делается очень много запросов.

да я логирую все медленные запросы вот обновил лог, статистика за 25 запр по нему

Код
Count: 25  Time=1.75s (43s)  Lock=0.00s (0s)  Rows=257.0 (6425), 
  SELECT c.*, COUNT(a.id) AS num_ads FROM _adsmanager_categories AS c LEFT JOIN _adsmanager_ads AS a ON a.category = c.id AND a.published = N WHERE c.published = N GROUP BY c.id ORDER BY c.parent, c.ordering
« Последнее редактирование: 07.12.2014, 22:15:02 от AlexSims »
С фантазией плохо.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Привязать модуль mod_paidsystem_feat поиску

Автор efimov777

Ответов: 5
Просмотров: 1283
Последний ответ 27.02.2018, 18:57:55
от efimov777
Привязать модуль mod_adsmanager_ads к категории

Автор efimov777

Ответов: 2
Просмотров: 16163
Последний ответ 01.02.2018, 14:01:16
от efimov777
Как встроить модуль в AdsManager?

Автор Den85

Ответов: 1
Просмотров: 21137
Последний ответ 19.01.2018, 23:15:21
от DK-Scorp
Модуль расширенного поиска самостоятельно

Автор magistr_yoda

Ответов: 14
Просмотров: 2956
Последний ответ 15.09.2017, 12:25:16
от Jazz12
Модуль поиска Adsmanager_search: порядок полей в модуле поиска [Готовое решение, хак]

Автор orsy

Ответов: 1
Просмотров: 1481
Последний ответ 17.11.2016, 14:48:31
от moonaway