2015-07-11 5 views
1

Теперь у меня есть только одна переменная сообщения об ошибке, которая вытаскивает имя элемента из поля ввода формы, которое создает ошибку проверки. Поэтому, если у меня была только одна буква, введенная в поле ввода «firstname», сообщение об ошибке должно появиться следующим образом:Расширение переменной сообщения об ошибке

имя должно быть не менее 2 символов.

Что хорошо, но я хочу, чтобы создать новые переменные, так что я могу поставить что-то вроде

$firstname_validate_error 

рядом с полем ввода Firstname и если это поле ввода бросает ошибку за ошибкой прийти рядом с этим полем.

Есть ли способ сделать это с кодом, который у меня есть, без огромной задачи? Я не уверен, как структурировать переменную, чтобы сделать это с моим классом проверки.

Я получаю мои ошибки проверки от этого:

} else { 
       foreach($validation->errors() as $error) { 
        $error; 
       } 

Есть ли способ, что я могу структурировать это, так что я могу поставить какое-то переменные ошибки рядом с каждым полем ввода в форме, если поле ввода бросает ошибку проверки, появляется сообщение об ошибке?

if(Input::exists()) { 
    if(Token::check(Input::get('token'))) { 

    if(Input::exists()) { 
     $validate = new Validate(); 
     $validation = $validate->check($_POST, array(
      'firstname' => array(
       'required' => true, 
       'min' => 2, 
       'max' => 50 
      ), 
      'lastname' => array(
       'required' => true, 
       'min' => 2, 
       'max' => 50 
      ), 
      'email' => array (
       'required' => true, 
       'min' => 2, 
       'max' => 50 
      ), 
      'phone_number' => array (
       'required' => true, 
       'min' => 7, 
       'max' => 15 
      ), 
      'username' => array(
       'required' => true, 
       'min' => 4, 
       'max' => 20, 
       'unique' => 'users' 
      ), 
      'password' => array(
       'required' => true, 
       'min' => 6 
      ), 
      'password_again' => array(
       'required' => true, 
       'matches' => 'password' 
      ) 

     )); 
     if($validation->passed()) { 
      $user = new User(); 

      $salt = Hash::salt(32); 

      try { 
       $user->create(array(
        'firstname' => Input::get('firstname'), 
        'lastname' => Input::get('lastname'), 
        'email' => Input::get('email'), 
        'phone_number' => Input::get('phone_number'), 
        'username' => Input::get('username'), 
        'password' => Hash::make(Input::get('password'), $salt), 
        'salt' => $salt, 
        'joined' => date('Y-m-d H:i:s'), 
        'group' => 1 
       )); 
       $success = "You have successfully created an account. We will notify you once the account has been approved. Then you will be able to login."; 
       echo $success; 
      } catch(Exception $e) { 
        die($e->getMessage()); 
       } 
      } else { 
       foreach($validation->errors() as $error) { 
        $error; 
       } 
      } 
     } 
    } 
} 

Мой класс проверки, относящийся к этому вопросу.

public function check($source, $items = array()) { 
    foreach($items as $item => $rules) { 
     foreach($rules as $rule => $rule_value) { 

      $value = trim($source[$item]); 
      $item = escape($item); 

      if($rule === 'required' && empty($value)) { 
       $this->addError("{$item} is required"); 
      } else if(!empty($value)) { 
       switch($rule) { 
        case 'min': 
         if(strlen($value) < $rule_value) { 
          $this->addError("{$item} must be a minimum of {$rule_value} characters."); 
         } 
        break; 
        case 'max': 
         if(strlen($value) > $rule_value) { 
          $this->addError("{$item} must be a maximum of {$rule_value} characters."); 
         } 
        break; 
        case 'matches': 
         if($value != $source[$rule_value]) { 
          $this->addError("{$rule_value} must match {$item}"); 
         } 
        break; 
        case 'unique': 
         $check = $this->_db->get($rule_value, array($item, '=', $value)); 
         if($check->count()) { 
          $this->addError("{$item} already exists."); 
         } 
        break; 

Моя форма, как это ..

<form action="" method="POST"> 
    <div class="field"> 
     <label for="firstname">First Name</label> 
     <input type="text" class="inputbar" name="firstname" value="<?php echo escape(Input::get('firstname')); ?>" required> 
    </div> 
    <div class="field"> 
     <label for="lastname">Last Name</label> 
     <input type="text" class="inputbar" name="lastname" value="<?php echo escape(Input::get('lastname')); ?>" required> 
    </div> 

ответ

0

Вы можете использовать некоторые магические функции, такие как:

$validate = new <classname of your validation class>; 
.... 
$validate->field_firstname(); 

, который, очевидно, не определен. firstname соответствует массиву определений полей в вашем классе проверки. Поймать что-то вроде

public function __call($key, $params = array(null)) 
    { 
     if (substr($key, 0, 6) == "field_") 
     { 
      // extract field name 
      $field = substr($key, 6); 

      // validate $field now: 
      // ... 

      return; 
     } 

     throw new Exception('Unknown method ' . $key); 

    } 
Смежные вопросы