[FP] Practice Validation on Fuelphp - Làm việc với Validation trong Fuelphp

Post Reply
tthlan
Quản trị viên
Posts: 65
Joined: Tue Aug 23, 2016 8:13 am

[FP] Practice Validation on Fuelphp - Làm việc với Validation trong Fuelphp

Post by tthlan » Fri Aug 19, 2016 4:08 am

Simple Validation - Các kiểm tra đơn giản cho input tham khảo tại http://fuelphp.com/docs/classes/validation/validation.htm

* khai báo sử dụng Class Validation

Code: Select all

$val =  \Validation::forge('user-form'); //user-form trùng với <form name="user-form"


* khai báo validation rule ứng với từng control
** add('tên_control_input','label hiển thị cho control')
** add_rule('tên_validation_rule', các options đi kèm ứng với validtion_rule đó')
** có nhiều validation rule: required, required_with, match_value, match_pattern, match_field, match_collection, min_length, max_length, exact_length, valid_email, valid_emails, valid_url, valid_ip, numeric_min, numeric_max, numeric_between, valid_string
tham khảo tại http://fuelphp.com/docs/classes/validation/validation.html#/rules

Code: Select all

$val->add('re-password', 'パスワード確認')->add_rule('match_field','password')->add_rule('min_length',6);
$val->add('password', 'パスワード')->add_rule('match_field','re-password')->add_rule('min_length',6);


* khi data post back server các data của các controls sẽ được kiểm tra thông qua run() và trả về kết quả true / false

Code: Select all

if (Input::post())
{
   $val = \Validation::forge('user-form');
   $val->add('re-password', 'パスワード確認')->add_rule('match_field','password')->add_rule('min_length',6);
   $val->add('password', 'パスワード')->add_rule('match_field','re-password')->add_rule('min_length',6);
   if ($val->run())
   {
      /* Nếu các validation đều thỏa thì các code xử lý ở đây sẽ chạy */
   }
   else
   {
      /* Nếu validation nào fail thì các code xử lý ở đây sẽ chạy */
      // Gán lỗi vào biến để hiện thị trên view
      $data['errors'] = implode('<br>', $val->error_message()); // error_message : các thông báo lỗi của Validation Rule khi fail
   }
   
   // Gọi view trả về thông báo lỗi nếu có
   $this->display($data,'path/file_view');
}   



* Khi dùng mặc định thông báo của Validation
các error_message xuất ra có phần công thức hóa (:label, :param:1) đặt thù ứng với từ rule được cài đặc sẵn trong fuel\core\lang\en\validation.php
ví dụ:
'max_length' => :label may not contain at least :param:1 characters

$val->add('ctrUser','User name') ->:add_rule('min_length',6) ; // Phải nhập User name từ 6 ký tự trở lên
:label là "User name"
:parm:1 giá trị 6
Khi User name nhập dưới 6 ký tự thì thông báo sẽ là 'User name may not contain at least 6 characters'

$val->add('ctrProductID','ProductCode') ->:add_rule('min_length',6) ; // Phải nhập Product ID từ 6 ký tự trở lên
Khi User name nhập dưới 6 ký tự thì thông báo sẽ là 'Product ID may not contain at least 6 characters'

Phần tiếp theo sau ... là để có thể xử lý linh động hơn message validation hay tự tạo một validation rule riêng - ta phải làm sao.

tthlan
Quản trị viên
Posts: 65
Joined: Tue Aug 23, 2016 8:13 am

[FP] Practice Validation on Fuelphp - Làm việc với Validation trong Fuelphp (tiếp theo)

Post by tthlan » Fri Aug 19, 2016 4:28 am

[*] Vẫn dùng các validation của Fuelphp nhưng sẽ xuất linh động các message hơn là dùng mấy message công thức hóa, sẽ không phù hợp nếu xuất thông báo ra nhiều ngôn ngữ với cách cắt ráp cấu trúc như vậy, các ngữ pháp đâu giống nhau - Và khi muốn xuất thông báo khác đi thông báo mặc định của Fuelphp mà không phải sử core, thì giải pháp tự đúc kết và đã ứng dụng thực tế như sau.

[*] Thêm vào sử lý khi $val->run() fail như sau
- khi validation rules fail, các Error sẽ lần lượt được tạo và đẩy validation result, để được các error đó, $val->error() sẽ trả về mảng Error objects
- quét vòng lặp trên các từng object Error để biết được lỗi của control ($field) nào và thông đi kèm là lỗi của trường hợp nào - ($error->rule), ta xuất ra thông báo chính xác cho từng trường hợp lỗi của control input.

Code: Select all

if ($val->run())
{
 /* xử lý khi validation đều pass */
}
else
{            
   $data['errors'] = '';
   foreach ($val->error() as $field => $error)
   {
      $v_rule = $error->rule;
      $v_field= $field;
      
      switch ($v_field)
      {
         case "username":
         {
            switch ($v_rule)
            {
               case "required":                           
                  $data['errors'] .= '<br>' . 'メールアドレスを入力してください。'; // Please enter user name <=  This message is for when we use Email for login.
               break;
               case "valid_email":                           
                  $data['errors'] .= '<br>' . 'メールアドレスが正しくありません。'; // E-mail address is incorrect.
               break;
            }
            break;
         }
         case "password":
         {
            switch ($v_rule)
            {
               case "required":                           
                  $data['errors'] .= '<br>' . 'パスワードを入力してください。'; // Please enter password
               break;
               case "min_length":                           
                  $data['errors'] .= '<br>' . 'メールアドレスもしくはパスワードが間違っています。'; //<= Check Maximum as well and use same error message.
               break;
            }
            break;
         }
      }
      $data['errors'] = ltrim($data['errors'],'<br>');
         //echo $error->get_message();
         // The field Title is required and must contain a value.
   }
            
      //$data['errors'] = implode('<br>', $val->error_message());
      //$val->set_message("required",null);
   }

}

