Při použití modulu Shiptopay (propojení jednotlivých způsobů dopravy se způsobem úhrady), který naleznete ke stažení zde, jsem se setkal s problémem, kdy se při výběru způsobu platby po stisku tlačítka zpět, nezobrazil žádný z platebních modulů. V podstatě se obchod tvářil, že žádný platební modul není instalován.
Problém je způsoben neexistující proměnnou $carrier, která se načítá jen v případě, že je poslána metodou post, při kroku zpět tato proměnná již není posílána. Řešením je tedy tuto proměnnou načíst ze třídy cart.
Soubor pro úpravu: /classes/modules.php
Původní kód:
public static function hookExecPaymentFront($carrier) { global $cart, $cookie; $sql='SELECT * FROM `'._DB_PREFIX_.'shiptopay`'; $result = Db::getInstance()->ExecuteS($sql); if(count($result)==0){ Module::hookExecPayment(); }else{ $hookArgs = array('cookie' => $cookie, 'cart' => $cart); $billing = new Address(intval($cart->id_address_invoice)); $output = ''; $sql=' SELECT distinct(stp.id_carrier),h.`id_hook`, m.`name`, hm.`position` FROM `'._DB_PREFIX_.'module_country` mc LEFT JOIN `'._DB_PREFIX_.'module` m ON m.`id_module` = mc.`id_module` LEFT JOIN `'._DB_PREFIX_.'hook_module` hm ON hm.`id_module` = m.`id_module` LEFT JOIN `'._DB_PREFIX_.'hook` h ON hm.`id_hook` = h.`id_hook` LEFT JOIN `'._DB_PREFIX_.'shiptopay` stp ON hm.`id_module` = stp.`id_payment` WHERE h.`name` = 'payment' AND stp.id_carrier='.intval($carrier).' AND mc.id_country = '.intval($billing->id_country).' AND m.`active` = 1 ORDER BY hm.`position`, m.`name` DESC'; $result = Db::getInstance()->ExecuteS($sql); if ($result) foreach ($result AS $k => $module) if (($moduleInstance = Module::getInstanceByName($module['name'])) AND is_callable(array($moduleInstance, 'hookpayment'))) if (!$moduleInstance->currencies OR ($moduleInstance->currencies AND sizeof(Currency::checkPaymentCurrencies($moduleInstance->id)))) $output .= call_user_func(array($moduleInstance, 'hookpayment'), $hookArgs); return $output; } }
Na začátek funkce přidejte tento kód, který v případě, kdy je proměnná $carrier prázdná, je načtena ze třídy cart.
if ($carrier == ''){ $carrier = $cart->id_carrier; }
Zmínku o tomto problému jsem zatím nikde nenašel, pokud budete vědět o dalším problému, dejte mi vědět v komentářích.