`
IT独行者
  • 浏览: 12569 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

CodeIgniter框架Cart类 name 不能设置中文的解决方法

阅读更多

今天试用了一下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;
}
// --------------------------------------------------------------------
}
?>

 

 

原文地址:http://www.uncletoo.com/html/ci/652.html

分享到:
评论

相关推荐

    CodeIgniter框架

    8. **开发效率**:CodeIgniter的轻量化设计使得开发速度加快,同时,它的文档详尽,社区活跃,这意味着开发者可以迅速找到解决问题的方法。 9. **扩展性与第三方库**:CodeIgniter支持通过插件和自定义类库进行扩展...

    PHP敏捷开发CodeIgniter框架

    2. **数据库交互**:第四章深入探讨了如何设置数据库来配合CodeIgniter的使用,特别是如何利用ActiveRecord类来简化数据库操作。ActiveRecord模式简化了数据访问层的实现,使得数据查询和操作变得更加直观。 3. **...

    基于Codeigniter框架的pkadmin后台管理系统.zip

    基于Codeigniter框架的pkadmin后台管理系统源码基于Codeigniter框架的pkadmin后台管理系统源码基于Codeigniter框架的pkadmin后台管理系统源码基于Codeigniter框架的pkadmin后台管理系统源码基于Codeigniter框架的...

    php基于CodeIgniter框架

    CI 的出现是为了解决开发者在编写应用程序时遇到的问题,即希望写出运行状态良好的应用程序,同时也希望尽可能简单且不费事。 CI 的特点包括免费、轻量级、易于安装等,使开发者的编程生涯变得轻松。CI 的优点还...

    PHP开发框架CodeIgniter中文参考资料

    它为开发者提供了一个全面的API参考,帮助他们理解和使用框架中的每个类和方法。此外,手册还涵盖了错误处理、日志记录以及性能优化等方面的指导。 2. **CodeIgniter用户指南(v1.7.2).chm**:这是CodeIgniter ...

    PHP100教程2012版:CodeIgniter框架教程(3)(第17讲) 解压密码

    根据给定的信息,我们可以推断出本教程主要围绕着PHP100教程2012版中的第17讲——CodeIgniter框架相关内容展开。由于提供的“部分内容”中似乎包含了与解压密码...希望本文能为学习CodeIgniter框架提供一定的参考价值。

    CodeIgniter框架 CI框架 多文件上传封装类

    在处理文件上传时,CodeIgniter默认的`upload`类只支持单个文件的上传,但通过自定义或者扩展,我们可以实现多文件上传的功能。在本主题中,我们主要探讨如何在CI框架中封装一个多文件上传类,并提供详细的调用说明...

    php敏捷开发框架Codeigniter

    在压缩包中的"敏捷开发Codeigniter"可能包含了关于如何在CodeIgniter框架下实践敏捷开发方法的资源,比如快速原型设计、持续集成、测试驱动开发等实践。这些资料可以帮助开发者更好地运用敏捷理念,提高开发效率和...

    使用php的codeigniter框架做的教育网站

    1. 用户认证与权限管理:通过CodeIgniter的Session类和第三方库,可以实现用户登录、注册、权限验证等功能,确保只有授权用户才能访问特定资源。 2. 课程管理系统:建立模型来管理课程信息,包括课程名称、描述、...

    CodeIgniter框架chm手册

    CodeIgniter框架chm手册,在网上找了好久没有找到chm的 所以自己做了一个

    PHP框架之CodeIgniter留言板实例

    PHP框架之CodeIgniter留言板实例PHP框架之CodeIgniter留言板实例PHP框架之CodeIgniter留言板实例PHP框架之CodeIgniter留言板实例PHP框架之CodeIgniter留言板实例PHP框架之CodeIgniter留言板实例PHP框架之CodeIgniter...

    使用CodeIgniter框架快速开发PHP应用

    #### CodeIgniter为什么能被称为框架? 1. **模块化设计**:CI采用了模块化的结构,开发者可以根据项目需求灵活选择所需组件。 2. **MVC模式**:CI遵循模型-视图-控制器(Model-View-Controller)的设计模式,将...

    Codeigniter购物车类不能添加中文的解决方法

    Codeigniter框架中购物车类不能添加中文字符的问题,很大程度上是由于在处理产品名称的时候,通过正则表达式对产品名称进行了非中文字符的限制。在`system/libraries/Cart.php`文件中的一个方法中,产品名称被限制为...

    Codeigniter框架整合Smarty引擎DEMO

    在"CI_Smarty"类中添加以下方法: ```php public function initialize() { require_once(APPPATH . 'libraries/Smarty/libs/Smarty.class.php'); $this->smarty = new Smarty(); // 设置模板目录 $this->...

    CodeIgniter是一个简单快速的PHPMVC框架

    4. **更好的错误报告和日志**:框架提供了更详细的错误报告和日志记录机制,帮助开发者更快地定位和解决问题。 5. **安全增强**:包括输入过滤、XSS防护、CSRF保护等安全特性,有助于预防常见的Web攻击。 6. **CLI...

    codeigniter框架

    5. **连接数据库**:配置数据库设置,并使用CodeIgniter的数据库类进行数据操作。 6. **路由配置**:根据项目需求设置URL路由规则。 7. **运行应用**:通过浏览器访问应用,查看运行效果。 总的来说,CodeIgniter为...

    CodeIgniter 框架中文无组件分词扩展类

    需使用 CodeIgniter 框架 文件夹:Phpanalysis 放入 libraries 扩展文件夹内 如下方法调用: 在控制器的方法中加入以下两行代码,进行调用,拆分后会反回数组 $this->load->library('Phpanalysis/Exp_title.php'...

    PHP100-第17讲CodeIgniter框架教程(3)和第18讲CodeIgniter框架教程(4)-解压密码

    PHP100 > PHP100新版教程 第17讲 CodeIgniter框架教程(3) 第18讲 CodeIgniter框架教程(4) 课件解压密码

    用CodeIgniter框架快速构建企业门户网站.pdf

    CodeIgniter 框架快速构建企业门户网站 CodeIgniter 是一个免费、轻量级、容易安装的 PHP 开发框架,采用 MVC 模式,可以使开发变得轻松。使用 CodeIgniter 框架可以快速开发出适合企业需求的门户网站。 1. ...

Global site tag (gtag.js) - Google Analytics