Вход Регистрация
* mir007

Работа с формами

  1. <?php
  2. Class FormCheck {
  3. public $input = []; // Массив входных данных
  4. public $errors = []; // Массив ошибок
  5. public $field = ''; // Текущее поле
  6. public $key = ''; // Текущий ключ в массиве
  7. public $is_empty = false; // Пусто или нет
  8. // Записываем входные данные
  9. public function __construct($input){
  10. $this->input = $input;
  11. }
  12. // Выбираем поле, с которым будем работать
  13. public function check($field,$key,$must_be_filled=true){
  14. $this->field = $field;
  15. $this->key = $key;
  16. if($this->has_key($key)){
  17. $this->is_empty = false;
  18. }
  19. else {
  20. $this->is_empty = true;
  21. if($must_be_filled == true) $this->add_error('не может быть пустым');
  22. }
  23. return $this;
  24. }
  25. // Проверка по типу
  26. public function type($type){
  27. if($this->is_empty == true) return $this;
  28. switch($type){
  29. case 'login':
  30. $match = '/^([A-Za-z0-9_]+)$/';
  31. $error = 'должно содержать только английские буквы, цифры и символ нижнего подчеркивания.';
  32. break;
  33. case 'name':
  34. $match = '/^([A-Za-zа-яА-ЯёЁ-\s]+)$/u';
  35. $error = 'должно содержать только английские или русские буквы, символ пробела и дефис.';
  36. break;
  37. case 'password':
  38. $match = '/^(?=.*[a-zA-Z]|\d)(?=.*[a-zA-Z]|\W+)(?!.*\s).*$/';
  39. $error = 'может состоять из английских букв, цифр и спецсимволов. Запрещено использовать только цифры.';
  40. break;
  41. case 'password-hard':
  42. $match = '/^(?=^.*$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/';
  43. $error = 'должно содержать как минимум одну цифру, одну заглавную и одну строчную букву английского алфавита и один спецсимвол.';
  44. break;
  45. case 'int':
  46. $match = '/^([1-9][0-9]*)$/';
  47. $error = 'должно быть целым числом.';
  48. break;
  49. case 'float':
  50. $match = '/\-?\d+(\.\d{0,})?/';
  51. $error = 'должно быть дробным числом.';
  52. break;
  53. case 'date':
  54. $match = '/^(19|20)\d\d-((0[1-9]|1[012])-(0[1-9]|[12]\d)|(0[13-9]|1[012])-30|(0[13578]|1[02])-31)$/';
  55. $error = 'должно содержать дату в формате YYYY-MM-DD.';
  56. break;
  57. case 'time':
  58. $match = '/^([0-1]\d|2[0-3])(:[0-5]\d){2}$/';
  59. $error = 'должно содержать время в формате HH:MM:SS';
  60. break;
  61. case 'email':
  62. $match = '/^[-\w.]+@([A-z0-9][-A-z0-9]+\.)+[A-z]{2,4}$/';
  63. $error = 'должно содержать корректный почтовый ящик.';
  64. break;
  65. case 'words':
  66. $match = '/^([а-яА-ЯёЁa-zA-Z0-9\s]*)$/u';
  67. $error = 'должно содержать слова без знаков препинания и цифр.';
  68. break;
  69. case 'uuid':
  70. $match = '/^[0-9A-Fa-f]{8}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{12}$/';
  71. $error = 'должно содержать корректный UUID.';
  72. break;
  73. case 'mac':
  74. $match = '/^([0-9a-fA-F]{2}([:-]|$)){6}$|([0-9a-fA-F]{4}([.]|$)){3}$/';
  75. $error = 'должно содержать корректный MAC-адрес.';
  76. break;
  77. case 'phone':
  78. $match = '/^[\+]\d{1,3}[\(]\d{3}[\)]\d{3}[\-]\d{2}[\-]\d{2}$/';
  79. $error = 'должно содержать номер в формате +9(999)999-99-99';
  80. break;
  81. case 'color':
  82. $match = '/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/';
  83. $error = 'должно содержать цвет в HEX-формате (#ccc, #f5f5f5)';
  84. break;
  85. case 'ipv4':
  86. $match = '/^((^|\.)((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]?\d))){4}$/';
  87. $error = 'должно содержать корректный IPv4-адрес (255.255.255.255).';
  88. break;
  89. case 'ipv6':
  90. $amtch = '/^((^|:)([0-9a-fA-F]{0,4})){1,8}$/';
  91. $error = 'должно содержать корректный IPv6-адрес (2001:db8:0:0:0:ff00:42:8329).';
  92. break;
» Описание: PHP-класс для проверки корректности введенных данных.

Небольшой пример, проверяющий элементы $_POST:

$form = new FormCheck($_POST);
$form
->check('Логин','login')->type('login')->min(3)->max(50)
->check('Пароль','password')->type('password')->min(3)->max(50)
->check('Повтор пароля','password2')->equal('password')
->check('Почтовый ящик','email')->type('mail')->max(100)
->check('Имя','name')->type('name')->min(2)->max(50)
->check('Фамилия','surname')->type('name')->min(2)->max(50)
->check('Отчество','lastname')->type('name')->min(2)->max(50)
->check('Дополнительное поле','test')->custom(function($self,$value){
if($value == '111') $self->add_error('равно 111');
});
print_r($form->get_errors()) ;
Результат:

[
'login' => [
0 => 'Поле "Логин" должно содержать только английские буквы, цифры и символ нижнего подчеркивания.',
1 => 'Поле "Логин" не должно быть короче 3 символов.'
],
'password' => [
0 => 'Поле "Пароль" содержит недопустимые символы.'
],
'password2' => [
0 => 'Поле "Повтор пароля" не совпадает с полем "Пароль"'
],
'email' => [
0 => 'Поле "Почтовый ящик" содержит недопустимые символы.'
],
'name' => [
0 => 'Поле "Имя" должно содержать только английские или русские буквы, символ пробела и дефис.'
],
'surname' => [
0 => 'Поле "Фамилия" должно содержать только английские или русские буквы, символ пробела и дефис.'
],
'test' => [
0 => 'Поле "Дополнительное поле" равно 111'
]
]
Работа с классом

Создание экземпляра класса

$form = new FormCheck($_POST)
Массив $_POST будет помещен в $form->input для дальнейшей работы с ним.

Выбор элемента

$form->check('Пароль','password')
Выбор элемента массива $form->input с ключом password. Значение первого аргумента (Пароль) используется для вывода ошибок.

Регулярные выражения

$form->type('password')
Проверка по распространенным регулярным выражениям.

Примечание: список всех доступных регулярных выражений можно посмотреть здесь

$form->reg('/^[1-9]{2}$/')
Проверка текущего элемента на соответствие заданному регулярному выражению.

Проверка длины

Проверка текущего элемента на соответствие введенному регулярному выражению.

$form->min(5)
Проверка текущего элемента на минимальную длину.

$form->max(50)
Проверка текущего элемента на максимальную длину.

Эквивалентность

$form->equal('Повторите пароль','password2')
Проверка на идентичность текущего элемнта и элемента с ключом password2. Значение первого аргумента (Повторите пароль) используется для вывода ошибок.

Пользовательские проверки

$form->custom(function($self,$value){
if($value == '111') $self->add_error('равно 111');
})
В первый аргумент ($self) передается экземпляр класса, во второй ($value) - значение текущего элемента.

В данном случае будет добавлена ошибка, если значение текущего элемента будет равно 111.

Добавление ошибок

$form->add_error('некорректно')
Добавление ошибки у текущего поля. Перед ним будет дописано название поля, то есть писать его вручную не нужно.

В данном случае сообщение об ошибке будет таким:

Поле "Пароль" некорректно
Вывод ошибок

$form->get_errors()
$form->get_errors(true)
Функция возвращает массив ошибок. В первом случае функция вернет массив, в котором для каждого элемента будет свой массив ошибок. Во втором - все ошибки будут в одном массиве.

Пример работы $form->get_errors():

[
'login' => [
0 => 'Поле "Логин" должно содержать только английские буквы, цифры и символ нижнего подчеркивания.',
1 => 'Поле "Логин" не должно быть короче 3 символов.'
],
'password' => [
0 => 'Поле "Пароль" содержит недопустимые символы.'
],
'password2' => [
0 => 'Поле "Повтор пароля" не совпадает с полем "Пароль"'
],
'email' => [
0 => 'Поле "Почтовый ящик" содержит недопустимые символы.'
],
'name' => [
0 => 'Поле "Имя" должно содержать только английские или русские буквы, символ пробела и дефис.'
],
'surname' => [
0 => 'Поле "Фамилия" должно содержать только английские или русские буквы, симво
» Время добавления: 21 Июля 2016 в 00:34
» Посмотров: 1858
» textarea
» Рейтинг: [+1 | -0]
Комментарии [0]
Онлайн: 4
Реклама