Перейти к публикации

galabba

новички
  • Публикации

    2
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные пользователем galabba

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

     

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

     

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

    Идем в /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 );

     

×
×
  • Создать...