如何在使用自定义表单前端进行验证后显示错误?

时间:2014-03-17 作者:bestprogrammerintheworld

我正在努力理解如何在前端(服务器端)实现一个合适的错误处理程序。代码是用函数编写的。特定主题中的php(如果这很重要的话)。在下方,一个名为Studior的自定义帖子类型在提交时创建。

$pupil = new Pupil();
add_shortcode(\'wppb-register\', array($pupil, \'frontEndRegistration\'));

//Check if visitor is trying to save a new pupil
$pupil->checkFrontEndRegistration();
在学生课堂上,我展示(返回)此内容(形式):

//Show public register-form
public function frontEndRegistration($atts, $content="", $errors = null) {   
     $class_errors = array();

    if (is_array($errors) && !empty($errors)) {

        foreach($errors as $key=>$err) {
            if ($err === true) {
                $class_errors[$key] = \' error\';
            }
        }           
    }
    $content .= \'
    <form id="adduser" name="adduser" method="post" action="">\' .
            \'<table class="form-table"><tbody><tr><td colspan="2">\'.$this->getRelatedCoursesPupil(null, array(\'args\' => array(\'fetchContent\' => \'returncontent\')))
    .  \'</td></tr>
    <tr>
        <th><label for="email">Förnamn*</label></th>
        <td><input name="first_name" id="first_name" value="" class="regular-text\' . $class_errors[\'first_name\'] . \'" type="text"></td>
    </tr>
    <tr>
        <th><label for="email">Efternamn*</label></th>
        <td><input name="last_name" id="last_name" value="" class="regular-text\' . $class_errors[\'last_name\'] . \'" type="text"></td>
    </tr>        
    <tr>
        <th><label for="age">Ålder*</label></th>
        <td><input name="age" id="age" value="" class="regular-text" type="text"></td>
    </tr>          <tr>
        <th><label for="email">E-post</label></th>
        <td><input name="email" id="email" value="" class="regular-text" type="text"></td>
    </tr>
    <tr>
        <th><label for="homephone">Telefon hem*</label></th>
        <td><input name="homephone" id="homephone" value="" class="regular-text" type="text"></td>
    </tr>

    <tr>
        <th><label for="cellphone">Mobiltelefon*</label></th>
        <td><input name="cellphone" id="cellphone" value="" class="regular-text" type="text"></td>
    </tr>
    <tr>
        <th><label for="adress">Adress</label></th>
        <td><input name="adress" id="adress" value="" class="regular-text" type="text"></td>
    </tr>
    <tr>
        <th><label for="postnr">Postnr</label></th>
        <td><input name="postnr" id="postnr" value="" class="regular-text" type="text"></td>
    </tr>
    <tr>
        <th><label for="ort">Ort</label></th>
        <td><input name="ort" id="ort" value="" class="regular-text" type="text"></td>
    </tr>
    <tr>
        <th><label for="description">Övrigt</label></th>
        <td><textarea name="description" id="description" class="description"></textarea></td>
    </tr>    
    <tr><td>
    <input type="hidden" name="action" value="newpupil-frontend" />
    \' . wp_nonce_field( \'newpupil-frontend\', \'newpupil-frontend\') . 

    \'</td></tr></tbody>
    </table>
    <input type="submit" value="OK" name="addusersub" id="addusersub" />
    </form>
    \';

    return $content;
}
在将其保存到数据库之前,我正在进行实际检查。

//Save pupil
public function checkFrontEndRegistration() {

        if( \'POST\' == $_SERVER[\'REQUEST_METHOD\'] && !empty( $_POST[\'action\'] ) &&  $_POST[\'action\'] == "newpupil-frontend") {

            //Required fields
            $errors = array();
            if (!isset($_POST[\'first_name\']) || strlen($_POST[\'first_name\']) == 0) {
                $errors[\'first_name\'] = true;
            }
            if (!isset($_POST[\'last_name\']) || strlen($_POST[\'last_name\']) == 0) {
                $errors[\'last_name\'] = true;
            }
            if (!isset($_POST[\'age\']) || strlen($_POST[\'age\'] == 0)) {
                $errors[\'age\'] = true;
            }         
            if (!isset($_POST[\'homephone\']) || strlen($_POST[\'homephone\']) == 0) {
                $errors[\'homephone\'] = true;
            } 
            if (!isset($_POST[\'cellphone\']) || strlen($_POST[\'cellphone\']) == 0) {
                 $errors[\'cellphone\'] = true;
            }           

            //Add new pupil-cpt into post-table when there are no errors
            if (empty($errors)) {
                //Remove hook temporarily
                remove_action( \'save_post\' , \'postsubmitted\');

                $pupil = array(
                    \'post_title\'    => \'unregistered\',
                    \'post_status\'   => \'private\',           // Choose: publish, preview, future, draft, etc.
                    \'post_type\' => \'pupil\',
                    \'post_author\' => 5500                   
                );
                //save the new post and return its ID
                $post_id = wp_insert_post($pupil); 

                //Save everything relevant for this new pupil
                saveform_db($post_id, $_POST, true);        //True says that it\'s frontend-saving

                //Rehook temporarily removed hook
                add_action( \'save_post\' , \'postsubmitted\');
            }
            else {
                throw new Exception(\'Pupils must be entered\');
                //$this->frontEndRegistration(\'\', \'\', $errors);
            }

        }

    }
它工作得很好,但我不知道当用户没有键入必填字段时如何显示错误。

而不是throw new Exception(Pupils must be entered); 我想展示同样的frontendRegistrationform() 但在必填字段中没有值时设置的错误。

我想我可以使用会话,但有没有更好的方法?

1 个回复
最合适的回答,由SO网友:Eric Holmes 整理而成

这是一个非常基本的解决方案。首先,我假设您没有保存数据/表单,只是返回到同一页。。在您的$formContent 你会这样做的。

<?php
$formContent = \'
    ....
    <tr>
        <th><label for="email">Förnamn*</label></th>
        <td><input name="first_name" id="first_name" value="" class="regular-text\' . $class_errors[\'first_name\'] . \'" type="text">\'
    . ( array_key_exists( \'first_name\', $class_errors ) ? "<br/>You must enter your first name." : "" ) . \'</td>
    </tr>";
如果您想访问表单本身上的错误,我个人建议您通过JavaScript进行错误检查。这样,您实际上可以阻止页面提交,而不是提交、取消和重定向回页面。使用jQuery,它将类似于:

$(\'form\').submit(function(event){
    var $form = $(this);

    // if any empty fields with the required class are found
    if ($form.find(\'input.required:empty\').length) {
        event.preventDefault(); // cancel form submission
        $form.find(\'input.required:empty\').after(\'<p class="error">This field is required\');
    }
});
显然,您可以通过读取附加到该输入的标签,或对每个字段进行单独检查来定制每个字段的消息。您还可以在这里进行一些自定义验证,如电话号码验证、电子邮件等。

这是我喜欢的方法。

对于PHP方面,您应该能够将错误类存储在类变量或全局变量上。自post.php 页面指向自身,在表单提交检查和重新呈现页面之间没有重定向。您应该能够将错误存储在类变量中,并在两个函数中使用它。

非常高的级别:

class myFormStuff {
    protected $error_classes;

    // happens first, on init most likely
    function checkFrontEndRegistration(){
        $this->error_classes[\'first_name\'] = "Dude, where\'s your name at?";
    }

    // Happens way later in the page reload, when rendering the form
    function frontEndRegistration() {

        if ( array_key_exists( \'first_name\', $this->error_classes ) ) {
            echo \'<p class="error">\' . $this->error_classes[\'first_name\'] . \'</p>\';
        }
    }
}

结束

相关推荐