es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Validar una orden antes de que sea colocada en el módulo de Prestashop.

Estoy desarrollando un módulo Prestashop para lograr esto.

Cuando se realiza un pedido con un producto específico, necesito contactar una API externa para realizar algunas operaciones de escritura. Para ser más específico, algunos productos serán solicitados automáticamente en una plataforma de terceros. No es dropshipping, estoy enviando el pedido al productor de los bienes.

El problema es que, si la llamada a la API va mal, debo detener el pedido para que no se realice y notificar al cliente que algo ha salido mal, manteniendo el carrito intacto si es posible.

Todo lo demás está funcionando: puedo detectar los productos, enviar la información a la API de terceros y leer la respuesta. Excepto que estoy utilizando un módulo con este código:

$this->registerHook(‘actionValidateOrder’);

Mi entendimiento es que este gancho se llama después de que se realiza un pedido, por lo que no puedo bloquearlo si la llamada a la API falla.

¿Cuál es la manera correcta de abordar este escenario?

Intenté usar actionOrderStatusPostUpdate pero no creo que pueda tener conocimiento previo sobre el estado del pedido (los métodos de pago pueden variar).

¿Alguna idea? Parece una tarea básica de realizar pero estoy atascado.

Usando Prestashop 1.7.8

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para resolver este problema, puede utilizar el gancho actionCartSave, que se llama cada vez que se guarda el carrito (por ejemplo, cuando un cliente agrega o elimina un producto del carrito). Dentro de este gancho, puede verificar si el producto específico está en el carrito y, si está, hacer la llamada a la API a la plataforma externa. Si la llamada a la API falla, puede devolver un mensaje de error al cliente y detener el pedido al arrojar una excepción. Esto deshará cualquier cambio hecho en el carrito durante la ejecución del gancho, manteniéndolo intacto.

    Aquí hay un ejemplo de código para ilustrar este enfoque:

    public function hookActionCartSave($params)
    {
        $cart = $params['cart'];
    
        // Verifique si el producto específico está en el carrito
        $specificProductFound = false;
        foreach ($cart->getProducts() as $product) {
            if ($product['id_product'] === YOUR_PRODUCT_ID) {
                $specificProductFound = true;
                break;
            }
        }
    
        if ($specificProductFound) {
            // Hacer la llamada a la API
            $success = yourApiCall();
    
            if (!$success) {
                // Notificar al cliente y detener el pedido
                throw new PrestaShopException('Algo salió mal con la API de la plataforma externa. Por favor, inténtelo de nuevo más tarde.');
            }
        }
    }
    

    Nota: Reemplace YOUR_PRODUCT_ID con el ID del producto específico que le interesa. Además, asegúrese de manejar cualquier excepción arrojada por el código de llamada a API.

Comments are closed.