gpt4 book ai didi

session - Magento多个网站共享购物车

转载 作者:行者123 更新时间:2023-12-02 21:10:37 24 4
gpt4 key购买 nike

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

Mage_Checkout_Model_Session

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

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

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

任何想法这是否有可能吗?

最佳答案

在寻找答案之后,偶然发现了自2009年以来一直没有确定解决方案的相同问题,我终于不得不亲自研究代码的深层内容-瞧,我有一个可行的解决方案。这里是想为任何人设置Magento的人的详细指南


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


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

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


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

SetEnvIf主机网站-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 Host ^ website-us.local MAGE_RUN_TYPE = website

SetEnvIf主机网站-uk.local MAGE_RUN_CODE = base_uk
SetEnvIf主机网站-uk.local MAGE_RUN_TYPE =网站
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;
}


}


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


在默认配置范围中时,设置系统-配置-客户配置-帐户共享选项-将客户帐户共享到全局
覆盖magento / app / code / core / Mage / Checkout / Model / Session.php并替换此方法:

受保护的函数_getQuoteIdKey()
{
返回'quote_id';
//返回'quote_id_'。 $ websites [1];
}
覆盖magento / app / code / core / Mage / Sales / Model / Quote.php并将方法getSharedStoreIds更改为:

公共函数getSharedStoreIds()
{
$ ids = $ this-> _ getData('shared_store_ids');
如果(is_null($ ids)||!is_array($ ids)){
$ arrStoreIds = array();
foreach(Mage :: getModel('core / website')-> getCollection()as $ website)
{
$ arrStoreIds = array_merge($ arrStoreIds,$ website-> getStoreIds());
}
返回$ arrStoreIds;
/ *如果($ website = $ this-> getWebsite()){
返回$ 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');
如果($ ids === null){
$ ids = array();
如果((bool)$ this-> getSharingConfig()-> isWebsiteScope()){
$ ids [] = $ this-> getWebsiteId();
}其他{
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。他们之中
现在,我们还必须在前端商店上实现货币(网站)切换,并在两者之间传递正确的会话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 /代码/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 */


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

关于session - Magento多个网站共享购物车,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12374289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com