<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"  href="/xslt/final.xslt"?><html>
  <head>
    <title>Проверка форм c Validation library в CodeIgniter</title>
    <meta name="css" content=""/>
    <meta name="js" content=""/>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta name="id" content="13"/>
    <link rel="alternate" type="application/rss+xml" title="RSS" href="/rss.xml"/>
  </head>
  <body>
    <div class="main">
      <div class="wrap">
        <div class="L">
          <h1><a href="/">..</a> / Проверка форм c Validation library в CodeIgniter</h1>
          <ol class="tags big"/>
          <div class="myContent"><p>Для валидации содержимого форм в CI есть класс  <a href="#" title="codeigniter.com/user_guide/libraries/validation.html" rel="nofollow" class="external">validation</a>  Работает он достаточно просто. Для полей подлежащих проверке устанавливаются правила.  После отправки данных формы на сервер  они проходят проверку по этим правилам, Если обнаруживается нарушение правил, формируется сообщение об ошибке с перечнем нарушений. Сообщение вместе с данными отправляется обратно для исправления пользователем ошибок.</p>
<p>Набор проверочных правил в CI достаточно широкий. Для проверок возможно использование регулярных выражений.    Там где регулярное выражение не спасает, можно ввести специальную функцию - обработчик поля. Дополнительно к этому для полей создаются правила обработки. Например - удаление тегов, концевых пробелов и т.п. Весь перечень правил можно найти в руководстве <a href="#" title="codeigniter.com/user_guide/libraries/validation.html" rel="nofollow" class="external">CI</a><br/>
<br/>
Здесь и далее для примера берем заготовку блока из <a href="#" title="erum.ru/aticles/12" rel="nofollow" class="external">Прелюдии</a></p>
<h2>1. Проверка обязательных полей</h2>
<p>Для примера будем проверять обязательность одного единственного поля author в методе контроллера save (S:\system\application\controllers\blog.php): <br/>
<br/>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">function save()
  {
      //подгрузка библиотеки валидации данных
      $this-&gt;          load-&gt;          library('validation');

      //описание правила проверки поля author
      $rules['author']    = "required";
      $this-&gt;          validation-&gt;          set_rules($rules);

      // название поля author для текста аварийного сообщения
      // в русском варианте $fields['author']    = 'Афтар';
      $fields['author']    = 'The Author';
      $this-&gt;          validation-&gt;          set_fields($fields);

      if (!$this-&gt;          validation-&gt;          run())  //  вызов проверки данных
      {
        //  проверка данных не прошла.
        $data=$_POST;
        //  вытаскиваем сообщение об ошибке из валидаторв
        $data['err']=$this-&gt;          validation-&gt;          error_string;
        // выводим данные полученные в результате валидации
        $this-&gt;          parser-&gt;          parse('edit.php',$data);
        return;
      }

      // в случае прохождения проверки постим данные в БД
      $this-&gt;          mblog-&gt;          data=$_POST;
      $this-&gt;          mblog-&gt;          update();
      $this-&gt;          view();
  }</pre><!--/php--></td>
        </tr>
    </tbody>
</table>
<br/>
Пример можно уже запустить и он будет работать, но для отображения сообщения об ошибке необходимо доработать вьюер редактирования  (S:\system\application\views\edit.php)  добавив туда одну единственную строку: <br/>
&lt;div class="err"&gt;           {err}&lt;/div&gt;            <br/>
и метод  edit  контроллера (S:\system\application\controllers\blog.php), для того, чтобы обнулить сообщение обо ошибке в режиме редактирования до проверки: <br/>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">function edit()
{
   $data=$this-&gt;          mblog-&gt;          getOne($this-&gt;          uri-&gt;          segment(3));
   $data['err']='';
   $this-&gt;          parser-&gt;          parse('edit.php',$data);
}</pre><!--/php--></td>
        </tr>
    </tbody>
