在字段旁边显示Php表单错误

时间:2014-02-24 11:39:31

标签: php validation

我在论坛中查找了类似的问题,但找不到任何可以帮助我的东西。

我有验证表格条目的验证类。但它将它们显示在表格的顶部。我怎么能在字段旁边显示这些字段而不是表单的顶部?

Registration.php

    if(Input::exists()){
        $validate = new Validate();
        $validation = $validate->check($_POST, array(
            'fullName' => array(
                'required' => true,
                'min' => 4,
                'max' => 20
            ),
            'username' => array(
                'required' => true,
                'min' => 4,
                'max' => 20,
                'unique' => 'user'
            ),
            'email' => array(
                'required' => true,
                'unique' => 'user'
            ),
            'password' => array(
                'required' => true,
                'min' => 6
            ),
            'password_again' => array(
                'required' => true,
                'matches' => 'password'
            )
        ));

        if($validation->passed()){
            // Register User

            echo('Passed');

        } else {
            // Output Errors

            foreach($validation->errors() as $error){

                echo $error, '</br>';
            }
        }
    }

?>
<div class="registration">
    <h3> Register with WebA<font style="color: #c14a44;">ww</font>ards </h3>
    <p> Spare us few little seconds, and you'll be glad you did. </p>
    <form method="post" action="">
        <input type="text" id="fullName" value="<?php echo  escape(Input::get('fullName')); ?>" name="fullName" placeholder="Your Full name">
        <input type="text" id="username" value="<?php echo  escape(Input::get('username')); ?>" name="username" placeholder="Choose Username" autocomplete="off">
        <input type="email" id="email" value="<?php echo  escape(Input::get('email')); ?>" name="email" placeholder="Email address">
        <input type="password" id="password" name="password" placeholder="Password">
        <input type="password" id="password_again" name="password_again" placeholder="Comfirm password">
        <input id="gobutton" type="submit" value="Register">

    </form>

Validate.php

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 is required and value is empty add error
                    if($rule === 'required' && empty($value)){
                        $this->addError("{$item} is required");
                    } else if(!empty($value)) {
                        // DEFINE THE RULES FOR VALIDATION MIN, MAX
                        // USE SWITCH STATEMENT TO SWITCH BETWEEN THE RULES AND CHECK IF VALID
                        // Case for each of the rules defined on the form
                        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;

                        }
                    }
                }
            }

            if(empty($this->_errors)){
                $this->_passed = true;
            }

            return $this;
        }

3 个答案:

答案 0 :(得分:0)

如果没有看到更多代码我无法分辨(addError方法未包含在内),但您的验证类似乎没有一种简单的方法可以将错误与字段中的字段相关联响应(它只是一个字符串),所以需要做一些工作才能做到这一点。我建议将错误作为关联数组返回,其中键是字段的名称,值是要打印的错误消息,对于正确的字段,将其留空。然后,在您的注册文件中,您可以轻松地参考相关字段。

答案 1 :(得分:0)

您编写的代码可以将这些错误放在您想要的位置。

<?php

$errors = array();

if (!$something) {
    $errors['field'] = 'Message';
}

?>

<? if (isset($errors['field'])) : ?>
    <p class="error"><?php echo $errors['field']; ?></p>
<?php endif; ?>
<input type="text" name="field" ...>

答案 2 :(得分:0)

您必须在输出字段时迭代错误,检查与该字段相关的错误,并在输出输入后打印它们,而不是回显表单上方的所有错误。

如果您需要在每个字段中有多个验证错误,则错误数组应该是多维的。你应该有一个数组,每个字段名都有一个条目。

您还需要将字段作为数组才能实现此目的。

这样你可以做这样的事情(未经测试):

foreach ($field as $f) {
echo "<input type='{$f->type}' id='{$f->name}' value='{$f->value}' name='{$f->name}' placeholder='{$f->description}'>";
if (in_array($f->name, $errors)) {
echo "<span class='errors'>{$errors[$f->name]}</span>";
}
}

如果每个字段的错误条目是一个数组,则必须在回显错误之前迭代它。