扩展错误消息变量


Extending error message variable

现在我只有一个错误消息变量,它从创建验证错误的表单输入字段中提取项目名称。因此,如果我在'firstname'输入字段中只输入了一个字母,那么错误信息应该像这样显示…

firstname必须至少为2个字符。

这很好,但我想创建新的变量,这样我就可以输入像

这样的东西
$firstname_validate_error

在firstname输入字段旁边,如果该输入字段抛出错误,则错误将出现在该字段旁边。

是否有一种方法可以做到这一点与我的代码没有使这是一个巨大的任务?我不确定如何用我的validate类构造一个变量来做到这一点。

我得到我的验证错误从这个:

} 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>

您可以使用一些神奇的函数,如:

 $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);
    }