5

私が構築している Magento Web サイトには、少しジレンマがあります。各サイトで複数の通貨のチェックアウトを有効にするために、それぞれストアを設定した 2 つの Web サイトがあります。したがって、1 つの共通の magento インストールを介して管理される (2 つの異なるドメイン上の) 2 つのサイトの唯一の違いは、通貨の表示とチェックアウトの通貨です。これまでのところ、これはすべて正常に機能しています。ただし、サイト間でチェックアウト セッションを共有しようとしているので、サイト間を切り替えてもショッピング カートは同じままです。各サイトが探しているセッションを認識できるように、正しいセッション ID を切り替え URL に追加することができました。ただし、実際にショッピング カートを表示する方法は、Web サイトに依存しないようには機能しないようです。

Mage_Checkout_Model_Session

_getQuoteIdKey() -> 現在の Web サイト ID を使用して、セッション内の見積もり ID を確認します。

そして、各ウェブサイトがまったく同じショッピングカートデータを共有するように、この機能を何をどのように上書きするのかわかりません!

私の $_SESSION['checkout'] 変数は各サイトで同じことを示していますが、この Web サイト ID が含まれていると、データはショッピング カートには使用できません: 'quote_id_4' => 文字列 '13' (長さ = 2)

これがまったく可能かどうかについてのアイデアはありますか?

4

1 に答える 1

11

これに対する答えを検索した後、2009 年以降、明確な解決策なしに尋ねられた同じ質問に出くわした後、最終的に自分でコードの奥深くを調べなければなりませんでした。ほら、実用的な解決策があります。Magento をセットアップしたい人のための詳細なガイドはこちら

  • 表示されるだけでなく、選択した通貨で実際に請求される複数の通貨
  • 店舗だけでなく、ウェブサイト全体でショッピング カートを共有する

この組み合わせの主な問題は、デフォルトの Magento 構造では、2 つを組み合わせることはできず、どちらか一方しか実行できないことです。

