Скрыть объявление
ВАШИ ПРАВА ОГРАНИЧЕНЫ!

Зарегистрируйтесь на форуме, чтобы стать полноценным участником сообщества!

{catmenu} для dle 11.1 и ниже

Тема в разделе "Хаки DLE", создана пользователем byroot, 15 дек 2016.

15.12.16 в 18:05
29.09.19 в 13:14
51
8.924
2
  1. TopicStarter Overlay
    byroot

    Забанен

    Регистрация:
    10 окт 2015
    Сообщения:
    12.297
    Лучших ответов:
    54
    Рейтинги:
    +5.205 / 74 / -0
    Решил сейчас вытащить теги
    Код:
    {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)) == $temp_array[] = get_mass_cats($value);
                        else 
    $temp_array[] = intval($value);
           
                    }
           
                    
    $temp_array implode(','$temp_array);
               
                    
    $catlist$this->recursive_array_searchexplode(','$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$suffixfalse0), $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 ) {
           
            
    $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$suffixtrue$indent+1), $item );
                    } else {
                        
    $item .= $this->compile_menu($node['children'], $prefix$item_template$suffixtrue$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;
           
        }
    Готово!

    В шаблоне используйте теперь
    Для подсчета количества новостей - в 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_arraytrue);
       
                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
     
    • Нравится Нравится x 2
  2. Heiz

    PRO Users

    Регистрация:
    24 сен 2016
    Сообщения:
    1.119
    Лучших ответов:
    1
    Рейтинги:
    +315 / 48 / -0
    @byroot, а второе есть из коробки в 11.2? Я про подсчет новостей.
     
  3. TopicStarter Overlay
    byroot

    Забанен

    Регистрация:
    10 окт 2015
    Сообщения:
    12.297
    Лучших ответов:
    54
    Рейтинги:
    +5.205 / 74 / -0
    да есть, из 11.2 и выдрано!
     
    • Нравится Нравится x 3
  4. Karabas Barabas

    Команда форума VIP Кинотрафик v2

    Регистрация:
    20 ноя 2015
    Сообщения:
    8.172
    Лучших ответов:
    1
    Рейтинги:
    +3.756 / 12 / -0
    Да, по умолчанию уже есть.
     
    • Нравится Нравится x 3
  5. TopicStarter Overlay
    byroot

    Забанен

    Регистрация:
    10 окт 2015
    Сообщения:
    12.297
    Лучших ответов:
    54
    Рейтинги:
    +5.205 / 74 / -0
    и это только для использования в шаблонах меню выводимые тегами catmenu...
     
    • Нравится Нравится x 1
  6. aeneas

    Забанен

    Регистрация:
    12 мар 2016
    Сообщения:
    11.489
    Лучших ответов:
    10
    Рейтинги:
    +4.043 / 208 / -0
    а зачем это ? типа в сайтбаре меню не руками прописывать ?
     
  7. TopicStarter Overlay
    byroot

    Забанен

    Регистрация:
    10 окт 2015
    Сообщения:
    12.297
    Лучших ответов:
    54
    Рейтинги:
    +5.205 / 74 / -0
    если не знаешь как это использовать - оно тебе не нужно! ;)
     
    • Нравится Нравится x 3
  8. aeneas

    Забанен

    Регистрация:
    12 мар 2016
    Сообщения:
    11.489
    Лучших ответов:
    10
    Рейтинги:
    +4.043 / 208 / -0
    ты лучше сделай фильтр как на хдрезке а то кое кто протух навечно как всегда )) чем фигню всякую ненужную людям раздавать применение которой даже я не знаю ))))
     
  9. TopicStarter Overlay
    byroot

    Забанен

    Регистрация:
    10 окт 2015
    Сообщения:
    12.297
    Лучших ответов:
    54
    Рейтинги:
    +5.205 / 74 / -0
    настраиваю сайт на 11.1 - пришлось вытащить этот функционал т.к. обновлять будет долго... фильтр как на аш*резке - используй фильтр гамира ;)
     
    • Нравится Нравится x 1
  10. Heiz

    PRO Users

    Регистрация:
    24 сен 2016
    Сообщения:
    1.119
    Лучших ответов:
    1
    Рейтинги:
    +315 / 48 / -0
    Тебе ж советовали фильтры Сендера и Геймера
     
    • Нравится Нравится x 2
  11. aeneas

    Забанен

    Регистрация:
    12 мар 2016
    Сообщения:
    11.489
    Лучших ответов:
    10
    Рейтинги:
    +4.043 / 208 / -0
    блин ты ссылки сказал делать, представь такое гамно будет и вес уводить и в индекс попадет, там надо другое что то, на аяксе наверное
    оба не то, допиливать надо, они на селектах, а нужны ссылки
    ну или как я хз
     
  12. TopicStarter Overlay
    byroot

    Забанен

    Регистрация:
    10 окт 2015
    Сообщения:
    12.297
    Лучших ответов:
    54
    Рейтинги:
    +5.205 / 74 / -0
    у меня сейчас категорий почти 100 штук, и мне лучше сделать 2-3 инклуда для вывода меню с подсчетом кол-ва новостей в категориях, чем прописывать все пункты в меню вручную! Это всё только для меню и нужно, а так же для подсчета кол-ва новостей, опять же только для тех - кто пока не хочет или нет возможности обновится до 11.2 где этот функционал уже встроен в двиг по умолчанию.
     
    • Нравится Нравится x 1
  13. PunPun

    VIP Кинотрафик v2

    Регистрация:
    11 июн 2015
    Сообщения:
    7.299
    Лучших ответов:
    31
    Рейтинги:
    +3.894 / 96 / -0
    Подсчет новостей убьет сайт к чертям собачим, они реализовали его хуже чем я это представлял. Выкачу свой подсчет с блэкджеком и шлюхами.
     
    • Нравится Нравится x 3
  14. aeneas

    Забанен

    Регистрация:
    12 мар 2016
    Сообщения:
    11.489
    Лучших ответов:
    10
    Рейтинги:
    +4.043 / 208 / -0
    насчет подсчет убьет сайт.. соглашусь с гамом на 100%
     
  15. Martoha

    Команда форума VIP Кинотрафик v2

    Регистрация:
    20 сен 2015
    Сообщения:
    1.019
    Лучших ответов:
    0
    Рейтинги:
    +126 / 0 / -0
    @byroot, Привет! А к категориям можно как то прикрутить картинку. Например для каждой свою картинку?
     
  16. TopicStarter Overlay
    byroot

    Забанен

    Регистрация:
    10 окт 2015
    Сообщения:
    12.297
    Лучших ответов:
    54
    Рейтинги:
    +5.205 / 74 / -0
    К каждой категории есть пункт ИКОНКА в админке. Можно их как то выводить, но пока не пробовал этого... В доках тега для этого не нашел :(
     
    • Нравится Нравится x 1
  17. Martoha

    Команда форума VIP Кинотрафик v2

    Регистрация:
    20 сен 2015
    Сообщения:
    1.019
    Лучших ответов:
    0
    Рейтинги:
    +126 / 0 / -0
    Вот и я смотрю документацию но что то не чего подобного найти не могу(
     
  18. Martoha

    Команда форума VIP Кинотрафик v2

    Регистрация:
    20 сен 2015
    Сообщения:
    1.019
    Лучших ответов:
    0
    Рейтинги:
    +126 / 0 / -0
    А хотя вот нашел что upload_2017-1-7_16-7-32.png
     
    • Нравится Нравится x 1
  19. Martoha

    Команда форума VIP Кинотрафик v2

    Регистрация:
    20 сен 2015
    Сообщения:
    1.019
    Лучших ответов:
    0
    Рейтинги:
    +126 / 0 / -0
    @byroot, Ну та работает конечно хорошо но ток в шортстори(
    А могеш прикрутить к главной?) И по цене сколько будет стоить?)
    Вообше лучше к {catmenu} что бы красиво выводить можно было)
     
  20. TopicStarter Overlay
    byroot

    Забанен

    Регистрация:
    10 окт 2015
    Сообщения:
    12.297
    Лучших ответов:
    54
    Рейтинги:
    +5.205 / 74 / -0
    попробуй в engine/modules/main.php
    после
    Код:
    $tpl->set ( '{speedbar}', $tpl->result['speedbar'] );
    добавить
    Код:
            if( $row['category'] AND $cat_info[$row['category']]['icon'] ) {
               
                $tpl->set( '{category-icon}', $cat_info[$row['category']]['icon'] );
           
            } else {
               
                $tpl->set( '{category-icon}', "{THEME}/dleimages/no_icon.gif" );
           
            }
    и использовать тег {category-icon} в main.tpl
     
    • Нравится Нравится x 2
Яндекс.Метрика