- Регистрация
- 13 Май 2008
- Сообщения
- 2.667
- Реакции
- 1.149
- Автор темы
- Модер.
- #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