2011-09-21 10 views
8

Necesito comprobar si un pedido ya tiene algún envío configurado. La única información que puedo usar es el ID de incremento de la orden. Recibo una instancia de un pedido modelo, pero no veo la forma de obtener una instancia de envío.¿Cómo comprobar si una orden tiene un envío en Magento?

Estoy usando este código:

$order = Mage::getModel('sales/order') 
    ->loadByIncrementId($order_increment_id); 

Pero, ¿cómo puedo obtener una instancia de envío? Sé que puedo llamar al Mage::getModel('sales/order_shipment')->loadByIncrementId($shipment_increment_id), pero ¿cómo obtengo el ID de incremento de envío?

Respuesta

26

Suponga que la persona que escribió esto también podría haber tenido que hacer lo que necesita hacer. En general, cuando los objetos de Magento tienen una relación de uno a muchos, puedes encontrar un método para cargar los muchos en el uno.

Tienes un alias de clase sales/order.

Esto corresponde a Mage_Sales_Model_Order (en una instalación estándar).

Puede encontrar esta clase en app/code/core/Mage/Sales/Model/Order.php.

Si examina esta clase, hay 7 métodos con la palabra "barco" en ellos

function canShip 
function setShippingAddress 
function getShippingAddress 
function getShip 
function getShipmentsCollection 
function hasShip 
function prepareShip 

De los 7, sólo la semántica de getShipmentsCollection indican un método para agarrar los envíos de un pedido. Así que trate de

foreach($order->getShipmentsCollection() as $shipment) 
{ 
    var_dump(get_class($shipment)); 
    //var_dump($shipment->getData()); 
} 

O echar un vistazo a la fuente de getShipmentsCollection

public function getShipmentsCollection() 
{ 
    if (empty($this->_shipments)) { 
     if ($this->getId()) { 
      $this->_shipments = Mage::getResourceModel('sales/order_shipment_collection') 
       ->setOrderFilter($this) 
       ->load(); 
     } else { 
      return false; 
     } 
    } 
    return $this->_shipments; 
} 
+2

¡Muchas gracias, Alan! Después de echar un vistazo a getShipmentsCollection() y Magento Collections, descubrí que usar getShipmentsCollection() -> count() es justo lo que necesito. –

+5

Su explicación es muy clara como siempre (me pregunto por qué no trabaja en Core Team :) ... Sin embargo ... no sería más fácil verificar el estado de la orden = 'completar'? ... Entonces: $ collection = Mage :: getResourceModel ('sales/order_collection') -> addAttributeToFilter ('increment_id', $ id) -> addAttributeToFilter ('estado', 'completo') – WonderLand

8

Sólo para que quede completa Mage_Sales_Model_Order ha método público:
hasShipments()
que devuelve el número de envíos e internamente usos mencionados getShipmentsCollection().

Cuestiones relacionadas