• DONATE to NULLED!
    Форуму и его команде можно помочь, мотивировать модераторов разделов.
    Помогите модератору этого раздела killoff лично.

Хак {catmenu} для DLE 11.1 и ниже

killoff

CD тихо, и не DVD меня ;)
Команда форума
Модератор
Регистрация
13 Май 2008
Сообщения
2.619
Реакции
1.125
  • Автор темы
  • Модер.
  • #1
Решил сейчас вытащить теги
Код:
{catmenu}
{catmenu id="1,2,3-5" subcat="yes" template="custom" cache="yes"}
для версий ранее чем 11.2
Проверил на 11.1 - работает.
Итак. Нам нужен только файл engine/classes/templates.class.php
находим
PHP:
if( strpos( $this->template, "{include file=" ) !== false ) {
выше добавляем
PHP:
        if (strpos ( $this->template, "{catmenu" ) !== false) {
            $this->template = preg_replace_callback ( "#\\{catmenu(.*?)\\}#is", array( &$this, 'build_cat_menu'), $this->template );
        }
       
        if (strpos ( $this->template, "{catnewscount" ) !== false) {
            $this->template = preg_replace_callback ( "#\\{catnewscount id=['\"](.+?)['\"]\\}#i", array( &$this, 'catnewscount'), $this->template );
        }
находим
PHP:
        return $template;
    }

    function clear_url_dir($var) {
выше добавляем
PHP:
        if (strpos ( $template, "{catnewscount" ) !== false) {
            $template = preg_replace_callback ( "#\\{catnewscount id=['\"](.+?)['\"]\\}#i", array( &$this, 'catnewscount'), $template );
        }
       
        if (strpos ( $template, "{catmenu" ) !== false) {
            $template = preg_replace_callback ( "#\\{catmenu(.*?)\\}#is", array( &$this, 'build_cat_menu'), $template );
        }
находим
PHP:
function _clear() {
выше добавляем
PHP:
    function catnewscount( $matches=array() ) {
        global $cat_info;
       
        $id = intval($matches[1]);
       
        return intval($cat_info[$id]['newscount']);
    }

    function build_tree( $data ) {

        $tree = array();
        foreach ($data as $id=>&$node) {
            if ($node['parentid'] == 0) {
                $tree[$id] = &$node;
            } else {
                if (!isset($data[$node['parentid']]['children'])) $data[$node['parentid']]['children'] = array();
                $data[$node['parentid']]['children'][$id] = &$node;
            }
        }
       
        return $tree;

    }
   
    function recursive_array_search($needle, $haystack, $subcat = true, &$item = false) {
       
        if(!$item) $item = array();

        foreach($haystack as $key => $value) {

            if(in_array($key, $needle)) {
               
                $item[$key] = $value;
               
                if(!$subcat AND is_array( $value['children'] ) ) {
                    unset($item[$key]['children']);
                    $this->recursive_array_search($needle, $value['children'], $subcat, $item);
                }

            } elseif (is_array( $value['children'] ) ) {
                $this->recursive_array_search($needle, $value['children'], $subcat, $item);
            }
        }
       
        return $item;
    }

    function build_cat_menu( $matches=array() ) {
        global $cat_info, $config;

        if(!count($cat_info)) return "";

        if( !is_array($this->category_tree) ) {
           
            $this->category_tree = $this->build_tree($cat_info);
           
        }
       
        if(!count($this->category_tree)) return "";
       
        $param_str = trim($matches[1]);
        $allow_cache = $config['allow_cache'];
        $config['allow_cache'] = false;
        $catlist = $this->category_tree;
        $cache_id = md5($param_str);
       
        if( $config['category_newscount'] ) $cache_prefix = "news"; else $cache_prefix = "catmenu";
       
        if( preg_match( "#cache=['\"](.+?)['\"]#i", $param_str, $match ) ) {
            if( $match[1] == "yes" ) $config['allow_cache'] = 1;
        }
       
        $content = dle_cache( $cache_prefix, $cache_id );
       
        if( $content !== false ) {
           
            $config['allow_cache'] = $allow_cache;
            return $content;
       
        } else {
           
            if( preg_match( "#subcat=['\"](.+?)['\"]#i", $param_str, $match ) ) {
               
                $subcat = trim($match[1]);
               
                if($subcat == "yes") $subcat = true; else $subcat = false;
   
            } else $subcat = true;
           
            if( preg_match( "#id=['\"](.+?)['\"]#i", $param_str, $match ) ) {
   
                $temp_array = array();
       
                $match[1] = explode (',', $match[1]);
       
                foreach ($match[1] as $value) {
       
                    if( count(explode('-', $value)) == 2 ) $temp_array[] = get_mass_cats($value);
                    else $temp_array[] = intval($value);
       
                }
       
                $temp_array = implode(',', $temp_array);
           
                $catlist= $this->recursive_array_search( explode(',', $temp_array), $catlist, $subcat);
               
                if(!count($catlist)) return "";
               
            }
           
            if( preg_match( "#template=['\"](.+?)['\"]#i", $param_str, $match ) ) {
                $template_name = trim($match[1]);
            } else $template_name = "categorymenu";
   
            $template = $this->sub_load_template( $template_name . '.tpl' );
   
            $template = str_replace( "[root]", "", $template );
            $template = str_replace( "[/root]", "", $template );
           
            if( preg_match( "'\\[sub-prefix\\](.+?)\\[/sub-prefix\\]'si", $template, $match ) ) {
                $prefix = trim($match[1]);
                $template = str_replace( $match[0], "", $template );
            }
           
            if( preg_match( "'\\[sub-suffix\\](.+?)\\[/sub-suffix\\]'si", $template, $match ) ) {
                $suffix = trim($match[1]);
                $template = str_replace( $match[0], "", $template );
            }
           
            if($config['allow_cache']) {
                $template = preg_replace( "'\\[active\\](.+?)\\[/active\\]'si", "", $template );
            }
           
            if( preg_match( "'\\[item\\](.+?)\\[/item\\]'si", $template, $match ) ) {
                $item = trim($match[1]);
                $template = str_replace( $match[0], "{items}", $template );
               
                $template = str_replace( "{items}", $this->compile_menu($catlist, $prefix, $item, $suffix, false, 0), $template );
               
            }
           
            create_cache( $cache_prefix, $template, $cache_id);
           
            $config['allow_cache'] = $allow_cache;
           
            return $template;
       
        }

    }

    function compile_menu( $nodes, $prefix, $item_template, $suffix, $sublevelmarker = false, $indent = 0 ) {
       
        $item = "";
       
        foreach ($nodes as $node) {
           
            $item .= $this->compile_item($node, $item_template);
           
            if (isset($node['children'])) {
                if ( stripos ( $item_template, "{sub-item}" ) !== false ) {
                    $item = str_replace( "{sub-item}", $this->compile_menu($node['children'], $prefix, $item_template, $suffix, true, $indent+1), $item );
                } else {
                    $item .= $this->compile_menu($node['children'], $prefix, $item_template, $suffix, true, $indent+1);
                }
            }
           
        }
       
        if( $sublevelmarker ) {
           
            $item =  $prefix.$item.$suffix;
           
        }
           
       
        return $item;
    }
   
    function compile_item( $row,  $template) {
        global $config, $category_id;
       
        $category = intval($category_id);
       
        $template = str_replace( "{name}", $row['name'], $template );
        $template = str_replace( "{icon}", $row['icon'], $template );
        $template = str_replace( "{url}", $config['http_home_url'] . get_url( $row['id'] ) . "/" , $template );
        $template = str_replace( "{news-count}", intval($row['newscount']), $template );
       
        if($category == $row['id']) {
            $template = str_replace( "[active]", "", $template );
            $template = str_replace( "[/active]", "", $template );
        } else {
            $template = preg_replace( "'\\[active\\](.+?)\\[/active\\]'si", "", $template );
        }
       
        if(!isset($row['children'])) {
            $template = str_replace( "{sub-item}", "", $template );
            $template = preg_replace( "'\\[isparent\\](.+?)\\[/isparent\\]'si", "", $template );
        } else {
            $template = str_replace( "[isparent]", "", $template );
            $template = str_replace( "[/isparent]", "", $template );
        }
       
        return $template;
       
    }
Готово!

В шаблоне используйте теперь
{catmenu}

Для вывода меню категорий используется тег {catmenu}. Данный тег вы можете использовать в любом файле шаблонов, он является глобальным. Данный тег в свою очередь использует и подключает файл шаблона categorymenu.tpl.

{catmenu id="1,2,3-5" subcat="yes" template="custom" cache="yes"}

Выводит меню категорий в пользовательском формате, где:

id="1,2,3-5" - список ID категорий которые необходимо вывести в меню. Вы можете перечислить несколько категорий через запятую, либо указать диапазон ID через тире.

subcat="yes" - данный параметр принимает значения "yes" или "no" и используется совместно с параметром id данного тега, и указывает нужно ли автоматически подключать подкатегории для указанного списка категорий. Например, есть категория с ID 1, у данной категории есть подкатегории с ID 2 и ID 3, то при использовании тега {catmenu id="1" subcat="yes"} будет выведена категория 1 и ее подкатегории 2 и 3, а при использовании тега {catmenu id="1" subcat="no"} будет выведена только категория с ID 1.

template="custom" - указывается имя шаблона, которое будет использоваться для формирования меню вместо стандартного categorymenu.tpl

cache="yes" - данный параметр принимает значения "yes" или "no" и указывает кешировать данный блок или нет. При включении кеширования, автоматически пропадет возможность управлять подсветкой активной просматриваемой категории через теги [active] текст [/active] в шаблоне.

{catnewscount id="X"}

Выводит количество публикаций для указанной категории, где X это ID нужной вам категории. Данный тег будет полезен для вывода количества публикаций, в уже сформированных вручную в шаблонах меню на сайтах.

Для подсчета количества новостей - в engine/init.php найти
PHP:
//####################################################################################################################
//                    Определение категорий и их параметры
//####################################################################################################################
$cat_info = get_vars ( "category" );

if (!is_array ( $cat_info )) {
    $cat_info = array ();

    $db->query ( "SELECT * FROM " . PREFIX . "_category ORDER BY posi ASC" );
    while ( $row = $db->get_row () ) {

        $cat_info[$row['id']] = array ();

        foreach ( $row as $key => $value ) {
            $cat_info[$row['id']][$key] = stripslashes ( $value );
        }

    }
    set_vars ( "category", $cat_info );
    $db->free ();
}
и заменить на
PHP:
//####################################################################################################################
//                    Определение категорий и их параметры
//####################################################################################################################
$cat_info = get_vars ( "category" );

if (!is_array ( $cat_info )) {
    $cat_info = array ();

    $db->query ( "SELECT * FROM " . PREFIX . "_category ORDER BY posi ASC" );
    while ( $row = $db->get_row () ) {

        $cat_info[$row['id']] = array ();

        foreach ( $row as $key => $value ) {
            $cat_info[$row['id']][$key] = stripslashes ( $value );
        }
       
        $cat_info[$row['id']]['newscount'] = 0;

    }
    set_vars ( "category", $cat_info );
    $db->free ();
}
//####################################################################################################################
//                    Подсчет количества новостей у категорий
//####################################################################################################################
if( $config['category_newscount'] ) {

    $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) ) die( "Cache data not correct" );
   
    } 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 ( $news_count_in_array as $key => $value ) {
        $cat_info[$key]['newscount'] = $value;
    }
   
    unset($news_count_in_array);
}

Так же проверено на ДЛЕ 11.1
 
@killoff знаешь почему не одобрю и лайк не поставлю?

Ты, конечно, молодец, вытащил, работает, полезно... Но!
Именно такие бекпорты подбадривают "да мне и на 6.0 хорошо, зачем обновляться?"
 
  • Автор темы
  • Модер.
  • #3
менно такие бекпорты подбадривают "да мне и на 6.0 хорошо, зачем обновляться?"
это конечно понятно! у меня у с полгода назад были сайты и на 10,0/10,1 версиях, весной-летом обновил их до 11/11.1. Просто иногда в двиге сделано столько правок, что их за 1-2 часа все не восстановить :( и приходится нужное что то вытаскивать из новых версий, чтобы не использовать сторонние хаки/модули которые только увеличивают нагрузку сайту.
 
Последнее редактирование:
Назад
Сверху