【问题标题】:How to submit a post-method form to same get-url in different function in CodeIgniter?如何在 CodeIgniter 的不同函数中将 post-method 表单提交到相同的 get-url?
【发布时间】:2012-03-08 12:44:22
【问题描述】:

我发现 CodeIgniter 表单验证通过 load->view 方法显示错误消息,如果使用“redirect”会丢失字段错误消息。

目前我使用一个功能显示表单页面,另一个功能处理表单发布。

类用户扩展 CI_Controller { 函数 __construct() { 父::__construct(); } 公共函数注册() { $this->load->view('users/sign_up'); } 公共函数 do_sign_up(){ $this->form_validation->set_rules('user_login', '用户名', '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'); }别的 { // 将发布用户数据保存到用户表 重定向到(“用户/登录”); }

当表单验证失败时,浏览器中的 url 将更改为“/users/do_sign_up”,我想在注册页面中保留相同的 url。

在表单验证失败中使用redirect("users/sign_up") 方法将保留相同的url,但验证错误消息将丢失。

在 Rails 中,我不能像这样使用路由进行配置:

获取“用户/sign_up”=>“用户#signup” 发布“用户/sign_up”=>“用户#do_signup”

【问题讨论】:

    标签: php codeigniter


    【解决方案1】:

    恕我直言,没有必要检查请求方法,因为如果用户“GET”到您想要显示注册视图的页面...如果他们用户“POST”到该页面并且验证失败,您也想显示注册视图。您只不想在用户“发布”到页面并通过验证时显示注册视图。

    恕我直言,这是 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;
    }
    

    【讨论】:

      【解决方案2】:

      这是我在 CodeIgniter 4 中的方法。我认为您只需要一种方法即可完成任务。

      在您的 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 App\Controllers
      
      use App\Controllers\BaseController;
      
      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');
      }
      
      }
      

      【讨论】:

        【解决方案3】:
        <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>
        

        【讨论】:

          猜你喜欢
          • 2012-02-24
          • 2019-04-22
          • 1970-01-01
          • 1970-01-01
          • 2021-11-01
          • 2016-09-26
          • 1970-01-01
          • 2017-01-07
          • 1970-01-01
          相关资源
          最近更新 更多