Как показать ошибки после проверки с помощью пользовательского интерфейса формы?

Я изо всех сил пытаюсь понять, как я должен добиться достойного обработчика ошибок на frontend (serveride). Код написан в functions.php в определенной теме (если это имеет значение). Внизу ниже пользовательский тип сообщения, названный учеником, создается после отправки.

$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() но с ошибками, которые установлены, когда в обязательных полях нет значения.

Думаю, я бы использовал сеансы, но есть ли лучший способ?

Solutions Collecting From Web of "Как показать ошибки после проверки с помощью пользовательского интерфейса формы?"

Это довольно простое решение. Сначала я предполагаю, что вы не сохраняете данные / форму и просто возвращаетесь на одну и ту же страницу. В вашем $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 указывает на себя, нет никакой переадресации между проверкой 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>'; } } }