Question

Je suis actuellement à la recherche d'une méthode à partir de laquelle je peux obtenir le statut de commande en fonction de la order id, customer email et customer last name.

j'avais écrit ce code jusqu'à présent

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

et fonctionne bien pour les clients et qu'invité . Mais cela ne me semble pas la bonne approche. Je devais quelque chose utilisé comme écrit dans ce blog ou ce blog . Si quelqu'un pouvait me faire corriger?

Était-ce utile?

La solution

Si vous voulez utiliser les collections que vous pouvez obtenir votre objet de commande comme ceci:

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

Mais il est un peu la même chose que vous avez fait.
J'ai même chose que votre approche est plus rapide.
Dans votre cas, vous exécutez une sélection comme celui-ci.

SELECT * FROM sales_flat_order WHERE increment_id = '100000005';

Dans l'approche que je décrit vous exécutez quelque chose comme ceci:

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

Il n'y a pas besoin de conditions supplémentaires puisque le increment_id doit être unique.

Autres conseils

Comme Marius dit, vous n'avez pas besoin d'une collection pour ce cas spécifique. Si vous avez plusieurs à la liste état de votre commande, vous utiliserez alors une collection. Pour rendre votre code plus générique (de sorte que vous pouvez l'utiliser avec des collections), je changerais l'interface un peu:

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

En outre, une petite amélioration peut-être. Je pense que vous voulez strncasecmp

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top