tthlan
Quản trị viên
Posts: 65
Joined: Tue Aug 23, 2016 8:13 am

Custom Validation Rule in Fuelphp

Post by tthlan » Fri Aug 19, 2016 4:48 am

Tùy biến dựng một validation rule riêng biệt để xử lý kiểm tra data đầu vào trên fuelphp
tham khảo thêm tại http://fuelphp.com/docs/classes/validation/validation.html#/extending_validation

  • Tạo một MyAppRules.php trong thư mục \fuel\app\classes
    chú ý khi khai báo validaton rule phải đúng cấu trúc _validation_tênRule

    Code: Select all

    <?php
    class MyAppRules
    {
       /* EmailUsed Custom Rule Validation
       * $val : value of control add this rule
       * $option : value of next parameter of the control add this rule
       * $option['obj'] : 0|Bang A; 1|Bang B
       * example :
       * $oncontroler =  \Validation::forge('user-form');
       * $oncontroler->add_callable('WasteOilRules');            
       * $oncontroler->add_rule('EmailUsed',array('obj'=>0,'id'=>null));
       */
       public static function _validation_EmailUsed($val, $options)
       {
          // set message E-mail [admin@example.com] is already in use
          Validation::active()->set_message('EmailUsed', 'The email :value is already in use');
          $obj = $options['obj'];
          
          switch ($obj)
          {         
             case 0: // Bang A
             {
                $data = \Model_Bang_A::find(
                   'all', array(
                      'where' => array(
                         array('username' => $val, array('user_status', '<>', 2)),
                      )
                   )
                );            
                return (count($data) == 0);
                break;
             }
             case 1: // Bang B
             {
                $data = \Model_Bang_B::find(
                   'all', array(
                      'where' => array(
                         array('username' => $val, array('user_status', '<>', 2)),
                      )
                   )
                );            
                return (count($data) == 0);
                break;
             }
          }
       }
    }
    ?>

  • Dùng custom validation rule trên xử lý submit post data
    $val->add_callable('MyAppRules'); // Custom Validation Class - app/class/MyAppRules.php -will be called
    $val->add('email', 'Eメール')->add_rule('valid_email')->add_rule('EmailUsed',array('obj'=>0));

    Code: Select all

    if (Input::post())
    {         
       $val =  \Validation::forge('user-form');
       $val->add_callable('MyAppRules'); // Custom Validation Class - app/class/MyAppRules.php -will be called
       $val->add('email', 'Eメール')->add_rule('valid_email')->add_rule('EmailUsed',array('obj'=>0));

       if ($val->run())
       {
       }
       else
       {
          $data['errors'] = implode('<br>', $val->error_message()); // custom validate rule message sẽ được gọi khi validation fail
          $data['data'] = Input::post();
          $this->display($data,'path/users_view');
       }
    }

Post Reply