【问题标题】:Opencart cart across multiple stores with different subdomains跨多个具有不同子域的商店的 Opencart 购物车
【发布时间】:2016-05-20 21:23:51
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: session opencart cart


    【解决方案1】:

    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 的核心进行一些小修改才能使其正常工作。

    玩得开心:)

    【讨论】:

    • 感谢托希德。这个解释帮助我更好地理解会话。我设法通过 opencart 核心文件进行排序导航,一切似乎都在工作。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      1. 打开文件:system/library/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

      共享

      【讨论】:

        猜你喜欢
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-04
        • 1970-01-01
        • 1970-01-01
        • 2015-12-24
        相关资源
        最近更新 更多