- Регистрация
 - 13 Май 2008
 
- Сообщения
 - 2.734
 
- Реакции
 - 1.185
 
- Автор темы
 - Модер.
 - #1
 
Решил сейчас вытащить теги
	
	
	
		
для версий ранее чем 11.2
Проверил на 11.1 - работает.
Итак. Нам нужен только файл engine/classes/templates.class.php
находим
	
	
	
		
выше добавляем
	
	
	
		
находим
	
	
	
		
выше добавляем
	
	
	
		
находим
	
	
	
		
выше добавляем
	
	
	
		
Готово!
В шаблоне используйте теперь
Для подсчета количества новостей - в engine/init.php найти
	
	
	
		
и заменить на 
	
	
	
		
Так же проверено на ДЛЕ 11.1
	
		
			
		
		
	
				
			
		Код:
	
	{catmenu}
{catmenu id="1,2,3-5" subcat="yes" template="custom" cache="yes"}
	Проверил на 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
				
 и приходится нужное что то вытаскивать из новых версий, чтобы не использовать сторонние хаки/модули которые только увеличивают нагрузку сайту.