Pregunta

Actualmente estoy buscando un método del que pueda obtener el estado del pedido basado en el order id, customer email y customer last name.

Había escrito este código hasta ahora

public function orderHistoryAction(){
    $req = $this->getRequest();
    $oid = $req->getParam('oid', '');
    $lnm = $req->getParam('lnm', '');
    $eml = $req->getParam('eml', '');

    $order = Mage::getModel('sales/order')->loadByIncrementId($oid);
    if ($order->getId()) {
        if ((strcasecmp($lnm, $order->getCustomerLastname()) == 0) && (strcasecmp($eml, $order->getCustomerEmail()) == 0)) {
            echo $order->getStatusLabel();
        } else {
            echo 'invalid';
        }
    } else {
        echo 'invalid';
    }
}

y está funcionando bien para ambos cliente y invitado. Pero esto no me parece el enfoque correcto. Se suponía que usaba algo como escrito en este blog o este blog. Si alguien pudiera hacerme corregir?

¿Fue útil?

Solución

Si desea usar colecciones, puede obtener su objeto de pedido como este:

$collection = Mage::getModel('sales/order')->getCollection()
    ->addAttributeToFilter('increment_id', $oid)
    ->addAttributeToFilter('customer_lastname', $lnm)
    ->addAttributeToFilter('customer_email', $eml);
$order = $collection->getFirstItem();
if ($order->getId()) { 
    echo $order->getStatusLabel();
}
else {
    echo 'invalid';
}

Pero es lo mismo que hiciste.
Incluso lo que tu enfoque es más rápido.
En su caso, ejecuta una selección como esta.

SELECT * FROM sales_flat_order WHERE increment_id = '100000005';

En el enfoque, describí que ejecuta algo como esto:

SELECT * FROM sales_flat_order WHERE increment_id = '100000005' AND customer_lastname='DOE' AND customer_email = 'john.doe@example.com';

No hay necesidad de las condiciones adicionales desde el increment_id debe ser único.

Otros consejos

Como dijo Marius, no necesita una colección para este caso específico. Si tiene que enumerar varios estatus de pedido, usará una colección. Para que su código sea más genérico (para que pueda usarlo con colecciones), cambiaría un poco la interfaz:

public function getOneOrderHistoryAction() {
    // extract the parameters from $this->request and pass on
    ...
    return $this->getOrderHistory($oid, $nlm, $eml);
}

public function getOrderHistory($oid, $nlm, $eml) {
    // use the arguments provided
    ...
}    

Además, tal vez una pequeña mejora: creo que quieres strncasecmp.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top