Hola @valeria9483 y @manueldeco,
Manuel tiene razón, este es un escenario común con la evolución de los hooks en PrestaShop y la estricta tipificación de PHP 8. El problema es que el hook ActionValidateOrderBefore no siempre garantiza que $params['cart'] sea una instancia de Cart en todas las circunstancias posibles (por ejemplo, en ciertos procesos de pago asíncronos o durante la revalidación de un pedido por parte del back office).
Para solucionarlo de forma robusta, si $params['cart'] no es una instancia de Cart, debemos intentar cargar el carrito desde el contexto global de PrestaShop. Si ni siquiera en el contexto hay un carrito válido, entonces sí, el módulo no tiene nada que procesar y puede retornar.
Aquí te dejo una modificación para el archivo paydisorfee/paydisorfee.php que debería resolver el problema:
function hookActionValidateOrderBefore($params)
{
if (!(int) Configuration::get('PAYDISORFEE_ENABLED')) {
return;
}
if (!isset($params['cart']) || !($params['cart'] instanceof Cart)) {
$params['cart'] = Context::getContext()->cart; // Intentamos obtener el carrito del contexto
if (!($params['cart'] instanceof Cart)) { // Si sigue sin ser un Cart, salimos
return;
}
Con este cambio, primero verifica si $params['cart'] existe y es una instancia de Cart. Si no lo es, intenta recuperar el carrito del contexto actual. Solo si esa segunda opción también falla (es decir, no hay ningún Cart válido disponible), entonces el hook retorna sin hacer nada. De esta forma, aseguras que tu lógica interna siempre reciba un objeto Cart para aplicar los descuentos o recargos.