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

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

Автор efimov777

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

Автор Den85

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

Автор magistr_yoda

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

Автор orsy

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