2

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

我注意到 opencart 有点这样做。即它将已经在购物车中的产品带到下一个商店,但前提是产品同时出现在两个商店中。此外,如果客户随后删除其中一件商品并回到同一家商店,他们的产品就会重新出现。

第一个问题似乎首先是购物车中的产品通过我猜是通过 store_id 选择产品的查询来显示。我仔细看了看是否能找到任何东西,但不知所措。

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

任何人都可以就我如何解决/更改此问题提供一些指导。

4

3 回答 3

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));

这行代码获取域并关闭子域。

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

现在,每次 PHP 设置 'PHPSESSID' cookie 时,该 cookie 将可用于所有子域!

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

玩得开心 :)

于 2012-08-23T17:43:56.930 回答
1

在 Tohids 帮助后,我得到了以下解决方案,希望对其他人有所帮助。我在 session.php 文件中添加了 cookie_domain 代码行,并且还在使用 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));
}

打开系统\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));
}
于 2012-08-30T12:30:23.203 回答
0

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

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

确保包括句点“。” 在 DOMAIN.COM 之前

就是这样...现在在www.domain.com上启动的登录会话与www.sub.domain.com共享

于 2016-05-20T13:23:51.573 回答