Prestashop – oprava modul Shiptopay

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.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *