我正在努力理解如何在前端(服务器端)实现一个合适的错误处理程序。代码是用函数编写的。特定主题中的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()
但在必填字段中没有值时设置的错误。
我想我可以使用会话,但有没有更好的方法?
最合适的回答,由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>\';
}
}
}