forked from samdark/yiiframework_ru_cookbook
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathform.validation.fiters.txt
79 lines (67 loc) · 3.76 KB
/
form.validation.fiters.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
Использование собственных фильтров в правилах валидации
=======================================================
Фильтры — очень полезная и мощная возможность Yii. Покажем, как создать
и применить свой фильтр для транслитерирования поля модели (то есть «абаба
галамага» превратить в «ababa_galamaga»).
Опишем класс нашего фильтра `TranslitFilter`. В нём создадим метод `translitUrl`,
который будет обрабатывать наше поле. Для транислитерации существует множество
различных правил и стандартов. В примере ниже использован немного изменённый код
[http://programmerz.ru/post/php_translit.html](http://programmerz.ru/post/php_translit.html):
~~~
[php]
class TranslitFilter {
public function translitUrl($str){
$tr = array(
"А"=>"a","Б"=>"b","В"=>"v","Г"=>"g",
"Д"=>"d","Е"=>"e","Ж"=>"j","З"=>"z","И"=>"i",
"Й"=>"y","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
"О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t",
"У"=>"u","Ф"=>"f","Х"=>"h","Ц"=>"ts","Ч"=>"ch",
"Ш"=>"sh","Щ"=>"sch","Ъ"=>"","Ы"=>"yi","Ь"=>"",
"Э"=>"e","Ю"=>"yu","Я"=>"ya","а"=>"a","б"=>"b",
"в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"j",
"з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
"м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
"с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
"ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
"ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya",
" "=> "_", "."=> "", "/"=> "_"
);
if (preg_match('/[^A-Za-z0-9_\-]/', $str)) {
$str = strtr($str,$tr);
$str = preg_replace('/[^A-Za-z0-9_\-]/', '', $str);
}
return $str;
}
}
~~~
Сохраняем его под этим же именем в директории, доступной для импорта. Далее в методе
`rules` модели прописываем следующее:
~~~
[php]
return array(
// …
array('alias', 'filter', 'filter'=>array("TranslitFilter", "translitUrl")),
)
~~~
> Info|Информация: в `filter` указывается функция обратного вызова в виде
array("Класс", "метод"). При использовании метода того же контроллера
в качестве имени указывается `$this`.
Для версий 1.0.x не забываем прописать нужное поле в `safeAttributes()`.
Таким же образом можно использовать любой метод любого существующего компонента.
Например, вот так можно выполнить фильтрацию текста от XSS-атак:
~~~
[php]
public function rules() {
return array(
array('text','required'),
array('text','filter','filter'=>array($obj=new CHtmlPurifier(),'purify')),
//тут какие-то правила…
array('time','default','value'=>time()),
);
}
~~~
---
- `Автор оригинала`: [Dreammaker](http://yiiframework.ru/forum/memberlist.php?mode=viewprofile&u=557)
- `Дополнения:` [Ekstazi](http://yiiframework.ru/forum/memberlist.php?mode=viewprofile&u=548)
- `Обсуждение и комментарии`: [http://yiiframework.ru/forum/viewtopic.php?f=8&t=251](http://yiiframework.ru/forum/viewtopic.php?f=8&t=251)