Magentoで送り先住所が登録されない

(2011年10月22日 追記)
この問題は、1.6で解消されています。(1.5は確認していません)


これ、誰も困ってないんでしょうか?

Magentoの「レジに進む」で、お客様がアカウントを持っている場合は、新規入力した請求先住所や送り先住所をアドレス帳に登録することができます。
しかし、実際にやってみると、請求先住所は登録されますが、送り先住所は登録されません。
(Magentoのバージョンは、1.4.2 です)

この現象、かなり問題だと思うのですが、言及しているサイトがほとんどないんですね。
(Magentoを使える人は、これくらい簡単に修正できるから、いちいちブログに書かないんでしょうか・・・)

現象から考えて、プログラムの住所を登録する部分において、請求先住所登録の部分と送り先住所登録の部分で相違があるということまでは、容易に想像がつきます。
でも、Magentoの複雑な構造では、その「部分」を特定するのが結構大変なのです。

私もこの現象に遭遇したときは頑張ってプログラムを追いかけてみたのですが、すぐに断念して、ネット検索に切り替えました。
ところが、なかなかこの現象に言及しているものがヒットしません。
「私がカスタマイズ時に何かミスったのかな?」と不安になりながら探していたら、ようやく下記のサイトが見つかりました。

Magento 1.4.2.0 Onepage Checkout Save Shipping Address Not Working
http://dev.turboweb.co.nz/2011/05/05/magento-1-4-2-0-onepage-checkout-save-shipping-address-not-working/

当然英語の記事なので、日本でもきっと困っているかたがいらっしゃると信じて、日本語で解説させていただきます。

原因は、請求先住所を処理する function saveBilling にある住所を登録する部分が、送り先住所を処理する function saveShipping に抜けているという、ごく単純なものです。

修正するファイルは、「app/code/Core/Mage/Checkout/Model/Type/Onepage.php」です。
このファイルを app/code/local/Mage/Checkout/Model/Type ディレクトリにコピー(ディレクトリが無ければ作成)して、コピーしたファイルを修正します。

Onepage.php を見てみると、saveBilling と saveShipping という function があります。
ここで、saveBilling にあって saveShipping にない部分を探して、saveShipping に加えてやればよいのです。
それが、下記に示した ———- ここから ———- ここまで ———- の3行です。

public function saveShipping($data, $customerAddressId)
{
    ・・・
        if (!empty($customerAddressId)) {
           $customerAddress = Mage::getModel('customer/address')->load($customerAddressId);
            if ($customerAddress->getId()) {
                 if ($customerAddress->getCustomerId() != $this->getQuote()->getCustomerId()) {
                     return array('error' => 1,
                         'message' => $this->_helper->__('Customer Address is not valid.')
                     );
                 }
                 $address->importCustomerAddress($customerAddress);
            }
        } else {
            /* @var $addressForm Mage_Customer_Model_Form */
            $addressForm    = Mage::getModel('customer/form');
            $addressForm->setFormCode('customer_address_edit')
                ->setEntity($address)
                ->setEntityType('customer_address')
                ->setIsAjaxRequest(Mage::app()->getRequest()->isAjax());
            // emulate request object
            $addressData    = $addressForm->extractData($addressForm->prepareRequest($data));
            $addressErrors  = $addressForm->validateData($addressData);
            if ($addressErrors !== true) {
                return array('error' => 1, 'message' => $addressErrors);
            }
            $addressForm->compactData($addressData);
---------- ここから ----------
            if (!empty($data['save_in_address_book'])) {
                 $address->setSaveInAddressBook(1);
            }
---------- ここまで ----------
        }
        $address->implodeStreetAddress();
        $address->setCollectShippingRates(true);
    ・・・
}

Magento は、EC CUBEに比べれば格段にしっかりしているとはいえ、バグはありますねー。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です