Hola @samueldeco, @lorena24 y @enriqueonline70,
Gracias por la descripción detallada. El problema que reporta @samueldeco es un clásico con algunos módulos de pago en PrestaShop 1.7.7.5, especialmente aquellos que no manejan explícitamente el objeto Cart o que tienen flujos de pago complejos.
Efectivamente, la condición if (!isset($params['cart']) || !($params['cart'] instanceof Cart)) está ahí por una razón fundamental: el hook hookActionValidateOrderBefore necesita un objeto Cart válido para operar correctamente. Si no lo recibe, el módulo asume que no hay un contexto de pedido válido y se aborta.
La razón por la que esto ocurre es que tu módulo de pago personalizado, al llamar a PaymentModule::validateOrder(), no está pasando el objeto Cart correctamente en el array $params o este se está perdiendo/corrompiendo antes de que se ejecute el hook. Para solucionarlo dentro del contexto del hook de paydisorfee, podemos añadir una lógica de respaldo para asegurarnos de que el carrito siempre esté disponible, obteniéndolo del Context global si no se pasa correctamente.
Aquí tienes una modificación que puedes aplicar en tu archivo paydisorfee/paydisorfee.php:
function hookActionValidateOrderBefore($params)
{
if (!(int) Configuration::get('PAYDISORFEE_ENABLED')) {
return;
}
// Aseguramos que $params['cart'] esté siempre disponible y sea una instancia de Cart.
// Si no está o no es válido, intentamos obtenerlo del contexto global de PrestaShop.
if (!isset($params['cart']) || !($params['cart'] instanceof Cart)) {
if (isset(Context::getContext()->cart) && Context::getContext()->cart instanceof Cart) {
$params['cart'] = Context::getContext()->cart;
Con este cambio, si por alguna razón el objeto Cart no llega en $params, el hook intentará recuperarlo del Context global, lo cual es una práctica segura en PrestaShop 1.7 para asegurar que la lógica del carrito pueda continuar. Pruébalo y cuéntanos si se soluciona.