.comment { color: gray; } .keyword { font-weight: bold; } .html .atribute .value { color: green; }

вторник, 16 марта 2010 г.

Проблема с Itemid в VirtueMart

При переходе между категориями к пути в адресной строке добавляется еще один параметр Itemid. Он берется из переменной сессии. То есть если я зашел в категорию с Itemid=1, то перейдя в другую категорию с другим Itemid=2, к пути добавится Itemid=1, а не Itemid=2, и так будет пока не закончится сессия. Это плохо влияет на отображение навигации, а также на SEF урлы.
Решение нашел здесь.
Варианты предлагались разные, но этот рабочий и наиболее изящный. Редактируется класс ps_session.php, ищите функцию getShopItemid(). Вот так она должна выглядеть после редакции:
function getShopItemid() {

if( empty( $_REQUEST['shopItemid'] )) {
$db = new ps_DB;
$db->query( "SELECT id FROM #__menu WHERE link='index.php?option=com_virtuemart' AND published=1");
if( $db->next_record() ) {
$_REQUEST['shopItemid'] = $db->f("id");
}
else {
if( !empty( $_REQUEST['Itemid'] )) {
$_REQUEST['shopItemid'] = intval( $_REQUEST['Itemid'] );
}
else {
$_REQUEST['shopItemid'] = 1;
}
}

// ЗДЕСЬ СОБСТНО ДОПОЛНЕНИЯ
} else {
return intval($_REQUEST['Itemid']);
}
// КОНЕЦ ДОПОЛНЕНИЯ
return intval($_REQUEST['shopItemid']);
}
Логика проста, если Itemid установлено (а при переходе в другую категорию оно передается), то функция не меняет его на сессионную переменную и оставляет как есть, что нам и нужно.

4 комментария:

  1. Отлично, мне очень помогло!!!

    ОтветитьУдалить
  2. Спасибо!!! Долго искал решение этой проблемы. Очень помогло!
    Все работает.

    ОтветитьУдалить
  3. спасибо! большое спасибо!!!)))

    ОтветитьУдалить
  4. незнаю было ли подобное у других но в browse_orderbyform.tpl.php обнаружил вот такую строчку
    input type="hidden" name="Itemid" value=""
    возможно конечно кто-то до меня правил скрипт, но лишним не будет отписать тут что так делать не стоит, следует указывать так
    input type="hidden" name="Itemid" value="getShopItemid() ?>" /

    ОтветитьУдалить