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

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

rss

Вы не зашли.

Объявление

#1 2011-10-29 18:26:19

natalenko
Новичок
Зарегистрирован: 2011-10-11
Сообщений: 6
Рейтинг :   
Профиль

счётчик количества новостей в категории

Меню в шаблоне имеет вид

<a href="/" class="zagruzka-plus_menu-main"><img src="{tpl_url}/images/favicon.png" align="absmiddle" alt="" /> Главная</a>

<a href="javascript:ShowOrHide('id_1');" class="zagruzka-plus_menu-main"><img src="{tpl_url}/images/icons/category.png" align="absmiddle" alt="" /> Раздел 1.0 <img src="{tpl_url}/images/icons/arrow_down.png" alt="" align="absmiddle" style="margin:0px;"></a>

<div id="id_1" class="zagruzka-plus_menu-box" style="padding-bottom:5px;display:none;">
<a href="#" class="ss-menu"><img src="{tpl_url}/images/icons/category.png" align="absmiddle" alt="" /> Категория 1.1</a>
<a href="#" class="ss-menu"><img src="{tpl_url}/images/icons/category.png" align="absmiddle" alt="" /> Категория 1.2</a>
<a href="#" class="ss-menu"><img src="{tpl_url}/images/icons/category.png" align="absmiddle" alt="" /> Категория 1.3</a>
<a href="#" class="ss-menu"><img src="{tpl_url}/images/icons/category.png" align="absmiddle" alt="" /> Категория 1.4</a>
<a href="#" class="ss-menu"><img src="{tpl_url}/images/icons/category.png" align="absmiddle" alt="" /> Категория 1.5</a>
<a href="#" class="ss-menu"><img src="{tpl_url}/images/icons/category.png" align="absmiddle" alt="" /> Категория 1.6</a>
<a href="#" class="ss-menu"><img src="{tpl_url}/images/icons/category.png" align="absmiddle" alt="" /> Категория 1.7</a>
</div>

Подскажите пожалуйста, как вывести количество новостей отдельно для каждой категории ?

Неактивен

 

#2 2011-10-29 21:06:50

vitaly
Администратор
Откуда: Россия
Зарегистрирован: 2008-10-08
Сообщений: 2785
Рейтинг :   115 
Профиль

Re: счётчик количества новостей в категории

natalenko, при такой постановке вопроса - никак, т.к. ты самостоятельно делаешь меню.
Необходимо отдать генерацию на откуп движку, тогда со счетчиком проблем не возникнет.

Почитай в документации про шаблон news.categories.tpl (документация лежит в дистрибутиве 0.9.3, readme/docs/index.html), на его базе можно будет сделать всё что тебе требуется.

Неактивен

 

#3 2011-10-29 21:28:22

natalenko
Новичок
Зарегистрирован: 2011-10-11
Сообщений: 6
Рейтинг :   
Профиль

Re: счётчик количества новостей в категории

vitaly,  Спасибо !
Но для меня это тёмный лес. Придётся ограничиться тем, что есть.
Ещё раз спасибо !

Неактивен

 

#4 2012-01-02 00:34:39

post-factum
Новичок
Откуда: /ukraine/kyiv
Зарегистрирован: 2012-01-02
Сообщений: 8
Рейтинг :   
Профиль

Re: счётчик количества новостей в категории

