Новости Joomla

Вышли релизы Joomla 6.1 и Joomla 5.4.5: новые возможности и стабильность

Релиз Joomla 6.1.0

Проект Joomla! объявил о доступности Joomla 6.1 [Nyota] — новой минорной версии шестой серии, а также о выпуске релиза исправлений ошибок Joomla 5.4.5. Релиз 6.1 приносит ряд долгожданных функций, повышающих удобство управления контентом и защиту от спама.

👩‍💻 Компонент "CS Афиши" для Joomla.

👩‍💻 Компонент "CS Афиши" для Joomla.

Расширение "CS Афиши" позволяет выводить список мероприятий, фильтровать их по датам, поиск по заголовкам и описанию.

В состав пакета расширений входят:
- Компонент "CS Афиши"
- Модуль "Календарь событий"
- Модуль "Предстоящие события"
- Библиотека "ImgResize"

Расширение "CS Афиши" позволяет выводить список мероприятий, фильтровать их по датам, поиск по заголовкам и описанию.

Модуль "Календарь событий" отображает предстоящие и прошедшие мероприятие на календаре, с отображением мероприятий на конкретную дату во всплывающем окне.

Модуль "Предстоящие события" показывает список предстоящий событий по порядку их наступления.

P.S. Расширение платное, но плата символическая, чисто для отработки приема платежей. Ключи без ограничения по времени, купившие сейчас - смогут обновляться без ограничений.

Разработчик - участник нашего сообщества Дмитрий Денисов (@codersite).

Страница расширения
Демо

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

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
Просмотров: 1565
Последний ответ 27.02.2018, 18:57:55
от efimov777
Привязать модуль mod_adsmanager_ads к категории

Автор efimov777

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

Автор Den85

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

Автор magistr_yoda

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

Автор orsy

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