Валидация комментариев

Комментарии: 25  Просмотры: 11 087

Данный урок будет практическим. Мы применим полученные знания и наконец добавим проверку пользовательских комментариев на наш блог. Обработка данных, полученных от формы в нашем контроллере Controller_Comments, будет следующей:

if($_POST)
{
    $_POST = Arr::map('trim', $_POST);			
 
    $post = Validation::factory($_POST);
    $post -> rule('user', 'not_empty')  
          -> rule('user', 'min_length', array(':value', 2))
          -> rule('user', 'max_length', array(':value', 20))
          -> rule('email', 'email')
          -> rule('message', 'not_empty')
          -> rule('message', 'max_length', array(':value', 100));	    		  
 
    if($post -> check())
    {
        Model::factory('Comment')
          ->create_comment($article_id, $_POST['user'], $_POST['message']);
 
        $uri = Request::detect_uri();
        Request::initial()->redirect($uri);				
 
    }
    else
        $errors = $post -> errors('validation');
}

Все должно быть знакомо по предыдущим урокам и понятно. В двух словах наши действия: в случае, если массив $_POST не пустой, производим очистку всех его элементов от пробелов, если таковые имеются в начале и в конце. Это необходимая манипуляция, чтобы уберечься от ввода данных, которые состоят только из пробелов, так как правило not_empty на них не сработает, ведь пробел — это тоже символ. Далее создаем объект класса валидации и передаем ему наш массив на проверку. Для поля user это будет проверка на пустоту и проверки на минимальную (минимум 2 символа) и максимальную (максимум 20 символов) длину. Казалось бы проверка на пустоту тут не требуется, у нас же есть проверка на минимальную длину. Но, как я уже говорил, если поле пустое, оно будет обработано только двумя правилами — not_empty и matches. Об этом нужно всегда помнить. Поле email добавлено просто для примера. Оно может быть пустым, т.е. пользователю необязательно его заполнять. Проверяется лишь корректность написания email-адреса (если пользователь все же решил что-то написать на свою беду). Ну и последним мы проверяем поле message также на пустоту и на максимальную длину в 100 символов. После этого используется метод check, чтобы узнать, успешно ли прошла валидация.
Если все хорошо, записываем данные в базу данных (не знакомые с работой с базами данных в Кохане могут эту строчку пока проигнорировать). Далее получаем текущий URI и редиректимся на него. Делается это для того, чтобы пользователь не смог отправить повторно эти же данные нажав «Обновить» или «F5″.
Если же все плохо и форма заполнена с ошибками, сохраняем эти ошибки в массив $errors. Касаемо перевода текстов ошибок — в прошлых уроках мы также это все рассматривали. Напомню, что для русификации нужно создать файл ru.php внутри папки application/i18n/ru (его содержимое есть в этом уроке). Ну и не забудьте в bootstrap.php поменять язык.
Наконец переходим к нашему представлению, то есть к содержимому файла show.php из папки application/views/comments. Я приведу только код самой формы. У меня он такой:

<form action="" method="post">
  <table width="500" border="0" cellspacing="5" cellpadding="5">
    <tr>
      <td>
      Ваше имя: <br />
      <input name="user" type="text" value="<?php echo HTML::chars(Arr::get($_POST, 'user')); ?>" />
      </td>
      <td>
      <strong style="color:#f00;"><?php if(isset($errors['user'])) echo $errors['user']; ?></strong>
      </td>
    </tr>
    <tr>
      <td>
      Ваш e-mail: <br />
      <input name="email" type="text" value="<?php echo HTML::chars(Arr::get($_POST, 'email')); ?>" />
      </td>
      <td>
      <strong style="color:#f00;"><?php if(isset($errors['email'])) echo $errors['email']; ?></strong>
      </td>
    </tr>
    <tr>
      <td>
      Сообщение: <br />
     <textarea name="message" cols="25" rows="5"><?php echo HTML::chars(Arr::get($_POST, 'message')); ?>
</textarea>
      </td>
      <td valign="middle">
        <strong style="color:#f00;"><?php if(isset($errors['message'])) echo $errors['message']; ?></strong>
      </td>
    </tr>
  </table>
  <input name="send" type="submit" value="Отправить" />
</form>

