opencart中的购物车类

数据库的用户表customer中设置了一个cart字段,类型是text,这个字段保存当前用户的购物车信息。

+-------------------+--------------+------+-----+---------+----------------+
| Field             | Type         | Null | Key | Default | Extra          |
+-------------------+--------------+------+-----+---------+----------------+
| customer_id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| customer_group_id | int(11)      | NO   |     | NULL    |                |
| store_id          | int(11)      | NO   |     | 0       |                |
| name              | varchar(32)  | NO   |     | NULL    |                |
| email             | varchar(96)  | NO   |     | NULL    |                |
| telephone         | varchar(32)  | NO   |     | NULL    |                |
| password          | varchar(40)  | NO   |     | NULL    |                |
| salt              | varchar(9)   | NO   |     | NULL    |                |
| cart              | text         | YES  |     | NULL    |                |
| wishlist          | text         | YES  |     | NULL    |                |
| newsletter        | tinyint(1)   | NO   |     | 0       |                |
| address_id        | int(11)      | NO   |     | 0       |                |
| custom_field      | text         | NO   |     | NULL    |                |
| ip                | varchar(40)  | NO   |     | NULL    |                |
| status            | tinyint(1)   | NO   |     | NULL    |                |
| approved          | tinyint(1)   | NO   |     | NULL    |                |
| safe              | tinyint(1)   | NO   |     | NULL    |                |
| token             | varchar(255) | NO   |     | NULL    |                |
| date_added        | datetime     | NO   |     | NULL    |                |
+-------------------+--------------+------+-----+---------+----------------+

添加商品到购物车:

public function add($product_id, $qty = 1, $option = array(), $recurring_id = 0) {
        $this->data = array();

        $product[‘product_id‘] = (int)$product_id;

        if ($option) {
            $product[‘option‘] = $option;
        }

        if ($recurring_id) {
            $product[‘recurring_id‘] = (int)$recurring_id;
        }

        $key = base64_encode(serialize($product));

        if ((int)$qty && ((int)$qty > 0)) {
            if (!isset($this->session->data[‘cart‘][$key])) {
                $this->session->data[‘cart‘][$key] = (int)$qty;
            } else {
                $this->session->data[‘cart‘][$key] += (int)$qty;
            }
        }
}

当用户登录时,从表中取出对应的cart内容,保存到session中,这样可以在程序的任何位置都能访问到

public function login($email, $password, $override = false) {

    $customer_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "customer WHERE LOWER(email) = ‘" . $this->db->escape(utf8_strtolower($email)) . "‘ AND (password = SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1(‘" . $this->db->escape($password) . "‘))))) OR password = ‘" . $this->db->escape(md5($password)) . "‘) AND status = ‘1‘ AND approved = ‘1‘");

    if ($customer_query->num_rows) {//查询的结果是否存在
            $this->session->data[‘customer_id‘] = $customer_query->row[‘customer_id‘];

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

system/library/customer.php的构造函数中:

public function __construct($registry) {
        $this->config = $registry->get(‘config‘);
        $this->db = $registry->get(‘db‘);
        $this->request = $registry->get(‘request‘);
        $this->session = $registry->get(‘session‘);

        if (isset($this->session->data[‘customer_id‘])) {
            $customer_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "customer WHERE customer_id = ‘" . (int)$this->session->data[‘customer_id‘] . "‘ AND status = ‘1‘");

            if ($customer_query->num_rows) {
                $this->customer_id = $customer_query->row[‘customer_id‘];
                $this->db->query("UPDATE " . DB_PREFIX . "customer SET cart = ‘" . $this->db->escape(isset($this->session->data[‘cart‘]) ? serialize($this->session->data[‘cart‘]) : ‘‘) . "‘, wishlist = ‘" . $this->db->escape(isset($this->session->data[‘wishlist‘]) ? serialize($this->session->data[‘wishlist‘]) : ‘‘) . "‘, ip = ‘" . $this->db->escape($this->request->server[‘REMOTE_ADDR‘]) . "‘ WHERE customer_id = ‘" . (int)$this->customer_id . "‘");
            } else {
                $this->logout();
            }
        }
    }

这样就可以保持实时的把购物车的内容同步到表中。

时间: 2024-12-13 17:06:42

opencart中的购物车类的相关文章

在WebForm中实现购物车思路

