Категории с одинаковыми названиями
Столкнулся с данной проблемой. На мебельном сайте было две основных категории. В каждой из них одинаковые бренды, которые естественно совпадают по названию. А ведь так не хочется дописывать в url всякую ерунду кроме названия...
Установка:
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 категории, сначала собираем массив, находим в нем категорию родителя и возвращаем скорректированный ответ.
2. Открыть 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 категории.
3. Открыть 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 );
Готово!
• Источник
Посетители, находящиеся в группе Гость, не могут оставлять комментарии к данной публикации.