我发现CodeIgniter表单验证使用load->view方法显示错误消息,如果使用"重定向",将丢失字段错误消息。
目前我使用一个功能显示表单页面,另一个功能处理表单帖子。
类用户扩展CI_Controller{函数__construct(){父级::__construct();}公共函数sign_up(){$this->load->view('users/sign_up');}公共函数do_sign_up(){$this->form_validation->set_rules('user_login','user Name','trim|required|is_unique[users.login]');$this->form_validation->set_rules('user_email','email','trim|required|valid_email|is_unique[users.email]');if($this->form_validation->run()==FALSE){$this->load->view('users/sign_up');}其他{//将发布用户数据保存到用户表redirect_to("users/sign_in");}
当表单验证失败时,浏览器中的url将更改为"/users/do_sign_up",我希望在sign_up页面中保持相同的url。
表单验证失败时使用重定向("users/sign_up")方法将保持相同的url,但验证错误消息将丢失。
在Rails中,我不能使用路由进行如下配置:
get"users/sign_up"=>"users#注册"post"users/sign_up"=>"users#do_signup"
imho没有必要检查请求方法,因为如果用户"获取"到您想要显示注册视图的页面。。。如果他们使用"POST"到页面,但验证失败,您还需要显示注册视图。只有当用户"POST"到页面并通过验证时,您才不想显示注册视图。
imho以下是CodeIgniter中最优雅的方法:
public function sign_up()
{
// Setup form validation
$this->form_validation->set_rules(array(
//...do stuff...
));
// Run form validation
if ($this->form_validation->run())
{
//...do stuff...
redirect('');
}
// Load view
$this->load->view('sign_up');
}
顺便说一句,这就是我在config/routes.php中所做的,让我的CI变得像RoR。请记住,您的routes.php只是一个普通的php文件,因此您可以根据请求方法放置一个开关来生成不同的路由。
switch ($_SERVER['REQUEST_METHOD'])
{
case 'GET':
$route['users/sign_up'] = "users/signup";
break;
case 'POST':
$route['users/sign_up'] = "users/do_signup";
break;
}
这是我在CodeIgniter4中的方法。我认为你只需要一种方法就能完成任务。
在app/Config/Routes.php中
/*
* --------------------------------------------------------------------
* Route For Sign up page
* --------------------------------------------------------------------
*/
$routes->match(['get','post'], 'signup', 'Users::Signup');
在app/Views/signup.php中
<?php print form_open('/signup', ['method' => 'POST']);?>
<!--All other inputs go here, for example-->
<input type="text" name="firstname">
<?php print form_close();?>
在app/Controllers/Users.php中
namespace AppControllers
use AppControllersBaseController;
class Users extends BaseController
{
public function Signup(){
helper(['form', 'url']);
//run validations here
if ($this->request->getMethod() === 'post' && $this->validate([
'firstname' => [
'label' => 'Firstname',
'rules' => 'required|alpha_space',
'errors' => [
'required' =>'Please enter your <strong>Firstname</strong> e.g.John',
'alpha_space' => 'Only alphabetic characters or spaces for <strong>Firstname</strong> field'
]
],
])){
//do other stuff here such as save data to database
$first_name=$this->request->getPost('firstname');
//if all go well here you can redirect to a favorite page
//e.g /success page
return redirect()->to('/success');
}
//if is get or post
print view('signup');
}
}
<button type="submit"class="md-btn btn-sm md-fab m-b-sm indigo" id="filterbtn" formaction="<?php echo base_url(); ?>front/get_filter/<?php echo$device_id;?>"><i class="fa fa-bar-chart"></i></button>
<button type="submit"class="md-btn btn-sm md-fab m-b-sm indigo" id="filterbtn" formaction="<?php echo base_url(); ?>front/get_data/<?php echo$device_id;?>"><i class="fa fa-th-list"></i></button>