obtenir le statut de l'ordre de numéro de commande, e-mail et le nom de famille du client
-
16-10-2019 - |
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?
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