Всем привет!
Наверное всем известна ошибка, что если для магазина создавать меню средствами mod_mainmenu, с указанием идентификатора категории, то активные ссылки на этом меню не работают, а если быть точнее, то всегда активной ссылкой считается первый пункт меню. Это раз!
Если переходить по такому меню и в приглянувшейся категории попытаться выбрать товар, то мы видим, что теперь даже в ссылку подсовывается $Itemid от первого пункта меню... Это два!
Сегодня после всех попыток воссоздать меню, средствами VirtueMart в точности такое же как было на mod_mainmenu, и перекопав все форумы и не найдя нужного ответа, я решил найти и устранить проблему в магазине.
Я посидел сегодня и покопался в коде VirtueMart и обнаружил вот такой примечательный кусок:
/administrator/components/com_virtuemart/classes/ps_session.php в районе 461 строки
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;
}
}
}
return intval($_REQUEST['shopItemid']);
}
Здесь-то и крылась ошибка, в совершенно безлогично написанном коде.
Почему-то все приоритеты получения $Itemid из ссылки ушли на задний план. Все попытки уходят просмотреть записи в БД.... и при этом берется первый идентификатор и всё!... )))
Чтобы стало работать меню и все ссылки в магазине, необходимо эту функцию заменить следующим кодом:
function getShopItemid() {
if( empty( $_REQUEST['shopItemid'] )) {
if( !empty( $_REQUEST['Itemid'] )) {
$_REQUEST['shopItemid'] = intval( $_REQUEST['Itemid'] );
}
else {
$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 {
$_REQUEST['shopItemid'] = 1;
}
}
}
return intval($_REQUEST['shopItemid']);
}
После этого всё мною перечисленное начинает работать.... быть может и что-то ещё... ))
После просмотра этого кода такое чувство, что кто-то хочет, чтобы мы использовали модули, написанные разработчиками VirtueMart (я про меню), а не использовали стандартные возможности Joomla.
Всё это я исправлял на VirtueMart 1.1.3