質問

現在、次のようにして注文ステータスを取得できる方法を探しています order id, customer emailcustomer last name.

私はこれまでこのコードを書きました

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

両方でうまく機能しています お客様ゲスト. 。しかし、これは私には正しいアプローチではないようです。私は書かれたようなものを使うことになっています このブログ また このブログ. 。誰かが私を正しくさせることができたら?

役に立ちましたか?

解決

コレクションを使用したい場合は、次のような注文オブジェクトを取得できます。

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

しかし、それはあなたがしたのと同じことです。
私はあなたのアプローチがより速いことさえあります。
あなたの場合、あなたはこのような選択を実行します。

SELECT * FROM sales_flat_order WHERE increment_id = '100000005';

私が説明したアプローチでは、あなたはこのようなことを実行します:

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

以来、追加の条件は必要ありません increment_id ユニークでなければなりません。

他のヒント

マリウスが言ったように、この特定のケースのためにコレクションは必要ありません。いくつかの注文ステータスをリストする必要がある場合は、コレクションを使用します。コードをより一般的にするために(コレクションで使用できるように)、インターフェイスを少し変更します。

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

また、小さな改善かもしれません:私はあなたが欲しいと思います strncasecmp.

ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top