3

顧客が初めて住所を入力すると、この住所が請求先および配送先住所として機能します。しかし、データベースには 1 つのエントリしかありません。そのため、顧客が後で既存の配送先住所を編集して配送先住所を変更することを決定した場合、請求先住所も変更されます。これを防ぐには、データベースに 2 つの別個のエントリが必要です。1 つは請求先住所用で、もう 1 つは配送先住所用です。したがって、

customer_address_save_afterイベントを使用して、デフォルトの請求先住所のエントリがデフォルトの配送先住所のエントリと同じかどうかをチェックするイベント オブザーバーを作成しました。その場合、この住所のコピーが保存され、新しい配送先住所として機能します。まあ、少なくともこれはアイデアでした。

public function customerAddressSaveAfter($observer)
{
    $session = Mage::getSingleton('customer/session');

    if ($session->getCustomer()->getDefaultBilling()  ==
        $session->getCustomer()->getDefaultShipping())
    {
        $address = $observer->getCustomerAddress();

        $address->unsAddressId()
                ->unsAddressType();           

        Mage::getModel('customer/address')
            ->setData($address->getData())
            ->setIsDefaultShipping('1')
            ->setSaveInAddressBook('1')
            ->save();
    }

    return $this;
}

しかし、コードを実行すると、メモリが使い果たされるまで無限ループになるようです。私は何を間違っていますか?

4

1 に答える 1

1

ここでの問題は、「顧客/住所」保存イベントで「顧客/住所」を保存しているため、無限再帰です。

複製にいくつかの属性を設定し、保存する前に確認します。

public function customerAddressSaveAfter($observer)
{
    $address = $observer->getCustomerAddress();
    if ($address->getIsDuplicate()) {
        return $this;
    }

    $session = Mage::getSingleton('customer/session'); 

    if ($session->getCustomer()->getDefaultBilling()  ==
        $session->getCustomer()->getDefaultShipping())
    {
        $address->unsAddressId()
                ->unsAddressType();           

        Mage::getModel('customer/address')
            ->setData($address->getData())
            ->setIsDefaultShipping('1')
            ->setSaveInAddressBook('1')
            ->setIsDuplicate(true)
            ->save();
    }

    return $this;
}
于 2013-02-08T21:40:10.043 に答える