在我搜索了这个问题的答案并偶然发现了自 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 */
现在应该显示多种货币,在多个网站上以多种货币收费,并在此共享登录和购物车之上。这个解决方案是我在互联网上找到的知识的集合,结合了我自己想出的一些点点滴滴,所以感谢任何提供建议的人!