用户
 找回密码
 入住 CI 中国社区
搜索
查看: 4734|回复: 3
收起左侧

[讨论/交流] CI2.0 Cart类 name 不能设置中文的解决方法

[复制链接]
发表于 2011-8-27 15:19:36 | 显示全部楼层 |阅读模式
本帖最后由 avinmo 于 2011-8-27 15:21 编辑

今天试用了一下CI的Cart类时遇到了个小问题,发现当name的值为中文时,就写入不了session。

在这里特别提醒一下。 在CI手册里也有说明,如下:

重要说明: 上面的前四个数组索引 (id, qty, price 和name) 是 必需的。如果缺少其中的任何一个,数据将不会被保存到购物车中。第5个索引 (options) 是可选的。当你的商品包含一些相关的选项信息时,你就可以使用它。正如上面所显示的那样,请使用一个数组来保存选项信息。注意:$data['price'] 的值必须大于0

所以,如果以上四个值有一个值为空或者不符合Cart类的过滤规则而被过滤掉那就,数据将不会被保存进购物车中的。

现在我们需要考虑的是,要么把name值也设置为英文或者数字,但这在实际应用中有点不实际。难不成就为了适应CI而把所有产品都多搞一个英文名? 当然不了。

我觉得需要用最简单而又不修改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;
}

// --------------------------------------------------------------------

}

?>


点击下载 MY_Cart.php文件
 楼主| 发表于 2011-11-11 15:45:58 | 显示全部楼层
竟然没人回复。。。。没人顶。。。 唉。。。 版主。给加个精啊。
发表于 2012-12-11 17:12:32 | 显示全部楼层
支持,狂顶
发表于 2014-8-25 16:45:42 | 显示全部楼层
狂顶!!刚好做到,需要这个

本版积分规则