Session Magento多个网站共享购物车

Session Magento多个网站共享购物车,session,magento,shopping-cart,Session,Magento,Shopping Cart,我有点进退两难的Magento网站,我正在建设。我有两个网站,每个网站都有一个商店,以便为每个网站启用多种货币结账。因此,通过一个通用magento安装管理的两个站点(在两个不同的域上)之间的唯一区别是货币显示和结帐货币。到目前为止,一切正常。 但是,我尝试在站点之间共享结帐会话,以便在站点之间切换时购物车保持不变。我设法将正确的会话id添加到切换url中,这样每个站点都知道我们要查找的会话。然而,实际显示购物车的方法似乎并不独立于网站工作——例如 Mage_Checkout_Model_会话

我有点进退两难的Magento网站,我正在建设。我有两个网站,每个网站都有一个商店,以便为每个网站启用多种货币结账。因此,通过一个通用magento安装管理的两个站点(在两个不同的域上)之间的唯一区别是货币显示和结帐货币。到目前为止,一切正常。 但是,我尝试在站点之间共享结帐会话,以便在站点之间切换时购物车保持不变。我设法将正确的会话id添加到切换url中,这样每个站点都知道我们要查找的会话。然而,实际显示购物车的方法似乎并不独立于网站工作——例如

Mage_Checkout_Model_会话

_getQuoteIdKey()->使用当前网站id检查会话中的报价id

我不知道该如何覆盖该功能,以便每个网站共享完全相同的购物车数据

my$\u SESSION['checkout']变量在每个站点上显示相同的内容,但包含此网站id后,数据对购物车没有任何用处: 'quote_id_4'=>字符串'13'(长度=2)


你知道这是否可行吗?

在我寻找答案并偶然发现2009年以来提出的同一个问题没有明确的解决方案后,我最终不得不亲自研究代码的深层次——瞧,我有了一个可行的解决方案。这里有一个详细的指南,供任何想使用

  • 多个货币,这些货币不仅显示,而且实际以所选货币记账
  • 在整个网站上共享购物车,而不仅仅是商店
这种组合的主要问题是,使用默认的Magento结构,您只能执行其中一种操作,而不能同时执行两种操作

因此,让我们先为多种货币设置Magento

  • 为每种货币创建一个具有相应商店和商店视图的网站(不仅仅是商店视图,还有完整的网站)
  • 将每个网站的系统-配置-货币设置设置为相应的货币。所有三个条目“基本货币”、“默认显示货币”和“允许货币”都应设置为同一种货币
  • 返回默认的总体配置范围,并将系统-配置-目录-目录价格范围设置为“网站”
  • 您还可以在系统-管理货币汇率中定义货币汇率
  • 为每个网站范围设置适当的系统配置Web安全和不安全的基本url
  • 在.htaccess文件中,将其添加到顶部(替换您在设置网站时输入的相应网站域和代码(此处为base_us和code base_uk)

    SetEnvIf主机网站-us.local MAGE_RUN_CODE=base_us SetEnvIf主机网站-us.local MAGE_RUN_TYPE=网站 SetEnvIf主机^WEBITE-us.local MAGE\U RUN\U CODE=base\U us SetEnvIf主机^WEBITE-us.local MAGE_RUN_TYPE=网站

    SetEnvIf主机网站-uk.local MAGE_RUN_CODE=base_uk SetEnvIf主机网站-uk.local MAGE_RUN_TYPE=网站 SetEnvIf主机^website-uk.local MAGE\u RUN\u CODE=base\u uk SetEnvIf主机^WEBITE-uk.local MAGE_RUN_TYPE=网站

  • 覆盖Mage/Core/Model/Store中的方法convertPrice并更改方法convertPrice-这将确保价格始终以正确的转换和正确的货币符号显示


    现在应该可以显示多种货币,在多个网站上以多种货币收费,并在共享登录和购物车上进行。此解决方案是我在互联网上找到的知识集合,结合了我自己发现的一些零碎信息,因此感谢提供建议的人!

    非常有用的解决方案,其他e是我想问的一件小事,这里的会话ID是共享的,但在我的设置中,当我首先从非默认商店向购物车添加某个东西时,它会创建自己的会话,当我转到默认商店时,它会创建自己的会话,就像我首先将产品从默认商店添加到购物车,然后移动到购物车中的辅助商店项目一样共享同一个会话。很有用,但您知道是否可以保持购物车会话为全局会话,同时将订单分配给特定网站?我需要每个网站的客户和订单隔离,但使用共享购物车。使用哪种magento版本?
    /**
     * 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;
    }
    
    <?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>
    
    // 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 */