PrestaShop Developer Conference
PrestaShop Developer Conference
Paris, France - November 6, 2024
Let's talk code, commerce and open source.

Hook actionValidateOrder

Informations

New orders
Hook actionValidateOrder
Locations
FO
Type action
Origin core
Aliases [newOrder]

Located in

Origin File
core classes/PaymentModule.php

Parameters details

    <?php
    array(
      'cart' => (object) Cart,
      'order' => (object) Order,
      'customer' => (object) Customer,
      'currency' => (object) Currency,
      'orderStatus' => (object) OrderState
    );

Call of the Hook in the origin file

Hook::exec('actionValidateOrder', [
                'cart' => $this->context->cart,
                'order' => $order,
                'customer' => $this->context->customer,
                'currency' => $this->context->currency,
                'orderStatus' => $order_status,
            ])

Example implementation

A classic use case for this hook could be:

I want to reward my customers on their n-th order

<?php
class MyModuleRewardCustomerWhenOrder extends Module 
{
    public function install()
    {
        return parent::install() && $this->registerHook('actionValidateOrder');
    }

    public function hookActionValidateOrder($params)
    {
        $orderObject = $params['order'];
        $customerObject = $params['customer'];
        $hasValidParams = Validate::isLoadedObject($orderObject) && Validate::isLoadedObject($customerObject);
        if ($hasValidParams && !$this->customerAlreadyRewarded((int) $customerObject->id)) {
            $hasConfiguredState = in_array((int) $orderObject->getCurrentState(), $this->getConfuredOrdersStatesIds());
            $hasCustomerRequiredNbrOfTheOrderToReward = $this->getCustomerValidOrdersNbr((int) $customerObject->id) == $this->getRequiredNbrOfTheOrderToReward();
            if ($hasConfiguredState && $hasCustomerRequiredNbrOfTheOrderToReward) {
                $customerReward = $this->createCustomerReward($customerObject, $orderObject);
                if (Validate::isLoadedObject($customerReward)) {
                    $this->setAlreadyRewarded($customerObject);
                    $this->notifyCustomer($customerObject, $customerReward);
            
                    // of course don't forget to log if something fails here :)
                }
            }
        }
    }

    protected function customerAlreadyRewarded(int $idCustomer): bool
    {
        // check if customer already rewarded
    }

    protected setAlreadyRewarded(): void
    {
        // set customer was rewarded
    }

    protected function getConfuredOrdersStatesIds(): array
    {
        // return array with configured states ids in your module
    }

    protected function getCustomerValidOrdersNbr(int $idCustomer): int
    {
        // return number of total order valid by customer
    }

    protected function getRequiredNbrOfTheOrderToReward(): int
    {
        // return configured number of orders required to reward the customer
    }

    protected function createCustomerReward(Customer $customer, Order $order): ?CartRule
    {
        // generate customer cart rule (according to the order amount for example)
    }

    protected function notifyCustomer(Customer $customer, CartRule $cartRule): bool
    {
        // notify the customer 
    }
}