Ковыряние движка показало, что для этого нужно написать обработчик отдельного тега, например, [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 собрать не удалось. В любом случае, код открыт для правки всеми желающими.

Отредактированно post-factum (2012-01-02 00:42:00)

Неактивен

 

#5 2012-01-02 00:43:17

ROZARD
Модератор
Откуда: Россия, Астрахань
Зарегистрирован: 2008-10-13
Сообщений: 1523
Рейтинг :   82 
Профиль  Вебсайт

Re: счётчик количества новостей в категории

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

Неактивен

 

#6 2012-01-02 00:56:59

post-factum
Новичок
Откуда: /ukraine/kyiv
Зарегистрирован: 2012-01-02
Сообщений: 8
Рейтинг :   
Профиль

Re: счётчик количества новостей в категории

ROZARD написал:

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

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

Неактивен

 

#7 2012-01-02 03:13:52

vitaly
Администратор
Откуда: Россия
Зарегистрирован: 2008-10-08
Сообщений: 2785
Рейтинг :   115 
Профиль

Re: счётчик количества новостей в категории

post-factum, шутник smile
За попытку реализации - респект, а вот за получившийся результат - незачёт.

Пример реализации есть в документации, делается всё просто - создаётся шаблон news.categories.tpl и в него кладётся:

Код:

{% for entry in entries %}
    <!-- Выводим маркер категории -->
    {{ entry.mark }}

    <!-- Если не стоит флаг `flags.active`, т.е. если эта категория - не текущая, то показываем ссылку -->
    <!-- В текущей категории показываем имя категории жирным шрифтом -->
    {% if (not entry.flags.active) %}
        <a href="{{ entry.link }}">
    {% else %}
        <b>
    {% endif %}
    {{ entry.cat }}
    {% if (entry.flags.active) %}
        </a>
    {% else %}
        </b>
    {% endif %}

    <!-- Отображаем кол-во новостей в категории только в случае, если выставлен флаг `flags.counter` -->
    {% if (entry.flags.counter) %}
        [ {{ entry.counter }}]
    {% endif %}
{% endfor %}

При желании - натягивается нужный HTML код.

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

Неактивен

 

#8 2012-01-02 16:21:09

post-factum
Новичок
Откуда: /ukraine/kyiv
Зарегистрирован: 2012-01-02
Сообщений: 8
Рейтинг :   
Профиль

Re: счётчик количества новостей в категории

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);
  }

Неактивен

 

#9 2012-01-02 16:36:26

natalenko
Новичок
Зарегистрирован: 2011-10-11
Сообщений: 6
Рейтинг :   
Профиль

Re: счётчик количества новостей в категории

vitaly,
Спасибо ! Теперь, благодаря Вам и моему сыну (post-factum), всё работает smile

vitaly написал:

natalenko, при такой постановке вопроса - никак, т.к. ты самостоятельно делаешь меню.

smile Очевидно, что-бы подсказать решение проблемы простому смертному, Вам необходим был какой-то раздражитель tongue

Ещё раз - большое Вам спасибо !

Неактивен

 

#10 2012-01-02 16:50:41

ROZARD
Модератор
Откуда: Россия, Астрахань
Зарегистрирован: 2008-10-13
Сообщений: 1523
Рейтинг :   82 
Профиль  Вебсайт

Re: счётчик количества новостей в категории

post-factum, Как мне говорил один человек это не по феншую smile Всё можно сделать куда проще.
Привожу пример:
Создаешь папку test в нем создаешь файл test.php и version.
Содержимое test.php:

Код:

<?php
if (!defined('NGCMS')) exit('HAL');

add_act('index', 'plugin_test');

function plugin_test()
{global $template, $catz;
    
    foreach($catz as $row){
        //print "<pre>".var_export($row, true)."</pre>";
        $template['vars']['count_id_today_'.$row['id']] = $row['posts'];
    }
}

Содержимое version:

Код:

ID: test
Name: test
Version: 0.1
Actions: index; test.php
Type: plugin
Title: test
Description: test
Author: test
Author_URI: http://rozard.ngdemo.ru
preinstall: no

И эту папку test помещаешь в папку plugins и включаешь в админке и тебе будет доступен тег:
{count_id_today_IDКАТЕГОРИИ}

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

Неактивен

 

#11 2012-01-02 17:16:22

post-factum
Новичок
Откуда: /ukraine/kyiv
Зарегистрирован: 2012-01-02
Сообщений: 8
Рейтинг :   
Профиль

Re: счётчик количества новостей в категории

ROZARD написал:

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

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

Неактивен

 

#12 2012-01-02 18:00:06

Wolverine
Модератор
Откуда: Домодедово
Зарегистрирован: 2008-10-13
Сообщений: 3538
Рейтинг :   160 
Профиль  Вебсайт

Re: счётчик количества новостей в категории

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

Неактивен

 

#13 2012-01-02 18:04:27

