今天试用了一下CodeIgniter的Cart类时遇到了个小问题,发现当name的值为中文时,就写入不了session。
在这里特别提醒一下。 在CI手册里也有说明,如下:
$data = array( 'id' => 'sku_123ABC', 'qty' => 1, 'price' => 39.95, 'name' => 'T-Shirt', 'options' => array('Size' => 'L', 'Color' => 'Red') ); $this->cart->insert($data);
重要说明: 上面的前四个数组索引 (id, qty, price 和name) 是 必需的。如果缺少其中的任何一个,数据将不会被保存到购物车中。第5个索引 (options) 是可选的。当你的商品包含一些相关的选项信息时,你就可以使用它。正如上面所显示的那样,请使用一个数组来保存选项信息。注意:$data['price'] 的值必须大于0
所以,如果以上四个值有一个值为空或者不符合Cart类的过滤规则而被过滤掉那就,数据将不会被保存进购物车中的。
现在我们需要考虑的是,要么把name值也设置为英文或者数字,但这在实际应用中有点不实际。难不成就为了适应CodeIgniter而把所有产品都多搞一个英文名? 当然不了。
我觉得需要用最简单而又不修改CI核心代码的方法来解决这个问题。这样也有利于升级和维护。所以我在application / library/下新建MY_Cart.php文件。 目的是为了重载Cart类的_insert()函数。重载时,直接把Cart类的_insert()方法copy过来。然后把过滤中文的那段代码屏蔽掉就OK了。
MY_Cart.php的代码如下:
Class MY_Cart extends CI_Cart { function __construct() { parent::__construct(); } /** * Insert * * @access private * @param array * @return bool */ function _insert($items = array()) { // Was any cart data passed? No? Bah... if ( ! is_array($items) OR count($items) == 0) { log_message('error', 'The insert method must be passed an array containing data.'); return FALSE; } // -------------------------------------------------------------------- // Does the $items array contain an id, quantity, price, and name? These are required if ( ! isset($items['id']) OR ! isset($items['qty']) OR ! isset($items['price']) OR ! isset($items['name'])) { log_message('error', 'The cart array must contain a product ID, quantity, price, and name.'); return FALSE; } // -------------------------------------------------------------------- // Prep the quantity. It can only be a number. Duh... $items['qty'] = trim(preg_replace('/([^0-9])/i', '', $items['qty'])); // Trim any leading zeros $items['qty'] = trim(preg_replace('/(^[0]+)/i', '', $items['qty'])); // If the quantity is zero or blank there's nothing for us to do if ( ! is_numeric($items['qty']) OR $items['qty'] == 0) { return FALSE; } // -------------------------------------------------------------------- // Validate the product ID. It can only be alpha-numeric, dashes, underscores or periods // Not totally sure we should impose this rule, but it seems prudent to standardize IDs. // Note: These can be user-specified by setting the $this->product_id_rules variable. if ( ! preg_match("/^[".$this->product_id_rules."]+$/i", $items['id'])) { log_message('error', 'Invalid product ID. The product ID can only contain alpha-numeric characters, dashes, and underscores'); return FALSE; } // -------------------------------------------------------------------- // Validate the product name. It can only be alpha-numeric, dashes, underscores, colons or periods. // Note: These can be user-specified by setting the $this->product_name_rules variable. //以下这段是为了让CART的name支持中文,所以继承Cart类并过滤 /* if ( ! preg_match("/^[".$this->product_name_rules."]+$/i", $items['name'])) { log_message('error', 'An invalid name was submitted as the product name: '.$items['name'].' The name can only contain alpha-numeric characters, dashes, underscores, colons, and spaces'); return FALSE; }*/ // -------------------------------------------------------------------- // Prep the price. Remove anything that isn't a number or decimal point. $items['price'] = trim(preg_replace('/([^0-9\\.])/i', '', $items['price'])); // Trim any leading zeros $items['price'] = trim(preg_replace('/(^[0]+)/i', '', $items['price'])); // Is the price a valid number? if ( ! is_numeric($items['price'])) { log_message('error', 'An invalid price was submitted for product ID: '.$items['id']); return FALSE; } // -------------------------------------------------------------------- // We now need to create a unique identifier for the item being inserted into the cart. // Every time something is added to the cart it is stored in the master cart array. // Each row in the cart array, however, must have a unique index that identifies not only // a particular product, but makes it possible to store identical products with different options. // For example, what if someone buys two identical t-shirts (same product ID), but in // different sizes? The product ID (and other attributes, like the name) will be identical for // both sizes because it's the same shirt. The only difference will be the size. // Internally, we need to treat identical submissions, but with different options, as a unique product. // Our solution is to convert the options array to a string and MD5 it along with the product ID. // This becomes the unique "row ID" if (isset($items['options']) AND count($items['options']) > 0) { $rowid = md5($items['id'].implode('', $items['options'])); } else { // No options were submitted so we simply MD5 the product ID. // Technically, we don't need to MD5 the ID in this case, but it makes // sense to standardize the format of array indexes for both conditions $rowid = md5($items['id']); } // -------------------------------------------------------------------- // Now that we have our unique "row ID", we'll add our cart items to the master array // let's unset this first, just to make sure our index contains only the data from this submission unset($this->_cart_contents[$rowid]); // Create a new index with our new row ID $this->_cart_contents[$rowid]['rowid'] = $rowid; // And add the new items to the cart array foreach ($items as $key => $val) { $this->_cart_contents[$rowid][$key] = $val; } // Woot! return TRUE; } // -------------------------------------------------------------------- } ?>
相关推荐
CodeIgniter框架
基于Codeigniter框架的pkadmin后台管理系统源码基于Codeigniter框架的pkadmin后台管理系统源码基于Codeigniter框架的pkadmin后台管理系统源码基于Codeigniter框架的pkadmin后台管理系统源码基于Codeigniter框架的...
PHP敏捷开发CodeIgniter框架
大多数PHPer都想写出运行状态良好的应用程序,而且希望尽可能做得简单且不费事。这篇文章是有关 CodeIgniter的(以后简称CI),CI是一个达成上面目的的所谓框架。
CodeIgniter框架 CI框架 多文件上传封装类,附详细调用说明和demo,解决CI不能多文件上传的困难。
CodeIgniter框架chm手册,在网上找了好久没有找到chm的 所以自己做了一个
PHP框架之CodeIgniter留言板实例PHP框架之CodeIgniter留言板实例PHP框架之CodeIgniter留言板实例PHP框架之CodeIgniter留言板实例PHP框架之CodeIgniter留言板实例PHP框架之CodeIgniter留言板实例PHP框架之CodeIgniter...
使用php的codeigniter框架做的教育网站
本资源包含: CodeIgniter中文参考手册.pdf; CodeIgniter用户指南(v1.7.2).chm; PHP敏捷开发框架CodeIgniter.chm。
Codeigniter框架整合Smarty引擎DEMO
需使用 CodeIgniter 框架 文件夹:Phpanalysis 放入 libraries 扩展文件夹内 如下方法调用: 在控制器的方法中加入以下两行代码,进行调用,拆分后会反回数组 $this->load->library('Phpanalysis/Exp_title.php'...
使用CodeIgniter框架快速开发PHP应用
PHP100 > PHP100新版教程 第17讲 CodeIgniter框架教程(3) 第18讲 CodeIgniter框架教程(4) 课件解压密码
教程名称:PHP敏捷开发 使用CodeIgniter 框架 8天完成电子商务网站的开课程目录:【】1.CI入门【】10.添加分类【】11.编辑分类【】14.商品属性添加和显示【】15.商品添加页面展示-ajax应用【】17.商品详细页【】18....
netbeans对Codeigniter框架支持的插件,其中包括两个插件。安装方法可以通过搜索Netbeans+PHP+Codeigniter等关键词找到具体的安装方法。
PHP100教程2012版:CodeIgniter框架教程(3)(第17讲)解压密码
你对 PEAR 这种大规模集成类库不感兴趣。 你不希望被迫学习一门模板语言(虽然可以选择你要求的模板解析器)。 你不喜欢复杂,热爱简单。 你需要清晰、完整的文档。 CodeIgniter页面展示 相关阅读 同类推荐...
CodeIgniter 是一个简单快速的PHP MVC 框架
CodeIgniter 是一个小巧但功能强大的 PHP 框架,作为一个简单而“优雅”的工具包,它可以为 PHP 程序员建立功能完善的 Web 应用程序