Хорошим тоном считается не лишать пользователя набранной информации и не очищать форму, если какие-то поля он заполнил неверно. Поэтому мы пытаемся получить данные из массива $_POST и выводим их. Естественно, чтобы избежать XSS, эти поля предварительно обрабатываются методом chars хелпера HTML. Рядом с полями происходит вывод ошибок. Можно выводить все ошибки в цикле внизу формы, но рядышком как-то нагляднее, сразу видно, какая ошибка к какому полю относится. Перед выводом проверяем, существует ли такой элемент массива.
В итоге у вас должно получится что-то подобное:
Валидация формы комментариев
Вот и все и до следующего урока.

<< Назад | Обсудить на форуме


К записи оставлено 25 коммент.

Так не работает, надо сверху ещё добавить
$content = View::factory(‘/comments/show’)
->bind(‘comments’, $comments)
->bind(‘errors’, $errors);
иначе массив с ошибками не передаётся

Угу. Причем у меня в контроллере именно так и написано буква в букву :)
Да и вот тут
http://kohanaframework.su/database/query_builder_practice
тоже практически правильно (только без ошибок, потому что их там еще нет).
Уже сам начал сбиваться в порядке уроков. А все почему…потому что пишешь по-порядку, а все начинают просить, а напишите про базы данных, а напишите про орм. Идешь навстречу и получается вот такая вот беда :(

…обрабатываются методом chars хелпера HTML…
который, если мы ничего не дописывали, всего лишь, вызывает htmlspecialchars

Угу. А если посмотреть, то можно найти еще методы в Кохане, которые состоят из одной-трех строчек.

Доброго времени суток. Отличные уроки, вы с морковиным вообще молодцы.
А теперь по делу. Сдела все по вашему уроку. единственный ньанс правила писала сама в файл папки message. После проверки на уникальность вылетает оштибка коханы ReflectionException [ 0 ]: Function unique() does not exist.
А на не пустоту строки обнавляется страница, никаких ошибок не вылетает в общем ничего не происходит.

листинг контроллера:

class Controller_Newcustomer extends Controller_Template {
 
	public $template = 'basecus';
 
	public function action_index()
	{		
		/* if($this-&gt;request-&gt;is_initial())
            Request::initial()-&gt;redirect(URL::site('/newcustomer'));
 		*/
 
        $customer_id = $this-&gt;request-&gt;param('id');
 
        $content = View::factory('newcustomerview')
                    -&gt;bind('customers', $customers);
 
 
        if($_POST)
	{
		$_POST = Arr::map('trim', $_POST);	
 
	$post = Validation::factory($_POST);
	$post -&gt; rule('fio', 'not_empty')
	-&gt; rule('fio', 'unique');		
 
 
    if($post -&gt; check())
	{
	 Model::factory('Newcustomer')-&gt;create_customer($customer_id, 
$_POST['fio'], $_POST['adres'], $_POST['tels'], $_POST['info']);
 
        $uri = Request::detect_uri('/newcustomer');
        Request::initial()-&gt;redirect($uri);				
 
		}
    else
       { 
	   $errors = $post -&gt; errors('customer');
	   }
 
	}
        $customers = Model::factory('Newcustomer')-&gt;get_customer($customer_id);
        $this-&gt;template-&gt;content = $content;
    }
 
}

Ошибку выдает, потому что не находит функцию unique. Вы ее создавали хоть ?

эм… ну в общем как я поняла этот трезок кода:
$post -> rule(‘fio’, ‘not_empty’)
-> rule(‘fio’, ‘unique’);
это правилакотрые прописаны в файле вывода ошибок валидации. а в файле с ошибками написано: return array(
‘fio’ => array(
‘not_empty’ => ‘Вы не ввели имя заказчика’,
‘unique’ => ‘Такой заказчик уже есть’,

),
);

Нет, это специальные методы, которые уже прописаны в кохане и которые рассмотрены здесь
http://kohanaframework.su/advanced/provided_rules_p1
и здесь
http://kohanaframework.su/advanced/provided_rules_p2

Стандартного правила unique в кохане нет. Его нужно создать самостоятельно. Про создание своих правил написано здесь
http://kohanaframework.su/advanced/valid_methods
на примере проверки возраста.

Спасибо огромное) Буду разбираться.

стоп. unique это понятно. а почему тогда не срабатывает на не пустоту? :/

Срабатывает наверное, ведь в базу же ничего не добавляется ? Вывода ошибки просто нет. Я же не знаю, что у вас в представлении.

ну так-то тогда да) не вносит.
в представлении вроде все как у Вас:
ФИО:

пысы. простите мою глупость. у меня 2 проблеммы — невнимательность и «чайничность»

обрезало…
ФИО:



Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.