• SanDev.pro
  •  › 
  • Datalife Engine
  •  › 
  • Количество новостей в категории, для DLE 11.1 и младше
Количество новостей в категории, для DLE 11.1 и младше для DLE

Количество новостей в категории, для DLE 11.1 и младше

Количество новостей в категории, для DLE 11.1 и младше

Данная статья представляет собой простую адаптацию функционала актуальной версии DLE для более старых.
С помощью данного хака появится возможность с помощью тега:
{catnewscount id="id_категории"}

В любом месте шаблона выводить количество новостей в заданной категории.

Установка
Открыть файл engine/init.php
Найти строку:
$banned_info = get_vars ( "banned" );

Выше нее вставить:
$news_count_in_array = dle_cache ( "news", "newscountcacheincats" );
if ($news_count_in_array) {
	$news_count_in_array = json_decode($news_count_in_array, true);
	if ( !is_array($news_count_in_array) ) $news_count_in_array = array();
} else {
	$news_count_in_array = array();
	if( $config['no_date'] AND !$config['news_future'] ) {
		$thisdate = date( "Y-m-d H:i:s", $_TIME );
		$where_date = " AND date < '" . $thisdate . "'";
	} else $where_date = "";

	$db->query( "SELECT category, COUNT(*) AS count FROM " . PREFIX . "_post WHERE approve=1" . $where_date . " GROUP BY category" );
	while ( $row = $db->get_row() ) {
		if(!$row['category']) continue;
		$cat_array = $temp_cat_array = explode(",", $row['category']);
		foreach ( $temp_cat_array as $value ) {
			if(!isset($news_count_in_array[$value])) $news_count_in_array[$value] = $row['count'];
			else $news_count_in_array[$value] = $news_count_in_array[$value] + $row['count'];
			if( $config['show_sub_cats']) {
				$temp_parent = $cat_info[$value]['parentid'];
				while ( $temp_parent ) {
					if( !in_array($temp_parent, $cat_array) ) {
						if(!isset($news_count_in_array[$temp_parent])) $news_count_in_array[$temp_parent] = $row['count'];
						else $news_count_in_array[$temp_parent] = $news_count_in_array[$temp_parent] + $row['count'];
						$cat_array[] = $temp_parent;
					}
					$temp_parent = $cat_info[$temp_parent]['parentid'];
				}
			}
		}
	}
	create_cache("news", json_encode($news_count_in_array), "newscountcacheincats");
	unset($temp_parent, $temp_cat_array, $cat_array);
}

foreach ($cat_info as $key => $value) {
	$cat_info[$key]['newscount'] = (int)$news_count_in_array[$key];
}
unset($news_count_in_array);


Открыть файл engine/classes/template.class.php
Найти строку:
$this->template = file_get_contents( $this->dir . "/" . $tpl_name );

Ниже нее вставить:
		if (strpos ( $this->template, "{catnewscount" ) !== false) {
			$this->template = preg_replace_callback ( "#\\{catnewscount id=['\"](.+?)['\"]\\}#i", array( &$this, 'catnewscount'), $this->template );
		}


Найти строку:
$template = file_get_contents( $templatefile );

Ниже нее вставить:
		if (strpos ( $template, "{catnewscount" ) !== false) {
			$template = preg_replace_callback ( "#\\{catnewscount id=['\"](.+?)['\"]\\}#i", array( &$this, 'catnewscount'), $template );
		}


