В связи с выходом пре-беты 1.2 второй выпуск tips&tricks. Продолжаем знакомить Вас с идеями и проблемами версии 1.2, особенностями пре-беты, с которыми мы встретились в процессе разработки социальной сети.
Кроме того, мы завели себе блог на Хабре — присоединяйтесь, задавайте вопросы. Думаю, нам есть что обсудить.
Самое главное измение пре-беты – это новый формат файла core.php! Замените обязательно при обновлении этот файл и настройте его по усмотрению. В принципе, все описание параметров там уже есть.
Кстати, в database.php нормально заработало
И никаких Вам изощрений с AppModel или mysql.php ;)
Наконец-то привели в нормальный вид метод Sanitize – clean. Ранее он был ненастраиваемым и резал все, что можно в массивах. Теперь у метода появились параметры. Правда, в первой версии фильтр odd_spaces из-за недоработки не работал в первоначальной версии пре-беты, но благодаря автору статьи и системы тикетов проблема решена ;)
Итак, теперь легко настроить фильтры для очистки массивов от мусора.
Рассмотрим пример:
Вот так, все просто. Выставляете параметры, которые нужно задействовать, как true, а остальное как false.
Кстати, раз уж мы заговорили о Санитайзе, предложу вам довольно логичную конструкцию, которая быстро и просто защищает сайт.
Поскольку все поступающие данные из форм поступают через $this->data, а над всеми контроллерами существует надстройка Appcontroller, то логично прокрутить следующий финт в beforeFilter:
Все, теперь все данные из форм режутся автоматически ;) Правда, тут на пути истинном встает новая фича версии 1.2 – named arguments.
Новая фича named args – это способ передачи информации через GET-запросы, т.е. через строку запроса, с помощью рутера. Некоторые простые переменные, которые Вам в каком-либо случае понадобились, можно теперь передавать так:
cakephp.org/posts/index/page:2/sort:title
Соответственно, у нас где-то должны быть созданы переменные page со значением 2 и sort со значением title.
Оказывается, из контроллера их очень легко получить:
Здесь, правда, возникает проблема, которая мной пока не исследована – что можно передавать таким образом? Не слабое ли это место в защите. Если да, то passedArgs имеет смысл также засунуть в sanitize, чтобы он эти аргументы хорошенько почистил :)
Эта удобная фича поможет в одну строчку разобрать целый массив, например, $this->data.
Предположим, Вы получили из БД таблицу users. Соответственно, массив данных выглядит так:
Хотите получить только имена пользователей? Да запросто:
Как видите, {n} есть некий идентификатор скалярного массива. Соответственно, {n} можно помещать в различные места строки, меняя местонахождение этого скалярного массива в иерархии массива, содержащего скалярный.
Сам класс можно посмотреть отдельно, поскольку дело не ограничивается одним лишь extract. Есть merge, diff, contains, normalize. В общем, как всегда не хватает хелпа ;), а API здесь:
trac.cakephp.org/browser/branches/1.2.x.x/cake/libs/set.php
Таки мануал для 1.2 был снова возвращен на место. Правда, еще есть много недопечатанного, но, видимо, его постоянно дополняют.
В открытом доступе в html-виде можно прочитать здесь:
tempdocs.cakephp.org
Ждем Ваших замечаний и предложений. Также помните, что найденные проблемы можно оставить в виде тикета на сайте Кейка.
Кроме того, мы завели себе блог на Хабре — присоединяйтесь, задавайте вопросы. Думаю, нам есть что обсудить.
Новый core.php!
Самое главное измение пре-беты – это новый формат файла core.php! Замените обязательно при обновлении этот файл и настройте его по усмотрению. В принципе, все описание параметров там уже есть.
Кстати, в database.php нормально заработало
'encoding' => 'utf8'
И никаких Вам изощрений с AppModel или mysql.php ;)
Sanitize->clean
Наконец-то привели в нормальный вид метод Sanitize – clean. Ранее он был ненастраиваемым и резал все, что можно в массивах. Теперь у метода появились параметры. Правда, в первой версии фильтр odd_spaces из-за недоработки не работал в первоначальной версии пре-беты, но благодаря автору статьи и системы тикетов проблема решена ;)
Итак, теперь легко настроить фильтры для очистки массивов от мусора.
Рассмотрим пример:
uses('sanitize');
$sanitize = new Sanitize();
$options = array(
'connection' => 'default',
'odd_spaces' => true,
'encode' => false,
'dollar' => true,
'carriage' => true,
'unicode' => true,
'escape' => false,
'backslash' => true
);
$array = $sanitize->clean($array, $options);
Вот так, все просто. Выставляете параметры, которые нужно задействовать, как true, а остальное как false.
Кстати, раз уж мы заговорили о Санитайзе, предложу вам довольно логичную конструкцию, которая быстро и просто защищает сайт.
Sanitize в Appcontroller
Поскольку все поступающие данные из форм поступают через $this->data, а над всеми контроллерами существует надстройка Appcontroller, то логично прокрутить следующий финт в beforeFilter:
class AppController extends Controller
{
var $components = array('RequestHandler');
var $helpers=array('javascript', 'ajax','navigation');
function beforeFilter() {
if(!empty($this->data)) {
uses('sanitize');
$sanitize = new Sanitize();
$options = array(
'connection' => 'default',
'odd_spaces' => true,
'encode' => false,
'dollar' => true,
'carriage' => true,
'unicode' => true,
'escape' => false,
'backslash' => true
);
$this->data = $sanitize->clean($this->data, $options);
}
}
}
Все, теперь все данные из форм режутся автоматически ;) Правда, тут на пути истинном встает новая фича версии 1.2 – named arguments.
Named arguments
Новая фича named args – это способ передачи информации через GET-запросы, т.е. через строку запроса, с помощью рутера. Некоторые простые переменные, которые Вам в каком-либо случае понадобились, можно теперь передавать так:
cakephp.org/posts/index/page:2/sort:title
Соответственно, у нас где-то должны быть созданы переменные page со значением 2 и sort со значением title.
Оказывается, из контроллера их очень легко получить:
$this->passedArgs[‘page’];.
$this->passedArgs[‘sort’];
Здесь, правда, возникает проблема, которая мной пока не исследована – что можно передавать таким образом? Не слабое ли это место в защите. Если да, то passedArgs имеет смысл также засунуть в sanitize, чтобы он эти аргументы хорошенько почистил :)
Класс Set
Эта удобная фича поможет в одну строчку разобрать целый массив, например, $this->data.
Предположим, Вы получили из БД таблицу users. Соответственно, массив данных выглядит так:
$users = array
(
0 => array
(
'User' => array
(
'id' => 1
, 'name' => 'Felix'
)
)
, 1 => array
(
'User' => array
(
'id' => 2
, 'name' => 'Bob'
)
)
, 2 => array
(
'User' => array
(
'id' => 3
, 'name' => 'Jim'
)
)
);
Хотите получить только имена пользователей? Да запросто:
$userNames = Set::extract($users, '{n}.User.name');
Как видите, {n} есть некий идентификатор скалярного массива. Соответственно, {n} можно помещать в различные места строки, меняя местонахождение этого скалярного массива в иерархии массива, содержащего скалярный.
Сам класс можно посмотреть отдельно, поскольку дело не ограничивается одним лишь extract. Есть merge, diff, contains, normalize. В общем, как всегда не хватает хелпа ;), а API здесь:
trac.cakephp.org/browser/branches/1.2.x.x/cake/libs/set.php
Мануал
Таки мануал для 1.2 был снова возвращен на место. Правда, еще есть много недопечатанного, но, видимо, его постоянно дополняют.
В открытом доступе в html-виде можно прочитать здесь:
tempdocs.cakephp.org
Ждем Ваших замечаний и предложений. Также помните, что найденные проблемы можно оставить в виде тикета на сайте Кейка.