2012-08-22 57 views
2

嗨有一个单独的opencart安装设置与几个商店与不同的子域(都在同一个域名下)。我希望顾客能够将物品放入购物车中的一个站点,然后移动到下一个位置并放入更多甚至是减去,直到最终顾客在任何商店结账。注意产品可能会出现在一个商店,但不是另一个。跨多个商店与不同子域的Opencart购物车

我注意到opencart有点这样做。即它将把已经在购物车中的产品带到下一个商店,但只有当这两个商店中出现这些产品时。此外,如果客户删除其中一个项目并移回同一商店,他们的产品将重新出现。

第一个问题似乎首先是购物车中的产品正在通过我认为是通过store_id选择产品的查询来显示。我有一个很难看,看看我能找到什么东西,但我很茫然。

第二个问题似乎与会议的内容有关。我仍然在学习PHP,并且对如何尝试修改会话的工作方式感到困惑。

任何人都可以请提供一些指导我如何可以去解决/改变这一点。

回答

3

OpenCart将所有这些信息存储在你的PHP会话中。由于您的商店位于不同的子域下,因此当您从一个商店切换到另一个商店时,PHP会话会发生变化。

因此,您需要做的第一件事就是共享所有子域之间的会话。默认情况下,PHP使用'PHPSESSID'cookie在多个页面上传播会话数据,默认情况下它使用cookie声明中当前的顶级域和子域。

例子:www.domain.com

这样做的缺点是,会话数据不能跟你前往其他子域。因此,如果您在www.domain.com上开始会话,会话数据将在forums.domain.com上无法使用。解决方案是更改PHP在设置“PHPSESSID”Cookie时使用的域。

假设您有一个包含在每个PHP页面顶部的init文件,您可以使用ini_set()函数。只需添加到您的初始化页面的顶部:

ini_set('session.cookie_domain', 
substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100)); 

这行代码需要域和LOPS子域名。

例子:forums.domain.com - > .domain.com

现在,每一次的PHP设置 'PHPSESSID' 的cookie,则cookie将被提供给所有子域名!

您可能还需要对OpenCart的核心进行一些修改才能使其工作。

玩得开心:)

+0

感谢Tohid共享。这个解释帮助我更好地理解会话。我设法按照我通过opencart核心文件的方式进行排序,并且似乎都可以工作。 – Mark

1

Tohids帮助后,我有以下的解决方案,希望它可以帮助别人。我将cookie_domain代码行添加到session.php文件中,并且在使用setcookie函数来覆盖货币和语言cookie的地方添加或更改了cookie名称。

open \ system \ session。php

find;

ini_set('session.use_cookies', 'On'); 
ini_set('session.use_trans_sid', 'Off'); 

后插入;

ini_set('session.cookie_domain', substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100)); 

打开\的index.php

发现;

if (!isset($request->cookie['language']) || $request->cookie['language'] != $code) {  
    setcookie('language', $code, time() + 60 * 60 * 24 * 30, '/', $request->server['HTTP_HOST']); 
} 

替换为;

if (!isset($request->cookie['language']) || $request->cookie['language'] != $code) {  
    setcookie('language', $code, time() + 60 * 60 * 24 * 30, '/', substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100)); 
}   

find;

if (isset($request->get['tracking']) && !isset($request->cookie['tracking'])) { 
    setcookie('tracking', $request->get['tracking'], time() + 3600 * 24 * 1000, '/'); 
} 

替换为;

if (isset($request->get['tracking']) && !isset($request->cookie['tracking'])) { 
    setcookie('tracking', $request->get['tracking'], time() + 3600 * 24 * 1000, '/', substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100)); 
} 

开放系统\ currency.php

发现;

if (!isset($this->request->cookie['currency']) || ($this->request->cookie['currency'] != $currency)) { 
    setcookie('currency', $currency, time() + 60 * 60 * 24 * 30, '/', $this->request->server['HTTP_HOST']); 
} 

替换为;

if (!isset($this->request->cookie['currency']) || ($this->request->cookie['currency'] != $currency)) { 
    setcookie('currency', $currency, time() + 60 * 60 * 24 * 30, '/', substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100)); 
} 
0

非常简单的解决方案!共享跨越子域的登录会话

  1. 打开文件:系统/库/ session.php文件
  2. FIND LINE:session_set_cookie_params(0, '/');
  3. APPEND:session_set_cookie_params(0,'/','.DOMAIN.COM);

确保包括期间“。” DOMAIN.COM

这之前...现在登录会话开始www.domain.comwww.sub.domain.com