Next Generation CMS :: Форум поддержки

Заинтересовала наша система? Тогда этот форум для Вас!

Вы не зашли.

#2 Re: "А как сделать..." » счётчик количества новостей в категории » 2012-01-03 23:36:08

Wolverine пишет:

В итоговом запросе у тебя уже не учитывается, что нужно за последний день выводить новости? У тебя сейчас разыскиваются новости добавленные прямо в эту секунду, их наверное не будет вовсе...

WHERE DATE(FROM_UNIXTIME(postdate))=DATE(FROM_UNIXTIME(UNIX_TIMESTAMP()))

Сравниваются только даты, время не учитывается. Смотреть здесь.

Wolverine пишет:

Или такой вариант, за сегодня

WHERE postdate > unix_timestamp( curdate( ) )

Да, так проще. Нужно попробовать.

#3 Re: "А как сделать..." » счётчик количества новостей в категории » 2012-01-03 23:06:02

Вот нужный функционал в виде плагина. Добавляет один запрос в базу.

Использовать теги {count_id_X} и {count_id_today_X}, где X — ID категории.

#4 Re: "А как сделать..." » счётчик количества новостей в категории » 2012-01-02 18:04:27

Wolverine пишет:

А где про последние сутки сказано smile

В процессе реализации возникла необходимость и в таком.

#5 Re: "А как сделать..." » счётчик количества новостей в категории » 2012-01-02 17:16:22

ROZARD пишет:

И всё это без каких либо запросов и трогания файлов ядра...

Плагин — это хорошо, согласен. Но он будет выводить общее количество новостей в категории, а не количество новостей за последние сутки. Вот для последнего, полагаю, без запроса к базе не обойтись.

#6 Re: "А как сделать..." » счётчик количества новостей в категории » 2012-01-02 16:21:09

vitaly пишет:

1. Зачем создавать отдельный коннект к БД, когда уже есть глобальная переменная (для одноименного класса) $mysql?
2. У оператора SELECT есть параметр count(*), который просто выводит кол-во строчек, в такой реализации решение будет работать на порядок быстрее (если новостей очень много - то раз в 100-500-1000 быстрее).
3. А вообще кол-во новостей в категории есть в глобальном массиве $catz, так что даже SQL запросы не нужны - можно просто вытянуть данные оттуда

Вот так бы и сразу. Спасибо. Теперь так:

global $catz, $catmap, $mysql;
  preg_match_all('/\[count_id (.+?)\]/is', $data, $parr);
  foreach ($parr[0] as $k => $v) {
   $data = str_replace($v, $catz[$catmap[$parr[1][$k]]]['posts'], $data);
  }
  
  preg_match_all('/\[count_id_today (.+?)\]/is', $data, $parr);
  foreach ($parr[0] as $k => $v) {
   $newscount = 0;
   $catid = $parr[1][$k];
   $newscount = $mysql->result('SELECT COUNT(*) FROM '.$config['prefix'].'_news WHERE catid='.$catid.' AND postdate>=UNIX_TIMESTAMP()-86400');
   $data = str_replace($v, $newscount, $data);
  }

#7 Re: "А как сделать..." » счётчик количества новостей в категории » 2012-01-02 00:56:59

ROZARD пишет:

Я в шоке от реализации))) Тихий ужас)))
Всё куда проще... Можно сделать категория в виде плагина одним запросом и без подобной правки...

Я тоже в шоке, но на скорую руку как раз. Пожалуйста, вашу реализацию в студию.

#8 Re: "А как сделать..." » счётчик количества новостей в категории » 2012-01-02 00:34:39

Ковыряние движка показало, что для этого нужно написать обработчик отдельного тега, например, [count_id]. Делается это так.

В файле engine/includes/classes/templates.class.php в функции

function vars($nn, $vars = array(), $params = array()) {

после строк

  $data = str_replace('{skins_url}', skins_url, $data);
  $data = str_replace('{tpl_url}', tpl_url, $data);
  $data = str_replace('{admin_url}', admin_url, $data);

добавляются следующие строки:

  preg_match_all('/\[count_id (.+?)\]/is', $data, $parr);
  foreach ($parr[0] as $k => $v) {
   $newscount = 0;
   $catid = $parr[1][$k];
   $db = mysql_connect($config['dbhost'], $config['dbuser'], $config['dbpasswd']);
   $dbs = mysql_select_db($config['dbname'], $db);
   $query = 'SELECT title FROM '.$config['prefix'].'_news WHERE catid='.$catid;
   $res = mysql_query($query, $db);
   while ($arr = mysql_fetch_row($res))
    $newscount++;
   mysql_close($db);
   $data = str_replace($v, $newscount, $data);
  }
  
  preg_match_all('/\[count_id_today (.+?)\]/is', $data, $parr);
  foreach ($parr[0] as $k => $v) {
   $newscount = 0;
   $catid = $parr[1][$k];
   $db = mysql_connect($config['dbhost'], $config['dbuser'], $config['dbpasswd']);
   $dbs = mysql_select_db($config['dbname'], $db);
   $query = 'SELECT title FROM '.$config['prefix'].'_news WHERE catid='.$catid.' AND postdate>=UNIX_TIMESTAMP()-86400';
   $res = mysql_query($query, $db);
   while ($arr = mysql_fetch_row($res))
    $newscount++;
   mysql_close($db);
   $data = str_replace($v, $newscount, $data);
  }

Здесь для личного удобства обозначено два однотипных тега: count_id для вывода количества сообщений отдельно взятой категории за всё время и count_id_today для вывода количества сообщений тоже отдельно взятой категории за сутки. Различаются две части означенного выше кода только условием выборки SQL-запроса.

Применять теги так:

<a href="#" class="ss-menu"><img src="{tpl_url}/images/icons/category.png" align="absmiddle" alt="" /> Категория 4 ([count_id_today 4]/[count_id 4])</a>

Возможно, реализация не лучшая в плане количества запросов к базе, но тут статистику штатными средствами CMS собрать не удалось. В любом случае, код открыт для правки всеми желающими.

Подвал раздела

Работает на FluxBB