dle.in.ua » Хаки » Количество новостей в меню навигации

Количество новостей в меню навигации

Автор: kand2004 от 3-09-2009, 18:03
Позволяет проставить количество новостей за сегодня и общее количество по конкретной категории или подкатегории в меню навигации или любом другом месте сайта. Есть возможность ставить количество новостей в каком угодно виде. Кроме того можно проставлять количество новостей в подкаталогах любой вложености. Единственное, что нужно знать для этого - это id категории.

Что нового в данной версии, смотрите в полной новости.

Предыдущую версию можно посмотреть http://1024kbytes.com/articles/2322-kolichestvo-novostej-v-menyu-navigacii-dlya-dle.html, а первоначальный вариант
-http://4дле.ru/hacks/1147157833-khak-kolichestvo-novostejj-v-menju.html
Примеры отображения в меню навигации (отображение зависит только от Вашей фантазии)
Количество новостей в меню навигации
Количество новостей в меню навигации



Итак, начнем:
1) В файле index.php, находим

$tpl->set ( '{AJAX}', $ajax );


ВЫШЕ ставим код


/*********Главное меню**********/
$count_news = dle_cache( "count_news_of_category", $config[’skin’] );
if( !$count_news )
{
  //кэш с количеством новостей пуст
    $sql_result = $db->query("select ct.id,
                                 (select count(*) from ". PREFIX ."_post ps where ps.category = ct.id AND (DATE_FORMAT(date, '%Y%m%d')=CURDATE()) AND approve = '1') as new_,
                                 (select count(*) from ". PREFIX ."_post ps where ps.category = ct.id AND approve = '1') as allnews_
                          from ". PREFIX ."_category ct"
                          );
    $count_news_of_category = '';
    while($row = $db->get_row($sql_result))
    {  
         $t = $row['new_'].'/'.$row['allnews_'];
         $tpl->set('{count_categ_'.$row['id'].'}', $t);          
         $count_news_of_category .= $row['id'].'#'.$t.'|';
    }
    /**В кэш **/
    create_cache( 'count_news_of_category', $count_news_of_category);
    $db->free();
}
else
{
  //достанем количество новостей из кэша
  $arr_newscount = explode('|', $count_news);
  for ($i = 0; $i <= count($arr_newscount) - 2; $i++)
  {
  $arr_onenews = explode('#', $arr_newscount[$i]);  
  $tpl->set('{count_categ_'.$arr_onenews[0].'}', $arr_onenews[1]);
  }
}
/************************************/



2) Открываем файл ./engine/modules/addnews.php
Ищем строку (вернее, это часть строки):

if( $config['allow_alt_url'] == "yes" )


ВЫШЕ ставим:

clear_cache('count_news_of_category');  



3) Открываем файл /engine/ajax/editnews.php
Ищем строку

clear_cache( 'news_' );


НИЖЕ ставим:

clear_cache('count_news_of_category');  


4) В шаблоне (каком хотите и где хотите) ставите теги на количество новостей.
Тег выглядит так: “{count_categ _2}” (без кавычек), где 2 – это id категории.

Например у меня в шаблоне main.tpl, где я отображаю менюшку, будет выглядит так:

Софт   {count_categ _2}


Отобразиться как "Софт 5/258" (без кавычек).
(о формировании внешнего вида содержимого тега см. ниже)

Кстати, между Софт и 5/258 всегда будет только один пробел, как бы далеко не отодвигать в шаблоне тег. Я решил эту проблему просто – поставил  
&_nbsp;

Тогда в шаблоне будет так:


]Софт&nbsp;&nbsp;&nbsp;{count_categ _2}

(между Софт и 5/258 будет 3 пробела)


Формировании внешнего вида
Внешний вид количества новостей (то, что заменит тег в шаблоне) формируется в строке

$t = $row['new_'].'/'.$row['allnews_'];

вышеуказанного кода (в п.1)
Для данной строки содержимое отобразится так: “8/2358” (без кавычек)

Рассмотрим примеры:
Пример 1:
Если надо скобки – все просто – указанную строку меняем на:

$t = ' ('.$row['new_'].'/'.$row['allnews_']. ' )';

Отобразиться: (8/2358)

Пример 2:

$t = ' ('.$row['allnews_'].'/'.$row['new_']. '+)';

Отобразиться: (2358/8+)

Пример 3:

$t = ' (всего:'.$row['allnews_'].', сегодня:'.$row['new_']. ')';

