5

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

Mage_Checkout_Model_Session

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

而且我无法弄清楚什么/如何覆盖此功能,以便每个网站共享完全相同的购物车数据!

我的 $_SESSION['checkout'] 变量在每个网站上都显示相同,但​​包含此网站 ID 的数据对购物车没有用:'quote_id_4' => string '13' (length=2)

任何想法这是否可能?

4

1 回答 1

11

在我搜索了这个问题的答案并偶然发现了自 2009 年以来提出的同一个问题而没有明确的解决方案后,我终于不得不自己研究代码的深层 - 瞧,我有一个可行的解决方案。这里是任何想要设置 Magento 的人的详细指南

  • 不仅会显示,而且会以所选货币实际收费的多种货币
  • 在整个网站上共享购物车,而不仅仅是商店

这种组合的主要问题是,使用默认的 Magento 结构,您只能做一个或另一个,而不是两者结合。

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

  • 为每种货币创建一个具有相应商店和商店视图的网站(不仅仅是商店视图,完整的网站)
  • 将每个网站的系统 - 配置 - 货币设置设置为相应的货币。所有三个条目基本货币、默认显示货币和允许的货币都应设置为一种相同的货币。
  • 回到默认的整体配置范围,将 System - Configuration - Catalog - - Price the Catalog Price Scope 设置为“网站”</li>
  • 您还可以在 System - Manage Currency Rates 中定义您的货币汇率
  • 为每个网站范围设置适当的系统 - 配置 - 网络 - 安全和不安全的基本 URL。
  • 在您的 .htaccess 文件中将其添加到顶部(替换您在设置网站时输入的相应网站域和代码(此处http://website-us.local使用 base_us 和http://website-uk.local使用代码base_uk)

    SetEnvIf Host website-us.local MAGE_RUN_CODE=base_us SetEnvIf Host website-us.local MAGE_RUN_TYPE=website SetEnvIf Host ^website-us.local MAGE_RUN_CODE=base_us SetEnvIf Host ^website-us.local MAGE_RUN_TYPE=website

    SetEnvIf Host website-uk.local MAGE_RUN_CODE=base_uk SetEnvIf Host website-uk.local MAGE_RUN_TYPE=website SetEnvIf Host ^website-uk.local MAGE_RUN_CODE=base_uk SetEnvIf Host ^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;
    }
    

    }

但当然,我们也希望在我们刚刚建立的网站中共享用户数据、购物车和登录信息。

  • 在默认配置范围设置系统 - 配置 - 客户配置 - 帐户共享选项 - 将客户帐户共享到全局

  • 覆盖 magento/app/code/core/Mage/Checkout/Model/Session.php 并替换此方法:

    受保护的函数_getQuoteIdKey() { return 'quote_id'; //返回'quote_id_'。$网站[1];}

  • 覆盖 magento/app/code/core/Mage/Sales/Model/Quote.php 并将方法 getSharedStoreIds 更改为:

    公共函数 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(); */ } 返回 $ids; }

  • 覆盖 magento/app/code/core/Mage/Customers/Model/Customer.php 并再次将方法 getSharedWebsiteIds() 更改为:

    公共函数 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); } 返回 $ids; }

  • 如果您使用愿望清单选项,您应该对 magento/app/code/core/Mage/Wishlist/Model/Wishlist.php 中的方法执行相同的操作并更改 getSharedWebsiteIds 以便它不仅从当前网站加载商店 ID,而且从所有其中

  • 现在我们还必须在前端商店上实现货币(网站)开关,并在其间传递正确的会话 id,以便 magento 知道要查找的商店。我在这里模仿了货币切换并将以下下拉列表添加到

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

这会加载所有网站并将当前会话 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。

  • 为了使其正常工作,请覆盖

magento/app/code/core/Mage/Core/Model/Session/Abstract/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 */

现在应该显示多种货币,在多个网站上以多种货币收费,并在此共享登录和购物车之上。这个解决方案是我在互联网上找到的知识的集合,结合了我自己想出的一些点点滴滴,所以感谢任何提供建议的人!

于 2012-09-12T14:33:45.720 回答