2010-08-30 17 views

Respuesta

3

Después de la depuración incontable y buscando en Google, lo tengo resuelto:

Para incrementales de su pedido basado en el orden,

$order_id=Mage::getSingleton('checkout/session')->getLastRealOrderId(); 
$sales_order=Mage::getModel('sales/order')->load($order_id); 
$billing_address_id=$sales_order->billing_address_id; 
$shipping_address_id=$sales_order->shipping_address_id; 

Para la dirección de la entidad Identificación de la orden basada en cliente,

$quote = Mage::getSingleton('checkout/session')->getQuote(); 
$billing_address_id=$quote->getBillingAddress()->customer_address_id; 
$shipping_address_id=$quote->getShippingAddress()->customer_address_id; 
7

En primer lugar, romper su llamada encadenado para hacer asegurarse de que está hecho de cargar un pedido con

$order = Mage::getModel('sales/order')->load($array_data["order_id"]); 
var_dump($order->getData()); 

Suponiendo que haya cargado la orden, mira a los valores objeto de dumping anteriormente. No hay shipping_address_id. Eso, combinado con la ausencia de un método getShippingAddressId en un Mage_Sales_Model_Order, es la razón por la que su código no funciona.

Trate

$order = Mage::getModel('sales/order')->load($array_data["order_id"]); 
$id = $order->getShippingAddress()->getId(); 

El método de dirección getShippingAddress devolverá un objeto de dirección, que se puede inspeccionar por su ID. Si nos fijamos en la definición de clase Mage_Sales_Model_Order, se puede ver el método definiciones

//magento 1.4 
public function getShippingAddress() 
{ 
    foreach ($this->getAddressesCollection() as $address) { 
     if ($address->getAddressType()=='shipping' && !$address->isDeleted()) { 
      return $address; 
     } 
    } 
    return false; 
} 

public function getAddressesCollection() 
{ 
    if (is_null($this->_addresses)) { 
     $this->_addresses = Mage::getResourceModel('sales/order_address_collection') 
      ->addAttributeToSelect('*') 
      ->setOrderFilter($this->getId()); 

     if ($this->getId()) { 
      foreach ($this->_addresses as $address) { 
       $address->setOrder($this); 
      } 
     } 
    } 

    return $this->_addresses; 
} 

El TL; DR para el código anterior, es decir, los identificadores de dirección no se almacenan con el modelo de órdenes. Las direcciones para todas las órdenes se almacenan como un objeto sales/order_address o Mage_Sales_Model_Order_Address.

+0

gran tutorial Alan. Un par de errores menores en "valores * s * arriba" y "The * tl; dr *" para el código de arriba " Cheers, JD –

+0

No se puede esperar que escriba el inglés correcto antes del mediodía. (gracias) –

+0

ciertamente no antes de la cafeína :) Y por cierto, no me di cuenta de que "tl; dr" era una abreviación deliberada, ¡gracias a urbandictionary por esa! :) –

15

Lo siguiente puede ayudar a alguien que busca una solución similar:

// Get the id of the last order for the current user(session) 
$orderId = Mage::getSingleton('checkout/session')->getLastOrderId();   

// If an order actually exists 
if ($orderId) { 

    //Get the order details based on the order id ($orderId) 
    $order = Mage::getModel('sales/order')->load($orderId); 

    // Get the id of the orders shipping address 
    $shippingId = $order->getShippingAddress()->getId(); 

    // Get shipping address data using the id 
    $address = Mage::getModel('sales/order_address')->load($shippingId); 

    // Display the shipping address data array on screen 
    var_dump($address); 

} 

Nota: Es evidente que esta solución requiere que el usuario tenga una sesión actual

Buena suerte.

+0

Gracias - eso funcionó para mí. –

+0

Como también se muestra a continuación, uno puede usar '$ address-> getData()' y procesar a través de un 'foreach ($ address-> getData() as $ key => $ value)'. Esta respuesta fue la solución más fácil para mí. –

3

probar esto, se puede obtener el shipping_address_id y billing_address_id

$orderCollection = Mage::getResourceModel('sales/order_collection') 
->addAttributeToSelect('*') 
->addAttributeToFilter('main_table.customer_id',$session->getId()); 
echo "<pre>"; 
foreach ($orderCollection as $order){ 
$shippingAddress = Mage::getModel('sales/order_address')->load($order->getShippingAddressId()); 
$billingAddress = Mage::getModel('sales/order_address')->load($order->getBillingAddressId()); 
print_r($order->getData()); 
print_r($shippingAddress->getData()); 
print_r($billingAddress->getData()); 
} 
3
$order = Mage::getModel('sales/order')->load($orderId); 

//Get shipping address Id 
$order->getShippingAddress()->getId(); 

//format output 
echo $order->getShippingAddress()->format('html'); 

//Get shipping address data 
print_r($order->getShippingAddress()->getData()); 
Cuestiones relacionadas