ACTION
FO+BO
Desde 1.5
actionOrderStatusUpdate
~3 min de lectura
#Descripcion
Se ejecuta cuando el estado de un pedido cambia. Se dispara ANTES de que el nuevo estado sea efectivamente guardado en la base de datos. Es ideal para validar o interceptar cambios de estado, enviar notificaciones o sincronizar con ERPs externos. Se dispara tanto desde el back office como desde procesos automaticos.
Disparado por
-
OrderHistory::changeIdOrderState()— classes/order/OrderHistory.php
#Parametros
| Nombre | Tipo | Requerido | Descripcion |
|---|---|---|---|
| $newOrderStatus | OrderState | Si | Nuevo estado del pedido que se va a asignar |
| $id_order | int | Si | ID del pedido afectado |
| $order | Order | No | Objeto Order del pedido (disponible desde PS 1.7.7) |
Retorno
void
Este hook no espera valor de retorno
#Ejemplo de codigo
mymodule.php
php
<?php
public function install()
{
return parent::install()
&& $this->registerHook('actionOrderStatusUpdate');
}
mymodule.php
php
<?php
/**
* Hook actionOrderStatusUpdate — cambio de estado del pedido
*/
public function hookActionOrderStatusUpdate(array $params)
{
/** @var OrderState $newStatus */
$newStatus = $params['newOrderStatus'];
$idOrder = (int) $params['id_order'];
// En PS >= 1.7.7 podemos usar el objeto Order directamente
$order = isset($params['order']) ? $params['order'] : new Order($idOrder);
// Ejemplo: Notificar al almacen cuando el pedido pasa a 'Preparacion en curso'
if ((int) $newStatus->id === (int) Configuration::get('PS_OS_PREPARATION')) {
$customer = new Customer($order->id_customer);
$address = new Address($order->id_address_delivery);
$products = $order->getProducts();
$warehouseData = [
'order_ref' => $order->reference,
'customer' => $customer->firstname . ' ' . $customer->lastname,
'address' => $address->address1 . ', ' . $address->city,
'postcode' => $address->postcode,
'products' => array_map(function ($p) {
return [
'reference' => $p['reference'],
'name' => $p['product_name'],
'qty' => $p['product_quantity'],
];
}, $products),
];
// Enviar a sistema de almacen
Db::getInstance()->insert('mymodule_warehouse_queue', [
'id_order' => $idOrder,
'payload' => pSQL(json_encode($warehouseData)),
'status' => 'pending',
'date_add' => date('Y-m-d H:i:s'),
]);
}
// Ejemplo: Notificar por SMS cuando se envia
if ($newStatus->shipped) {
$carrier = new Carrier($order->id_carrier);
$tracking = $order->shipping_number;
// $this->sendSmsNotification($order, $tracking);
}
}
#Notas y gotchas
- ⚠️ Este hook se ejecuta ANTES de guardar el nuevo estado — el pedido aun tiene el estado anterior en BD.
- ⚠️ El parametro `order` solo esta disponible desde PrestaShop 1.7.7. Para versiones anteriores, usa `new Order($params['id_order'])`.
- ⚠️ Si necesitas actuar DESPUES de que el estado se haya guardado, usa `actionOrderStatusPostUpdate`.
- ⚠️ Se dispara en cada cambio de estado, incluyendo los automaticos (pago aceptado, envio, etc.).
- ⚠️ Evita cambiar el estado del pedido dentro de este hook — puede causar bucles infinitos.
#Relacionados
#Historial de versiones
| Version PS | Cambio |
|---|---|
| 1.5 | Introducido con newOrderStatus e id_order |
| 1.7.7 | Añadido el parametro order (objeto Order) |
| 8.0 | Sin cambios. Compatible |
Descargar en Markdown
Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.