2011-04-28 12 views
6

Me he encontrado con un problema interesante con una tienda Magento que se dedica principalmente a la venta de productos configurables. Tengo un código que empaqueta la información de la orden y la envía a un almacén externo que luego cumple con el pedido. Con esta solicitud, estoy usando el increment_id como identificador. Periódicamente, le preguntamos al almacén si el pedido se ha enviado y si informan que lo hizo, recuperamos el pedido en Magento a través del increment_id y completamos el pedido creando un nuevo envío en su contra.Recuperando pedido único en Magento por increment_id después de editar un pedido con productos configurables

Ahora, esto funciona bien hasta que se edita una orden. Debido al manejo de productos configurables por parte de Magento, la edición de un pedido implica cancelar el pedido actual y recrearlo de nuevo con el mismo increment_id. Posteriormente, mis interacciones basadas en el increment_id ahora se echó por tierra, ya que sólo el primero (cancelado) fin parece ser recuperada cuando hago algo así, como la increment_id ya no es único:

<?php 
$order = Mage::getModel('sales/order')->loadByIncrementId(100000001); 
?> 

lo general, tener una No es posible duplicar increment_id, por lo que esperaba que Magento diera preferencia al pedido "activo", pero este no es el caso.

Ahora, he encontrado una manera de evitar esto con una colección:

<?php 
$orders = Mage::getModel('sales/order') 
    ->getCollection() 
    ->addAttributeToFilter('state', array('neq' => Mage_Sales_Model_Order::STATE_CANCELED)) 
    ->addAttributeToFilter('increment_id', 100000001); 

foreach ($orders as $order) { 
    // Do what we need with the order 
} 
?> 

Sin embargo, estaría interesado en saber si hay una manera de conseguir sólo un registro de vuelta de la colección, negando la necesidad del foreach. Se puede hacer esto?

Respuesta

9

Uso getFirstItem()

$orders = Mage::getModel('sales/order') 
    ->getCollection() 
    ->addAttributeToFilter('state', array('neq' => Mage_Sales_Model_Order::STATE_CANCELED)) 
    ->addAttributeToFilter('increment_id', 100000001) 
    ->getFirstItem(); 
+0

Obviamente necesitaba RTFM un poco más de cerca. Esto es perfecto, gracias! – CVM

6
$order = Mage::getModel('sales/order')->loadByIncrementId($orderId); 
1

Mientras que la respuesta de Mukesh funcionará técnicamente, si usted tiene un gran conjunto de datos devuelto por una solicitud, será potencialmente el tiempo de espera al cargar la colección completa , que es lo que sucede en la primera línea de la función getFirstItem(). Esto se describe aquí: Top 3 Reasons to Avoid Magento's getFirstItem()

+0

filtrando por increment_id ¡con suerte nunca da una gran colección! Siempre debe haber solo una orden no cancelada por increment_id – Josef

Cuestiones relacionadas