您有一个opencart安装设置,其中包含多个具有不同子域的商店(所有商店位于同一个域下)。我希望客户能够将物品放在购物车中的一个站点上,然后移动到下一个站点并放入更多甚至减去,直到最终客户在任何商店结账。注意产品可能出现在一个商店中,但不能出现在另一个商店中。
我注意到opencart有点这样做。即它将把购物车中已有的产品带到下一家商店,但前提是产品出现在两家商店。此外,如果客户随后删除其中一个商品并移回同一商店,则会再次出现这些商品。
第一个问题似乎首先是购物车中的产品是通过我猜是通过store_id选择产品的查询来显示的。我一直在努力想看看能不能找到任何东西,但我不知所措。
第二个问题似乎与会话的内容有关。我还在学习php,并且对如何尝试修改会话的工作方式感到有点困惑。
任何人都可以提供一些关于如何修复/更改此内容的指导。
答案 0 :(得分:3)
OpenCart将所有这些信息存储在PHP会话中。由于您的商店位于不同的子域下,因此当您从一个商店切换到另一个商店时,PHP会话会发生变化。
因此,您需要做的第一件事是在所有子域之间共享会话。默认情况下,PHP使用“PHPSESSID”cookie在多个页面中传播会话数据,默认情况下,它使用cookie声明中的当前顶级域和子域。
示例:www.domain.com
缺点是会话数据不能随身携带到其他子域。因此,如果您在www.domain.com上开始会话,会话数据将在forums.domain.com上不可用。解决方案是在设置'PHPSESSID'cookie时更改PHP使用的域。
假设您有一个包含在每个PHP页面顶部的init文件,您可以使用ini_set()函数。只需将其添加到初始页面的顶部:
ini_set('session.cookie_domain',
substr($_SERVER['SERVER_NAME'],strpos($_SERVER['SERVER_NAME'],"."),100));
这行代码占用了域,并从子域中删除。
示例:forums.domain.com - > .domain.com
现在,每次PHP设置'PHPSESSID'cookie时,cookie都可用于所有子域名!
您可能还需要对OpenCart核心进行一些修改才能使其正常工作。
玩得开心:)
答案 1 :(得分:1)
在Tohids帮助之后,我有以下解决方案,希望它能帮助其他人。我将cookie_domain代码行添加到session.php文件中,并在使用setcookie函数覆盖货币和语言cookie的任何地方添加或更改了cookie名称。
打开\ system \ session.php
找到;
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));
}
找到;
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));
}
open system \ 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));
}
答案 2 :(得分:0)
非常简单的解决方案!在子域之间共享登录会话
确保在DOMAIN.COM之前包含"。" 期间
那就是......现在 www.domain.com 上的登录会话与 www.sub.domain.com 共享