Обозначения:
VirtueMartControllerCategory - контроллер категории /components/com_virtuemart/contoller/category.php
VirtuemartViewCategory - представление категории /components/com_virtuemart/views/category/view.html.php
1. Очищаем кеш
2. заходим на 1ую страницу категории 1 (id = 1)
на входе LastVisitedCategoryId = 0
страницы в кеше нет, поэтому VirtueMartControllerCategory::display -> VirtuemartViewCategory::display. Результат выполнения VirtuemartViewCategory::display попадает в кеш.
в VirtuemartViewCategory::display выполняется функция указания LastVisitedCategoryId.
на выходе LastVisitedCategoryId = 1
3. заходим на 1ую страницу категории 2 (id = 2)
на входе LastVisitedCategoryId = 1
страницы в кеше нет, поэтому VirtueMartControllerCategory::display -> VirtuemartViewCategory::display. Результат выполнения VirtuemartViewCategory::display попадает в кеш.
на выходе LastVisitedCategoryId = 2
4. заходим на 2ую стр категории 2
на входе LastVisitedCategoryId = 2
страницы в кеше нет, поэтому VirtueMartControllerCategory::display -> VirtuemartViewCategory::display. Результат выполнения VirtuemartViewCategory::display попадает в кеш.
на выходе LastVisitedCategoryId = 2
5. заходим на 1ую страницу категории 1
на входе LastVisitedCategoryId = 2
страницы в кеше есть, поэтому VirtueMartControllerCategory::display -> берем из кеша результат VirtuemartViewCategory::display, и не выполняем его.
Изменения LastVisitedCategoryId не происходит! на выходе LastVisitedCategoryId = 2
6. пытаемся зайти на 2ую страницу категории 1, но попадаем на 1ую
на входе LastVisitedCategoryId = 2
страницы в кеше нет, поэтому VirtueMartControllerCategory::display -> VirtuemartViewCategory::display. Т.к. LastVisitedCategoryId не соответствует реально открытой категории, то нас кидает на 1ую страницу и результат выполнения с неправильной навигацией VirtuemartViewCategory::display попадает в кеш.
на выходе LastVisitedCategoryId = 1 (если страница не была закеширована, то на выходе имеем правильный LastVisitedCategoryId, поэтому например 3ья страница уже отрабатывает корректно (недолго))
Вариант решения:
Т.к. контроллер не кешируется, то в /components/com_virtuemart/contoller/category.php в конце function display добавить setLastVisitedCategoryId:
public function display($cachable = false, $urlparams = false) {
if (JRequest::getvar('search')) {
$view = $this->getView('category', 'html');
$view->display();
} else {
// Display it all
$safeurlparams = array('virtuemart_category_id'=>'INT','virtuemart_manufacturer_id'=>'INT','virtuemart_currency_id'=>'INT','return'=>'BASE64','lang'=>'CMD','orderby'=>'CMD','limitstart'=>'CMD','order'=>'CMD','limit'=>'CMD');
parent::display(true, $safeurlparams);
}
if($categoryId = JRequest::getInt('virtuemart_category_id',0)){
shopFunctionsF::setLastVisitedCategoryId($categoryId);
}
}