Найти строку:
	function compile($tpl) {

Выше нее вставить:
	function catnewscount($matches = array()) {
		global $cat_info;
		$id = (int)$matches[1];
		return (int)$cat_info[$id]['newscount'];
	}


С уважением,
Олег Александрович a.k.a. Sander
Комментарии: (20)
  1. foto
    VIP 7 июля 2018 11:40 #
    Добрый день! А такое решение уже не актуальна или есть какие то не недочеты??? Он у меня на DLE 11.3...

    p.s. код вы писали ;)

    Вывод количества новостей в категориях для большого количества категорий.

    Открыть файл index.php
    В engine/modules/main.php

    Найти строку:
    echo $tpl->result['main'];
    ПЕРЕД ней вставить:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    $cat_amounts = @file_get_contents(ENGINE_DIR."/cache/news_amount.tmp");
    if(!$cat_amounts){
    function calcParent($k,$id){
    global $cat_info,$cat_amounts;
    if(!$k) return false;
    $cat_amounts[$k][] = $id;
    calcParent($cat_info[$k]['parentid'],$id);
    }
    $cat_amounts = array();
    $db->query("SELECT category,id FROM ".PREFIX."_post WHERE approve");
    while($row = $db->get_row()){
    $c = explode(",",$row['category']);
    foreach($c as $k) calcParent($k,$row['id']);
    }
    foreach($cat_amounts as $k=>$v){
    $v = array_unique($v);
    $cat_amounts[$k] = count($v);
    }
    file_put_contents(ENGINE_DIR."/cache/news_amount.tmp",serialize($cat_amounts),LOCK_EX);
    }else $cat_amounts = unserialize($cat_amounts);
    function namaunt($m){
    global $cat_amounts,$category_id;
    $id = is_array($m)?intval($m[1]):intval($m);
    if($id<1 AND $category_id) $id = $category_id;
    return intval($cat_amounts[$id]);
    }
    $tpl->result['main'] = preg_replace_callback("#{namaunt=(\d+)}#i","namaunt",$tpl->result['main']);
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


    В любом месте шаблона сайта использовать тег:
    10
    где 5 - ID желаемой категории
    0
    1. foto
      Администратор 7 июля 2018 11:54 #
      Лучше использовать вариант со статьи.
      1. Он более оптимизирован.
      2. Есть возможность в случае чего внутри движка использовать переменную $cat_info[$id]['newscount'];
      +1
      1. foto
        VIP 7 июля 2018 15:15 #
        Как вставляю:

        function catnewscount($matches = array()) {
        global $cat_info;
        $id = (int)$matches[1];
        return (int)$cat_info[$id]['newscount'];
        }

        Сайт не открывается - белая страница. Лог

        PHP Fatal error: Cannot redeclare dle_template::catnewscount() in /home/webz/site.net/engine/classes/templates.class.php on line 903

        Что не так ???
        0
        1. foto
          Администратор 8 июля 2018 10:23 #
          Может у вас DLE 11.2 или старше?
          0
          1. foto
            VIP 8 июля 2018 12:49 #
            11.3
            0
            1. foto
              Администратор 8 июля 2018 12:54 #
              Старше или младше в отношении ПО относится не к дате выхода, а к версии.
              Версия 11.3 - старше 11.1
              В заголовке написано - для DLE 11.1 и младше. Т.е. для 11.1, 11.0, 10.x, 9.x, 8.x и т.п.

              Код указанный в статье появился в 11.2, т.е. у вас он уже есть изначально.
              0
              1. foto
                VIP 8 июля 2018 13:30 #
                Извините! Не внимателен был!
                0
      2. foto
        Гость 31 октября 2022 19:38 #
        Здравствуйте $cat_info[$id]['newscount']; в engine.php будет работать?
        0
  2. foto
    Гость 28 июля 2018 09:00 #
    dle 13.0 not work
    0
    1. foto
      Администратор 28 июля 2018 09:07 #
      Of course it is not.
      I explained it here:
      https://sandev.pro/web/140-kolichestvo-novostey-v-kategorii-dlya-dle-111-i-mladshe.html#comment-id-1356

      You don't need to use this code because you already have it.
      0
    2. foto
      Клиент 7 августа 2019 12:04 #
      In 13 version this is integrated, with code {catnewscount id="X"}
      0
  3. foto
    Клиент 8 августа 2018 18:51 #
    comments can be created modulus? {catcomncount id="id_категории"} how to created?
    0
    1. foto
      Администратор 9 августа 2018 17:42 #
      Yes. It is possible. But i'm don't want to do it.
      0
  4. foto
    Гость 17 ноября 2018 13:43 #
    А можно ли как-то сделать автоматический вывод ссылок в меню на те категории, в которых больше всего новостей.
    0
    1. foto
      Администратор 18 ноября 2018 15:11 #
      Да, можно.
      Для этого достаточно написать модуль, который будет собственно формировать и выводить этот список.
      0
  5. foto
    Гость 21 ноября 2018 10:21 #
    Создаем файл cat_count.php в папке engine/modules/

    Вставляем код:
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
    <?php
    if(!defined('DATALIFEENGINE'))die("Hacking attempt!");
    //Подключаем API CMS DLE
    include ('engine/api/api.class.php');

    //формируем список категорий которые мы ввели в параметр cat=
    $aviable = array();
    $aviable = explode( ',', $cat );

    //Выполняем запрос
    $SQL = $db->query ( "SELECT * FROM " . PREFIX . "_post WHERE category regexp '[[:<:]](" . implode ( '|', $aviable ) . ")[[:>:]]'".$where_date." and approve=1");
    $count = $row = $db->num_rows();
    if($count != 0)
    echo $count;
    ?>
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////

    В любом месте шаблона вводим {include file="engine/modules/cat_count.php?cat=50"}
    Параметр cat, номер категории
    0
    1. foto
      Администратор 21 ноября 2018 17:26 #
      Это очень, очень и очень плохое и неправильное решение.

      С точки зрения пользователя:
      - Высокая нагрузка
      - Нет учета подкатегорий. Т.е. при попытке получения количества новостей в родительской категории, новости отмеченные в дочерних категориях учитываться не будут.

      По коду - все плохо. Но хуже всего запрос в БД.
      Данный запрос извлекает из БД ВСЕ данные ВСЕХ полей и колонок из таблицы dle_post, а затем просто считает количество полученных строк.
      Безумно нерациональное использование ресурсов.
      0
      1. foto
        Гость 22 ноября 2018 07:44 #
        Ваш хак отображает 0 новостей, а этот работает, dle 10.5
        -2
  6. foto
    Гость 25 сентября 2019 18:27 #
    Я толком и не понял как этот хак работает, у меня просто выводится количество новостей на странице, то есть просто цифра 10. Нельзя с помощью данного хака дать пользователю возможность выбирать количество выводимых новостей на странице?.
    0
    1. foto
      Гость 25 сентября 2019 19:13 #
      Я так понял этот хак выводит общее число (количество) новостей которые находятся в определенной категории, а не выводимое количество новостей на странице. Прочел невнимательно, сорри.
      0
Добавить комментарий

Внимание! Все сообщения касающиеся техподдержки будут удалены или проигнорированы

Attention! All messages asking for technical support will be removed or ignored

  • Логин
  • E-mail (не обязательно)
Повторите рисунок:
antibot
© Sander-Development. 2009-2024.
При копировании, ссылка на источник обязательна.