如何在CodeIgniter中的不同函数中向相同的get url提交post方法表单



我发现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>

最新更新