</table>
<br/>
<br/>
Теперь можно вызвать страницу редактирования одного из сообщений http://localhost:100/blog/edit/1  и попытаться сохранить форму c пустым полем "Author". Codeigniter выплюнет сообщение на английском языке. Руссификацию сообщений рассмотрем далее.</p>
<h2>2. Дополнительные проверки</h2>
<p>В п.1.  был рассмотрен пример, в котором проверялось только наличие поля. Как и в любой приличной библиотеке валидации количество всевозможных опций проверок в Codeigniter около десятка.  Т.е. банальная проверка на наличие обязательного поля: <br/>
$rules['author']    = "required";<br/>
Может модифицироваться до <br/>
$rules['author']    = "<strong style="font-weight: normal;">alpha</strong>|min_length[6]|max_length[16]";  <br/>
где кроме необоходимости наличие поля могут быть проверены: <br/>
- наличие только букв: <strong style="font-weight: normal;">alpha</strong><br/>
- минимальная и максимальная  длина: (min_length[6]  max_length[16]<br/>
и т.д. Конечно же есть доп.проверка валидности адресов  e-mail и url Описание всех возможностей  можно <a href="#" title="codeigniter.com/user_guide/libraries/validation.html" rel="nofollow" class="external">найти в мануале</a>  <br/>
И конечно ложка дегтя.<br/>
Вставить в правило регулярное выражение нельзя. Хотя предусмотрено выполнение сторонних функций. <br/>
Для примера дополним правило функцией проверки на наличие в подписи нецензурного слова:<br/>

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">$rules['author']    = "callback_fuck_check
alpha
min_length[6]
max_length[16]";
</pre><!--/php--></td>
        </tr>
    </tbody>
</table>
"callback_"  - обязательный префикс "fuck_check" - название пользовательской функции. Пример функции (размещаем ее в контроллере S:\system\application\controllers\blog.php):

<table class="code">
    <tbody>
        <tr>
            <td><!--php-->
            <pre class="brush: plain">function fuck_check($str)
{
  if ($str !== 'fuck') return TRUE; // проверка пройдена. возвращаем TRUE
   // проверка не пройдена. Устанавливаем собственное сообщение об ошибке:
  $this-&gt;          validation-&gt;          set_message('fuck_check', 'Fuck himself!');
  return FALSE;
}</pre><!--/php--></td>
        </tr>
    </tbody>
</table>
</p>
<h2>3. Cанобработка</h2>
<p>В учебном блоге, я отмечал что при записи данных я не позаботился о безопасности данных, отправляемых пользователем на сервер. Это означает что любой урод может вставить вместо подписи что-то типа: <br/>
&lt;img src="http://_голая_бритни_спирс_"&gt;           <br/>
или что еще хуже скрипт будет выполнять загрузку вируса. Ну и пр. Чтобы этого не произошло все данные из форм должны проходить предварительную обработку с целью очистки от потенциально опасных элементов.   Правила для обработки задаются так же как и  проверки: <br/>
$rules['author']    = "<strong style="font-weight: normal;">required|trim|</strong><span class="methodname">strip_tags</span>|<kbd>htmlspecialchars</kbd>"; <br/>
где <br/>
<strong style="font-weight: normal;">trim - устранение концевых пробелов,<br/>
</strong><span class="methodname">strip_tags</span> - устранение тегов<br/>
<kbd>htmlspecialchars</kbd> - замена кавычек, уголковых скобок и т.д.  на HTML-сущности. <br/>
Описание специфических опций Codeigniter  можно <a href="#" title="codeigniter.com/user_guide/libraries/validation.html" rel="nofollow" class="external">найти в мануале</a> При этом кроме них можно вставлять практически любые php-функии обработки строк.<br/>
И конечно ложка дегтя. <br/>
Обработка производится только после проверки на валидность.</p>
<h2>4. Резюме</h2>
<p>Несколько замечаний. В самом начале упоминалось о том, что мы как порядочные  будем использовать модель. Но в этом топике от MVC опять пришлось отойти для большей наглядности.  К сожалению, в Codeigniter  (в отличие от других фреймворков типа Symphony или CakePHP),  полноценная модель находится в зачаточном состоянии,   но как нужно правильно описывать данные можно посмотреть на примере <a href="#" title="codeigniter.com/wiki/SuperModel/" rel="nofollow" class="external">Supermodel</a>  Такая структура позволяет   создание классов автоматического построения форм, валидации их на клиенте ну и вообще, это красиво (с) .<br/>
Все что создано на этом шаге складываем в <a href="/doc/ci2.zip">архивную папку step1</a>.</p>
<h2>Между прочим</h2>
<p>По сравнению с возможностями VisualStudio более чем скромно, но все же лучше чем ничего.</p></div>
          <ol class="tags big">
            <li class="date">2007-09-03</li>
          </ol>
          <ol class="see">
            <li>
              <a href="#"><span>bassistance.de/jquery-plugins/jquery-plugin-validation/</span> - <b>jQuery plugin: ValidationjQuery plugin: Validation</b></a>
            </li>
          </ol>
          <ul class="comment">
            <li id="a157" title="a0">
              <a name="Wordwild" title="" rel="11.11.08"/>
              <div>Еще бы пару слов о Re-populating</div>
            </li>
            <li id="a177" title="a0">
              <a name="Satisfaction" title="-" rel="24.11.08"/>
              <div>Супер ! спасибо Автору за статьи, очень интересно. Теперь в серьез займусь написанием движков на этом MVC =)</div>
            </li>
            <li id="a560" title="a177">
              <a name="alex" title="google.com" rel="21.09.10"/>
              <div>зачем писать свои движки на фреймворке? Зачем вообще писать свои движки, если есть много уже написанных и отточенных???</div>
            </li>
            <li id="a561" title="a560">
              <a name="&#x418;&#x441;&#x430;&#x430;&#x43A; &#x422;&#x44B;&#x43D;&#x433;&#x44B;&#x43B;&#x447;&#x430;&#x432;" title="erum.ru" rel="21.09.10"/>
              <div>Не все можно свести к типовым задачам. А решение задач нетиповых требует знания API. И тут выясняется что для того чтобы изучить Битрикс или Drupal досконально требуется полгода-год, а для того чтобы быстро сделать то же самое из фреймворка требуется месяц. Но при этом движок заточенный под конкретную задачу будет эффективнее и легче чем гиперуниверсальные монстры.</div>
            </li>
          </ul>
        </div>
      </div>
      <div class="R">
        <a href="/" title="&#x41D;&#x430; &#x433;&#x43B;&#x430;&#x432;&#x43D;&#x443;&#x44E;"/>
      </div>
    </div>
    <div id="li"/>
  </body>
</html>