まず、Magento を複数の通貨用に設定しましょう。

  • 対応するストアとストア ビュー (ストア ビューだけでなく、完全な Web サイト) を使用して、通貨ごとに Web サイトを作成します。
  • システム - 構成 - Web サイトごとの通貨設定をそれぞれの通貨に設定します。基本通貨、デフォルト表示通貨、許可通貨の 3 つのエントリはすべて、1 つの同じ通貨に設定する必要があります。
  • デフォルトの全体構成スコープに戻り、システム - 構成 - カタログ - - - カタログの価格スコープを「ウェブサイト」に設定します</li>
  • システム - 通貨レートの管理で通貨レートを定義することもできます。
  • 各 Web サイト スコープに対して、適切なシステム - 構成 - Web - セキュアおよび非セキュアのベース URL を設定します。
  • .htaccess ファイルの先頭にこれを追加します (適切な Web サイト ドメインと、Web サイトのセットアップ時に入力したコードを置き換えます (ここでは、http://website-us.localを base_us に、http://website-uk.localを code に置き換えます)。 base_uk)

    SetEnvIf ホスト website-us.local MAGE_RUN_CODE=base_us SetEnvIf ホスト website-us.local MAGE_RUN_TYPE=website SetEnvIf ホスト ^website-us.local MAGE_RUN_CODE=base_us SetEnvIf ホスト ^website-us.local MAGE_RUN_TYPE=website

    SetEnvIf ホスト website-uk.local MAGE_RUN_CODE=base_uk SetEnvIf ホスト website-uk.local MAGE_RUN_TYPE=website SetEnvIf ホスト ^website-uk.local MAGE_RUN_CODE=base_uk SetEnvIf ホスト ^website-uk.local MAGE_RUN_TYPE=website

  • Mage/Core/Model/Store のメソッド convertPrice を上書きし、メソッド convertPrice を変更します。これにより、価格が常に正しい変換と正しい通貨記号で表示されるようになります。

    /**
     * Convert price from default currency to current currency
     *
     * @param   double $price
     * @param   boolean $format             Format price to currency format
     * @param   boolean $includeContainer   Enclose into <span class="price"><span>
     * @return  double
     */
    public function convertPrice($price, $format = false, $includeContainer = true)
    {
        $categories = Mage::getModel('catalog/category')->getCollection();
        $categ_ids=$categories->getAllIds();
        $baseCurrencyCode = Mage::app()->getBaseCurrencyCode();
        $allowedCurrencies = Mage::getModel('directory/currency')->getConfigAllowCurrencies();
        $currencyRates = Mage::getModel('directory/currency')->getCurrencyRates($baseCurrencyCode,array_values($allowedCurrencies));
    
        if ($this->getCurrentCurrency() && $this->getBaseCurrency()) {
            $value = $this->getBaseCurrency()->convert($price, $this->getCurrentCurrency());
        } else {
            $value = $price;
        }
    
    
        if($this->getCurrentCurrencyCode() != $baseCurrencyCode)
        {
            $value = $price * $currencyRates[$this->getCurrentCurrencyCode()];
        }
        if ($this->getCurrentCurrency() && $format) {
            $value = $this->formatPrice($value, $includeContainer);
        }
        return $value;
    }
    

    }

もちろん、セットアップしたばかりの Web サイト全体で、ユーザーのデータ、カート、およびログインも共有したいと考えています。

  • デフォルトの構成スコープ セット システム - 構成 - 顧客構成 - アカウント共有オプション - 顧客アカウントをグローバルに共有

  • magento/app/code/core/Mage/Checkout/Model/Session.php を上書きし、このメソッドを置き換えます。

    protected function _getQuoteIdKey() { return 'quote_id'; // 'quote_id_' を返します。$ウェブサイト[1]; }

  • magento/app/code/core/Mage/Sales/Model/Quote.php を上書きし、メソッド getSharedStoreIds を次のように変更します。

    public function getSharedStoreIds() { $ids = $this->_getData('shared_store_ids'); if (is_null($ids) || !is_array($ids)) { $arrStoreIds = array(); foreach(Mage::getModel('core/website')->getCollection() as $website) { $arrStoreIds = array_merge($arrStoreIds,$website->getStoreIds()); $arrStoreIds を返します。/*if ($website = $this->getWebsite()) { return $website->getStoreIds(); } var_dump($this->getStore()->getWebsite()->getStoreIds());exit(); $this->getStore()->getWebsite()->getStoreIds(); を返します。*/ } $ID を返します。}

  • magento/app/code/core/Mage/Customers/Model/Customer.php を上書きし、メソッド getSharedWebsiteIds() を次のように再度変更します。

    public function getSharedWebsiteIds() { $ids = $this->_getData('shared_website_ids'); if ($ids === null) { $ids = array(); if ((bool)$this->getSharingConfig()->isWebsiteScope()) { $ids[] = $this->getWebsiteId(); } else { foreach (Mage::app()->getWebsites() as $website) { $ids[] = $website->getId(); $this->setData('shared_website_ids', $ids); $ID を返します。}

  • ウィッシュリスト オプションを使用する場合は、magento/app/code/core/Mage/Wishlist/Model/Wishlist.php のメソッドに対して同じことを行い、getSharedWebsiteIds を変更して、現在の Web サイトだけでなくすべてのストア ID をロードするようにします。そのうちの

  • ここで、フロントエンド ストアに通貨 (Web サイト) スイッチを実装し、その間に正しいセッション ID を渡して、magento が検索対象のストアを認識できるようにする必要もあります。ここで通貨の切り替えを模倣し、次のドロップダウンを追加しました

magento/app/design/frontend/default/yourtheme/template/directory/currency.phtml

これにより、すべての Web サイトが読み込まれ、現在のセッション ID がクエリ文字列として適用されるため、magento は任意のドメインで使用するセッションを認識します。

<?php
/**
 * Currency switcher
 *
 * @see Mage_Directory_Block_Currency
 */
?>
<div class="top-currency">
<?php
$websites = Mage::getModel('core/website')->getCollection();
$this_session_id = Mage::getSingleton('core/session', array('name' => 'frontend'))->getSessionId();
?>
<select id="website-changer" onChange="document.location=this.options[selectedIndex].value">
<?php
foreach($websites as $website):
    $default_store = $website->getDefaultStore();
    $website_currency = $default_store->getBaseCurrency()->getCurrencyCode();
    $url_obj = new Mage_Core_Model_Url();
    $default_store_path = $url_obj->getBaseUrl(array('_store'=> $default_store->getCode()));
    $default_store_path .= Mage::getSingleton('core/url')->escape(ltrim(Mage::app()->getRequest()->getRequestString(), '/'));
    $default_store_path = explode('?', $default_store_path);
    $default_store_path = $default_store_path[0] . '?SID=' . $this_session_id;

?>
    <option <? if(strstr($default_store_path,Mage::getBaseUrl())):?>selected="selected"<?endif; ?> value="<?=$default_store_path ?>">
    <?=$website_currency?>
    </option>
<?endforeach;?>
</select>
</div>

このクエリ文字列は、最初に切り替えたときにのみ適用されますが、magento はその後、Cookie に保存されたセッション ID を記憶します。

  • これが正しく機能するためには、上書きしてください

マジェント/アプリ/コード/コア/メイジ/コア/モデル/セッション/アブストラクト/Varien.php

これを交換

// potential custom logic for session id (ex. switching between hosts)
$this->setSessionId();

// potential custom logic for session id (ex. switching between hosts)
/* Amend to ensure shopping carts are shared between websites */
if (isset($_COOKIE['lastsid']))
{
  session_decode(file_get_contents(Mage::getBaseDir('session').'/sess_'.$_COOKIE['lastsid']));
            setcookie ('lastsid', '', time() - 3600);
        }

        if (isset($_GET['SID']))
        {
            $this->setSessionId($_GET['SID']);
            session_decode(file_get_contents(Mage::getBaseDir('session') . '/sess_' . $_GET['SID']));
            setcookie('lastsid', $_GET['SID']);
            $_COOKIE['lastsid'] = $_GET['SID'];
        }
        else
        {
            $this->setSessionId();
        }
        /* Amend end */

これで、複数の通貨が表示され、複数の Web サイトで複数の通貨で課金され、この上にログインとショッピング カートが共有されます。このソリューションは、インターウェブで見つけた知識と、自分で考え出したいくつかの断片を組み合わせたものです。アドバイスをくれた人に感謝します!

于 2012-09-12T14:33:45.720 に答える