post-factum
Новичок
Откуда: /ukraine/kyiv
Зарегистрирован: 2012-01-02
Сообщений: 8
Рейтинг :   
Профиль

Re: счётчик количества новостей в категории

Wolverine написал:

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

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

Неактивен

 

#14 2012-01-02 18:11:03

Wolverine
Модератор
Откуда: Домодедово
Зарегистрирован: 2008-10-13
Сообщений: 3538
Рейтинг :   160 
Профиль  Вебсайт

Re: счётчик количества новостей в категории

Понятно. Запросы в цикле лучше тоже не делать, особенно если много категорий. +10-20 не кеширующихся SELECT...

Лучше  использовать такой вариант, который сразу скидывать в кэш и обновлять последний раз в N секунд.

Код:

SELECT COUNT(*), catid FROM 2z_news WHERE catid IN (2, 20) GROUP BY catid

Неактивен

 

#15 2012-01-03 00:29:58

vitaly
Администратор
Откуда: Россия
Зарегистрирован: 2008-10-08
Сообщений: 2785
Рейтинг :   115 
Профиль

Re: счётчик количества новостей в категории

natalenko написал:

vitaly написал:

natalenko, при такой постановке вопроса - никак, т.к. ты самостоятельно делаешь меню.

smile Очевидно, что-бы подсказать решение проблемы простому смертному, Вам необходим был какой-то раздражитель tongue
Ещё раз - большое Вам спасибо !

Так я ж потом указывал, что всё можно сделать через стандартное меню категорий.
А про "кол-во постов за сутки" никто и не говорил..

Неактивен

 

#16 2012-01-03 23:06:02

post-factum
Новичок
Откуда: /ukraine/kyiv
Зарегистрирован: 2012-01-02
Сообщений: 8
Рейтинг :   
Профиль

Re: счётчик количества новостей в категории

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

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

Отредактированно post-factum (2012-01-03 23:27:54)

Неактивен

 

#17 2012-01-03 23:31:28

Wolverine
Модератор
Откуда: Домодедово
Зарегистрирован: 2008-10-13
Сообщений: 3538
Рейтинг :   160 
Профиль  Вебсайт

Re: счётчик количества новостей в категории

FROM_UNIXTIME лучше не использовать в левом выражении http://tarlyun.com/mysql/from_unixtime-v-uslovii-zlo/

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

Код:

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

Оптимально сделать так за последние 24 часа

Код:

WHERE 'postdate' > UNIX_TIMESTAMP(NOW() - INTERVAL 1 DAY)

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

Код:

WHERE postdate > unix_timestamp( curdate( ) )

Неактивен

 

#18 2012-01-03 23:36:08

post-factum
Новичок
Откуда: /ukraine/kyiv
Зарегистрирован: 2012-01-02
Сообщений: 8
Рейтинг :   
Профиль

Re: счётчик количества новостей в категории

Wolverine написал:

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

Код:

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

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

Wolverine написал:

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

Код:

WHERE postdate > unix_timestamp( curdate( ) )

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

Отредактированно post-factum (2012-01-03 23:40:22)

Неактивен

 

#19 2012-01-03 23:38:12

Wolverine
Модератор
Откуда: Домодедово
Зарегистрирован: 2008-10-13
Сообщений: 3538
Рейтинг :   160 
Профиль  Вебсайт

Re: счётчик количества новостей в категории

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

Неактивен

 

#20 2012-01-03 23:46:57

post-factum
Новичок
Откуда: /ukraine/kyiv
Зарегистрирован: 2012-01-02
Сообщений: 8
Рейтинг :   
Профиль

Re: счётчик количества новостей в категории

Пускай будет дубль два.

Неактивен

 

#21 2012-01-04 00:04:30

Wolverine
Модератор
Откуда: Домодедово
Зарегистрирован: 2008-10-13
Сообщений: 3538
Рейтинг :   160 
Профиль  Вебсайт

Re: счётчик количества новостей в категории

Во, теперь и индекс по postdate используется smile

Неактивен

 

Board footer

Powered by FluxBB

[ Generated in 0.017 seconds, 31 queries executed ]