Показаны сообщения с ярлыком codeigniter. Показать все сообщения
Показаны сообщения с ярлыком codeigniter. Показать все сообщения

понедельник, 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']))
Теперь товары с русскими буквами должны сохраняться нормально.

вторник, 23 февраля 2010 г.

Как заставить сотрудничать Smarty и Form Helper из CodeIgniter

Так как, при использовании шаблонизатора Smarty, ограничивается использование PHP-тегов, необходимо искать другие пути.

Один из них это разработка плагина для Smarty.
Немного покопавшись, я нашёл готовый, но меня не устроил ограниченный набор передаваемых параметров.

Поэтому я допилил до следующего вида:



  1. <?php


  2. /*


  3.  Author: Svetoslav Marinov; svetoslavm [] gmail.com


  4.  Inspired by: http://codeigniter.com/wiki/Use_URL_helper_from_Smarty/


  5.  Modified: Dmitriy S. Aleshkowsky; to.wwarlock [] gmail.com


  6.  */




  7. function smarty_function_form($params, &$smarty)


  8. {


  9.     //check if the needed function exists


  10.     //otherwise try to load it


  11.     if (!function_exists('form_open')) {


  12.         //return error message in case we can't get CI instance


  13.         if (!function_exists('get_instance')) return "Can't get CI instance";


  14.         $CI =& get_instance();


  15.         $CI->load->helper('form');


  16.     }




  17.     // Making it more complex


  18.     if (isset($params['url'])) {


  19.         $url = $params['url'];


  20.         unset ($params['url']);


  21.         if ($params['type'] == 'upload')


  22.         {


  23.             unset ($params['type']);


  24.             return form_open_multipart($url, $params);


  25.         } else {


  26.             return form_open($url, $params);


  27.         }


  28.     } elseif (empty($params)) {


  29.         return form_close();


  30.     }


  31. }


  32. ?>

Согласно API можно ещё добавить параметры для скрытых полей, однако у меня не было в них необходимости, поэтому я намеренно не стал их реализовывать.