Отобразиться: (всего: 2358 сегодня: 8)

Если кто-то не хочет заморачиваться с кодом, пишите в личку - сделаю.

Кроме того, есть возможность убрать 0 (ноль), если новостей на сегодня нет.
Для этого, в коде из п.1, ВМЕСТО строки


$t = $row['new_'].'/'.$row['allnews_'];


ставим 2 строки


if( $row['new_'] == '0') {$news_now = '(';} else {$news_now = '('.$row['new_'].'/';};
$t = $news_now.$row['allnews_'].')';


Если новости есть, отобразится: “(8/2358)” (без кавычек).
Если новостей за сегодня нет, отобразится: “(2358)” (без кавычек).

Хак тестился на 7.5 версии DLE.

Вот, в принципе и все.
Возможно, кому-то покажется код неудобочитаемым или еще что-то не так - пишите, комментируйте - буду исправлять.
И последнее - хак совершенно бесплатный :-)

Всем удачи!
  • Группа: User
  • Icq: 817135
  • Комментариев: 321
  • Публикаций: 0
  • Хмм... спасибо, на каком-нить ГС поставлю)

    --------------------
    • ALTERNATE
    • Регистрация: 12.12.2008
    • Репутация: (0|0|0)
    • 3 сентября 2009 19:49
    • 1
    ^
  • Группа: User
  • Icq: --
  • Комментариев: 72
  • Публикаций: 1
  • подкатегории считает?
    • heidality
    • Регистрация: 28.06.2009
    • Репутация: (0|0|0)
    • 3 сентября 2009 21:01
    • 2
    ^
  • Группа: Гости
  • Icq: --
  • Комментариев: 0
  • Публикаций: 0
  • Всё работает на 8.2
    • teroor
    • Регистрация: --
    • Репутация: (||)
    • 4 сентября 2009 02:49
    • 3
    ^
  • Группа: Гости
  • Icq: --
  • Комментариев: 0
  • Публикаций: 0
  • Цитата: heidality
    подкатегории считает?


    Конечно! Подкатегории любой вложенности.

    Рабочий вариант можно посмотреть на http://1024kbytes.com


    Цитата: teroor
    Всё работает на 8.2

    Спасибо, что потестил!
    • kand2004
    • Регистрация: --
    • Репутация: (||)
    • 4 сентября 2009 08:37
    • 4
    ^
  • Группа: Гости
  • Icq: --
  • Комментариев: 0
  • Публикаций: 0
  • При отключенном ЧПУ работает?
    • Влад
    • Регистрация: --
    • Репутация: (||)
    • 4 сентября 2009 10:01
    • 5
    ^
  • Группа: Гости
  • Icq: --
  • Комментариев: 0
  • Публикаций: 0
  • Цитата: Влад
    При отключенном ЧПУ работает?


    Чесно говоря - не пробовал
    • kand2004
    • Регистрация: --
    • Репутация: (||)
    • 4 сентября 2009 10:30
    • 6
    ^
  • Группа: User
  • Icq: --
  • Комментариев: 91
  • Публикаций: 0
  • ммм...сенкс, как раз юзвери просили))

    --------------------
    • llipek
    • Регистрация: 28.01.2009
    • Репутация: (0|0|0)
    • 4 сентября 2009 11:24
    • 7
    ^
  • Группа: Гости
  • Icq: --
  • Комментариев: 0
  • Публикаций: 0
  • kand2004, попробуй, в прошлой версии не считал кол-во новых новостей при отключенном ЧПУ.


    ... Блин и щас не считает
    • Влад
    • Регистрация: --
    • Репутация: (||)
    • 4 сентября 2009 13:28
    • 8
    ^
  • Группа: Гости
  • Icq: --
  • Комментариев: 0
  • Публикаций: 0

  • Цитата: Влад
    в прошлой версии не считал кол-во новых новостей при отключенном ЧПУ.... Блин и щас не считает


    недоработка... ибо мне не надо было. Вижу, что есть необходимость - доделаю.
    • kand2004
    • Регистрация: --
    • Репутация: (||)
    • 4 сентября 2009 15:56
    • 9
    ^
  • Группа: User
  • Icq: --
  • Комментариев: 72
  • Публикаций: 1
  • +1 за то что подкатегории считает.
    • heidality
    • Регистрация: 28.06.2009
    • Репутация: (0|0|0)
    • 4 сентября 2009 17:22
    • 10
    ^
  • Группа: User
  • Icq: --
  • Комментариев: 6
  • Публикаций: 0
  • А у меня не заработал. Двиг 8.2. Вместо кол-ва новостей показывает ххххххххх {count_categ _2}
    Это первый хак который я не смог заставить работать. Все делал несколько раз строго по пунктам.

    P.S. Все таки поставил этот хак, правда пришлось убрать кеширование и сделать так, чтобы кол-во новостей выводилось в правой стороне меню.
    __________________
    |Софт________(256)|
    |Фильмы______(356)|

    Примерно так меню выглядит у меня.
    • Aktteon
    • Регистрация: 5.08.2009
    • Репутация: (0|0|0)
    • 5 сентября 2009 01:01
    • 11
    ^
  • Группа: Гости
  • Icq: --
  • Комментариев: 0
  • Публикаций: 0
  • Друзья, в описании есть один баг.... Так как новость я не могу редактировать, то сообщу тут...
    В описании указано имя тега {count_categ _2}, что неправильно. Надо {count_categ_2} (без пробела между categ и _2)



    • kand2004
    • Регистрация: --
    • Репутация: (||)
    • 6 сентября 2009 17:17
    • 12
    ^
  • Группа: Гости
  • Icq: --
  • Комментариев: 0
  • Публикаций: 0
  • kand2004
    +1
    за поправку
    • adept78
    • Регистрация: --
    • Репутация: (||)
    • 10 сентября 2009 20:57
    • 13
    ^
  • Группа: User
  • Icq: --
  • Комментариев: 9
  • Публикаций: 0
  • Под категории второго уровня не читает
    Пример
    VIDEO (10)--|Фильмы(150)|----|Боевики(100)
    |Фантастика (50)
    • Steve
    • Регистрация: 5.05.2009
    • Репутация: (0|0|0)
    • 13 сентября 2009 03:30
    • 14
    ^
  • Группа: Гости
  • Icq: --
  • Комментариев: 0
  • Публикаций: 0
  • Цитата: Steve
    Под категории второго уровня не читаетПримерVIDEO (10)--|Фильмы(150)|----|Боевики(100) |Фантастика (50)


    Насколько я понял, проблема в том, что в главной категории не посчитало общее количество, что находится в подкатегориях? Того, что хак должен это делать, нет в описании.
    Хак просто считает новости в категориях не зависимо от того, главная это категория или подкатегория n-го уровня. Например, у Вас в категории VIDEO всего 10 новостей (т.е. журналист не удосужился подобрать подкатегорию к фильму, а просто бомбанул новость в главную категорию)
    Задачи считать общее количество новостей в подкатегориях не было :-)
    • kand2004
    • Регистрация: --
    • Репутация: (||)
    • 16 сентября 2009 20:29
    • 15
    ^
  • Группа: User
  • Icq: --
  • Комментариев: 4
  • Публикаций: 0
  • kand2004,подскажи пожалуйста,поставил я твой хак,все вроде нормально!Поставил я себе на сайт по-второму примеру Формирования внешнего вида,тоесть так
    $t = ' ('.$row['allnews_'].'/'.$row['new_']. '+)';
    ,но отображаеться все по-обычному как было с самого начала!!!Что делаю не так??? sad
    • zmey555
    • Регистрация: 27.09.2009
    • Репутация: (0|0|0)
    • 27 сентября 2009 19:08
    • 16
    ^
  • Группа: Гости
  • Icq: --
  • Комментариев: 0
  • Публикаций: 0
  • Супер мега респект тебе kand2004!!! Поставилось без проблем и все отлично работает!!! fellow
    А можно ли сделать так, чтобы кол-во новых новостей отображалось др. цветом (например красным) и чтоб при наведении на новые новости отображались названия этих новостей в всплывающем окошке, как в хинтбоксе (:.. это так, на заметку ..:)


    Цитата: KAND2004
    Возможно, кому-то покажется код неудобочитаемым или еще что-то не так - пишите, комментируйте - буду исправлять.

    Вот и первый недостаток обнаружил... если при публикации выбрать несколько категорий (например: антивирус и защита), то в навигации он покажет, что добавлена только одна новость (например: антивирус 1/+1, защита 0/0)... а должно быть, и там и там по единице!!!

    kand2004, если ты сможешь это как то исправить - заплюсую! wink


    Цитата: KAND2004
    Задачи считать общее количество новостей в подкатегориях не было

    А было бы неплохо... fellow
    • Vadeinpace
    • Регистрация: --
    • Репутация: (||)
    • 29 сентября 2009 20:25
    • 17
    ^
  • Группа: Гости
  • Icq: --
  • Комментариев: 0
  • Публикаций: 0
  • Цитата: zmey555
    но отображаеться все по-обычному как было с самого начала!!!Что делаю не так???

    Попробуй кэш почистить...
    • Vadeinpace
    • Регистрация: --
    • Репутация: (||)
    • 2 октября 2009 01:15
    • 18
    ^
  • Группа: Гости
  • Icq: --
  • Комментариев: 0
  • Публикаций: 0
  • Молодца! Хороший хак... как раз то что мне нужно было! Спасибо!
    • darkgod
    • Регистрация: --
    • Репутация: (||)
    • 25 октября 2009 09:55
    • 19
    ^
  • Группа: Модератор
  • Icq: 176377
  • Комментариев: 118
  • Публикаций: 5
  • DLE 8.2 всё проверил, отображается просто {count_categ _2}
    • Korsar
    • Регистрация: 24.05.2008
    • Репутация: (0|0|0)
    • 26 октября 2009 01:31
    • 20
    ^
  • Группа: User
  • Icq: --
  • Комментариев: 20
  • Публикаций: 1
  • Korsar,
    убери пробел после categ

    что не понравилось:
    1) считает только из определенной категории (вложенные подкатегории не учитывает)
    2) если выбрано несколько категорий, учитывает только первую из всех

    если бы это исправить, то за такой хак не жалко и забашлять, а так..
    • sinatra
    • Регистрация: 2.10.2009
    • Репутация: (0|0|0)
    • 13 ноября 2009 15:29
    • 21
    ^
  • Группа: User
  • Icq: 2929550
  • Комментариев: 32
  • Публикаций: 0
  • у меня проблема я непойму куда вставлять коды в main.tpl помогите пожалуста recourse

    --------------------
    • MTS32
    • Регистрация: 16.06.2009
    • Репутация: (0|0|0)
    • 13 ноября 2009 17:52
    • 22
    ^
  • Группа: Гости
  • Icq: --
  • Комментариев: 0
  • Публикаций: 0
  • Почему у меня выводится статистика только по общим новостям, а за сегодня нет статистики?? дле 8,2
    • Bezyan
    • Регистрация: --
    • Репутация: (||)
    • 19 января 2010 01:59
    • 23
    ^
  • Группа: Гости
  • Icq: --
  • Комментариев: 0
  • Публикаций: 0
  • Цитата: sinatra
    1) считает только из определенной категории (вложенные подкатегории не учитывает)


    да, есть такое. Только количество конкретной категории или подкатегории

    Цитата: sinatra
    2) если выбрано несколько категорий, учитывает только первую из всех

    посмотрите тут - баг исправлен
    http://1024kbytes.com/articles/3673-xak-dlya-dle-kolichestvo-novostej-v-menyu.ht
    ml


    Цитата: MTS32
    у меня проблема я непойму куда вставлять коды в main.tpl помогите пожалуста

    просто еще раз внимательно прочитайте инструкцию и все получится :)

    Цитата: Bezyan
    Почему у меня выводится статистика только по общим новостям, а за сегодня нет статистики?

    значит, что-то пропустили в инструкции. Пожалуйста, проверьте еще раз
    • kand2004
    • Регистрация: --
    • Репутация: (||)
    • 5 февраля 2010 23:49
    • 24
    ^
  • Группа: Гости
  • Icq: --
  • Комментариев: 0
  • Публикаций: 0
  • У меня dle 8.2 и этот хак некорректно работает, при загрузке главной странице после выполнения всех вышеуказанных действий выдает ошибку ображения к базе данных и ссылается на строку:

    $sql_result = $db->query("select ct.id,
    (select count(*) from ". PREFIX ."_post ps where ps.category = ct.id AND (DATE_FORMAT(date, '%Y%m%d')=CURDATE()) AND approve = '1') as new_,
    (select count(*) from ". PREFIX ."_post ps where ps.category = ct.id AND approve = '1') as allnews_
    from ". PREFIX ."_category ct"
    );
    Вообщем кто может подскажите что сделать чтобы все работало
    • Neo-dimon
    • Регистрация: --
    • Репутация: (||)
    • 18 апреля 2010 20:40
    • 25
    ^
    Информация
    Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.