Domanda

Attualmente sto cercando un metodo da cui posso ottenere lo stato dell'ordine in base alla order id, customer email e customer last name.

che avevo scritto questo codice finora

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';
    }
}

e sta lavorando bene sia per clienti e guest . Ma questo non mi sembra il giusto approccio. Dovrei qualcosa di usato, come scritto nel questo blog o questo blog . Se qualcuno potrebbe farmi correggere?

È stato utile?

Soluzione

Se si desidera utilizzare le collezioni si può ottenere il vostro oggetto ordine in questo modo:

$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';
}

Ma è una specie della stessa cosa che hai fatto.
Ho anche cosa il vostro approccio è più veloce.
Nel tuo caso si esegue una select come questo.

SELECT * FROM sales_flat_order WHERE increment_id = '100000005';

l'approccio che ho descritto si esegue qualcosa di simile:

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

Non è necessario per le condizioni supplementari, dato che il increment_id deve essere univoco.

Altri suggerimenti

Come Marius ha detto, non è necessario una collezione per questo caso specifico. Se si dispone di elencare diversi lo stato degli ordini, quindi si può usare una collezione. Per rendere il codice più generico (in modo che si può utilizzare con le collezioni), vorrei cambiare l'interfaccia un po ':

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
    ...
}    

Inoltre, un piccolo miglioramento forse:. Penso che si desidera strncasecmp

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top