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に比べれば格段にしっかりしているとはいえ、バグはありますねー。

この記事を書いた人

川井 昌彦
川井 昌彦
FAシステムメーカー、国内最大手印刷会社製版部、印刷・ウェブ制作会社を経て、家庭の事情で実家に帰省して独立
現在はフリーランスと制作会社シニアディレクターのマルチワーク
ウェブ制作のほぼ全般を見渡せるディレクター業務が主だが、デザイン・コーディングも好き

1997年ブログ開設
WordPressコミュニティには2011年から参加
WordCamp Kansai 2016 セッションスピーカー
WordCamp Tokyo 2023 パネルディスカッションパネラー
WordBench京都、WordBench神戸、WordPress Meetup八王子など登壇多数

コメントを残す

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

Vektor Passport(ライセンス期間1年)
VK Filter Search Pro
Vektor WordPress Solutions
PAGE TOP