понедельник, 8 марта 2010 г.

Корзина товаров в CodeIgniter и русские буквы

При вызове $this->cart->insert() фреймворк проверяет поля регэкспом.
Если в product_id или product_name будет что-то отличное от латинских букв и цифр, то запрос успешно проигнорируется без каких-либо ошибок.
И такие баги я ненавижу больше всего.
Итак, чтобы починить, открываем /system/libraries/Cart.php.

В самом начале видим:
class CI_Cart {

// These are the regular expression rules that we use to validate the product ID and product name
var $product_id_rules = '\.a-z0-9_-'; // alpha-numeric, dashes, underscores, or periods
var $product_name_rules = '\.\:\-_ a-z0-9'; // alpha-numeric, dashes, underscores, colons or periods

Добавляем "а-я" в регэксп, должно получиться так:
var $product_id_rules    = '\.a-z0-9_-а-яА-Я'; 
var $product_name_rules    = '\.\:\-_ a-z0-9а-яА-Я';
Теперь переходим к методу function _insert($items = array())

Добавляем к проверке правило для уникода (буква u, после $/i).
Должно получиться так:
if ( ! preg_match("/^[".$this->product_id_rules."]+$/iu", $items['id']))
if ( ! preg_match("/^[".$this->product_name_rules."]+$/iu", $items['name']))
Теперь товары с русскими буквами должны сохраняться нормально.