关于网站购物车的实现的思考 写在前面的话:刚来公司的的时候,老大安排了一个任务,企业站,但是需要实现购物车的功能,以前没做过,所有就向周围的人请教了一下如何实现购物车,自己也在网上搜了一下,有了些自己的认识,于是写了下来 1.实现思路: 在网上查了一下资料,以及向身边请教之后发现,对于网站购物车的实现大体分为三种方法:Session实现.Cookie实现.数据库实现,其实这三种实现,指的只是如何跟踪用户的操作,即用户购买物品,加入购物车,加入了什么物品,加入了多少物品等信息的暂时保存. 这三种方

PHP购物车类

<?php /** * 购物车类 */ session_start(); class Cart{ private static $ins = null; private $items = array(); protected function __construct(){} // 获取实例 protected static function getIns(){ if(!(self::$ins instanceof self)){ self::$ins = new self(); } return

php之购物车类思路及代码

<?php /* 购物车类 1.整站范围内,购物车--全局有效 解决:把购物车的信息,放在session里 2.既然全局有效,购物车的实例只有一个 解决:单例模式 技术选型:session+单例 功能分析 判断商品是否存在 添加商品 删除商品 修改商品的数量 某商品数量+1 某商品数量-1 查看购物车的商品种类 商品数量 商品的总金额 所有商品 清空购物车 */ session_start(); class CartTool { private static $ins = null; priva

购物车类2分析session+single

<?php /** * 购物车类分析 * 1.无论在网站刷新了多少次页面,或者新增加了多少个商品.打开购物车查看,看到的结果都市一样的 * 即,打开A商品刷新,打开B商品刷新,看到的购物车应该是一样的 * 整站范围内购物车是全局有效有的. * 解决:将购物车的信息放在数据库,也可以放在session里. * 2.购物车全局有效,即购物车的实例只能有一个 * 不能出现3个页面,,买3个商品,就形成了3个购物车实例 * 解决:单例模式 * * 技术支持:seesion+single * * 功能分析

OC学习篇之---Foundation框架中的其他类(NSNumber,NSDate,NSExcetion)

1.NSNumber 这个类主要是用来封装基本类型的,说到这里,就不得不说一下了: OC中的集合是不允许存入基本类型的,所以NSNumber类就诞生了,需要将基本类型封装一下,然后存进去,这个类似于Java中的自动装箱和拆箱,Java中的集合其实也是不允许存入基本类型的,但是我们任然看可以那么操作,就是因为有自动装箱功能,如果你将Eclipse的JDK改成5.0之前的,你看看还能操作吗.. 注:那为什么基本类型不能存入到集合中呢? 原因是在操作集合的时候会操作集合元素中的方法,但是基本类型是没有

C++中虚基类

摘自<C++程序设计> 如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员. C++提供虚基类(virtual base class)的方法,使得在继承间接共同基类时只保留一份成员. 下面举例说明: 在如下的图中: Person类是Student和Teacher的基类,而Graduate类又继承自Student和Teacher类. 如果使用虚基类的话,Graduate将有两份age拷贝,两份gender拷贝,两份name

深刻理解Python中的元类(metaclass)

译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程.于是e-satis同学给出了神一般的回复,该回复获得了985点的赞同点数,更有人评论说这段回复应该加入到Python的官方文档中去.而e-satis同学本人在Stack Overflow中的声望积分也高达6

java中常用的包、类、以及包中常用的类、方法、属性-----io包

由于最近有需要,所以下面是我整理的在开发中常用的包.类.以及包中常用的类.方法.属性:有需要的看看 java中常用的包.类.以及包中常用的类.方法.属性 常用的包 java.io.*; java.util.*; java.lang.*; java.math.*; java.sql.*; java.text.*; java.awt.*; javax.swing.*;   包名 接口 类 方法 属性 java.io.*; java.io.Serializable实现序列化 java.io.Buffe

C#派生类中使用基类protected成员的方法

我们知道C#中通过继承可以使一个具有公共数据和方法的基类被广泛应用从而减少代码量,这样派生类会具有基类中所有成员(除构造器等),我们理所当然可以通过派生类实例来使用基类的成员.那么当基类成员被protected修饰时,我们应该怎么在派生类中使用基类成员呢,下面将介绍使用方法. 首先我们贴一段错误的使用代码: 1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Console.ReadLine(); 6 7 } 8 } 9 pub