Jump to content
Sign in to follow this  
galabba

Категории с одинаковыми названиями в DLE 11.X и 12.X

Recommended Posts

Нашла в интернете хак на создание категории с одинаковыми названиями:

 

Собственно, вопрос: он не сломает вывод новостей, там где не ожидалось (не нарушится вывод похожих новостей, карта сайта или что-нибудь еще)?

 

Собственно сам хак:

Идем в /engine/modules/functions.php и находим эту функцию:

function get_ID($cat_info, $category) {
    foreach ( $cat_info as $cats ) {
        if( $cats['alt_name'] == $category ) return $cats['id'];
    }
    return false;
}

Комментируем её и вставляем ниже:

function get_ID($cat_info, $category) {
    $catsarray = array();
    foreach ($cat_info as $cats) {
        if($cats['alt_name'] == $category) {
            $catsarray[] = $cats['id'];
        }
    }
    if(count($catsarray) > 1) {
        if($_GET['category']) {
            $catname = explode('/', $_GET['category']);
            $catname = $catname[count($catname)-2];
            foreach($catsarray as $cat) {
                if($cat_info[$cat_info[$cat]['parentid']]['alt_name'] == $catname) {
                    return $cat;
                }
            }
        }
    } else {
        return $catsarray[0];
    }
    return false;
}

Как можно заметить, код очень прост. Мы вместо того, чтобы возвращать сразу ID категории, сначала собираем массив, находим в нем категорию родителя и возвращаем скорректированный ответ. Если будет интересно - могу дописать построчно комментарии :)

Далее идем в /engine/inc/categories.php и комментируем 2 кода, которые отвечают за проверку:

$row = $db->super_query( "SELECT alt_name FROM " . PREFIX . "_category WHERE alt_name ='{$alt_cat_name}'" );
	
if( $row['alt_name'] ) {
    msg( "error", $lang['cat_error'], $lang['cat_eradd'], "?mod=categories" );
}
$row = $db->super_query( "SELECT id, alt_name FROM " . PREFIX . "_category WHERE alt_name = '$alt_cat_name'" );
	
if( $row['id'] and $row['id'] != $catid ) {
    msg( "error", $lang['cat_error'], $lang['cat_eradd'], "javascript:history.go(-1)" );
}

Почему два? Один проверяет совпадение по базе в момент добавления категории, а второй при редактировании. Казалось бы на этом всё. Но стоит лишь на сайте активировать кеширование и наблюдаем, что на всех совпадающих названиях из кеша достается последняя закешированная категория!

Давайте поправим добавив в логику кеширования ID категории. Идем в /engine/engine.php и ищем:

$active = dle_cache( "news", $cache_id . $cache_prefix, true );

И добавляем $category_id. В итоге:

$active = dle_cache( "news", $category_id . $cache_id . $cache_prefix, true );

Пару десятков строк ниже находим:

create_cache ( "news", $tpl->result['content'], $cache_id . $cache_prefix, true );

И повторяем трюк с категорией:

create_cache ( "news", $tpl->result['content'], $category_id . $cache_id . $cache_prefix, true );

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...