【问题标题】:cart issue in opencartopencart中的购物车问题
【发布时间】:2012-11-22 11:49:25
【问题描述】:

我无法理解一个概念。 假设您已经登录并将一些商品添加到您的购物车,但没有签出您已经退出。下次登录时,您将找到包含您之前添加的项目的购物车。 我想知道这个概念是如何工作的?经过一番研究,我知道它正在使用缓存文件。但是这个缓存文件是如何工作的呢?这个缓存文件和后端数据库有什么关系?

【问题讨论】:

  • 我会用数据库来做这件事,我会在其中保存用户的临时购物车,但是如果有解决方案可以使用缓存或 cookie,那么有趣的是哪个更好的解决方案。

标签: php mysql opencart


【解决方案1】:

OpenCart 使用customer 表中的字段将购物车项目存储为序列化的数据数组。该字段称为cart。同样,愿望清单使用相同的技术并被称为wishlist,同样在customer 表中。要实际加载缓存的内容,值是在/system/library/customer.php 中的login() 方法中加载的,使用此代码

        if ($customer_query->row['cart'] && is_string($customer_query->row['cart'])) {
            $cart = unserialize($customer_query->row['cart']);

            foreach ($cart as $key => $value) {
                if (!array_key_exists($key, $this->session->data['cart'])) {
                    $this->session->data['cart'][$key] = $value;
                } else {
                    $this->session->data['cart'][$key] += $value;
                }
            }           
        }

此代码实际上将商品添加到当前购物车中,因此如果您的购物篮中已有商品,它会将它们合并

【讨论】:

  • 感谢您的回复。我发现一开始我实际上想知道缓存数据是如何从数据库数据中获取的。
  • 已在上面编辑。您可以看到“购物车”行数据未序列化,然后循环将项目添加到当前会话
  • 感谢杰,您的回复对我很有价值。
【解决方案2】:

当您提出更多问题时 - 一个与购物车和物品存储相关,以及一两个与缓存相关的问题,并且正如 Jay Gilford 回答了与购物车相关的部分,这里是缓存的答案:

Opencart 缓存您在每次页面加载时使用最多的数据:货币、语言、类别、产品、类别产品计数、重量等级、税收等级等。在模型中(现在让我们谈谈前端/目录)当获取数据时,OpenCart 在查询数据库之前查找缓存的数据。如果发现缓存数据,它们会被提取和反序列化(它们使用 PHP 的函数 serialize() 存储在纯文本文件中)并返回到控制器而不查询数据库 - 因此获取应该更快1。如果没有缓存数据,则查询数据库,然后将获取的数据库数据序列化(使用 PHP 的函数serilizae())并保存到相应的缓存文件中。

这是一个可能发生的小问题 - 在您直接在数据库中编辑数据后(使用 phpMyAdmin,可能原因是什么),前端不存在更改。这是因为有缓存的旧数据在被要求时被提取。如果您必须进行此类编辑,请不要忘记手动删除相应的缓存文件。

这将我们带到模型的管理(后端)部分 - 在数据成功存储到数据库后编辑或添加数据(类别、产品、货币、重量等级等)时,会立即删除相应的缓存文件因此它可以在包含最新数据的前端重新创建。

缓存文件可以在/system/cache/文件夹中找到。

编辑:缓存在index.php 中实例化和注册,然后在控制器和模型中都可以作为$this->cache 访问,而set()get()delete() 方法是可调用的.缓存类本身可以在system/library/cache.php 找到,并且非常简单明了。

这样的回答就够了吗?

1 我见过一台服务器的 PHP-MySQL 通信速度非常快,而文件系统访问速度却很慢......

【讨论】:

  • 感谢这个回复对我真的很有帮助。再次感谢。你能告诉我这些缓存文件是如何以及从代码的哪一部分创建和删除的。很抱歉提出更多问题,但老实说,我陷入了一些项目。这是我第一次在电子商务领域工作,我现在没有时间研究整个代码。请理解我的问题。再次感谢。
  • @dulton 好的,现在检查我的编辑。如果您对答案感到满意,您应该使用答案左侧的 tick 将其标记为“已接受”... 如果您有更多问题,最好问一个 new 一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多