Codeigniter-提交后验证失败时重新填充表格 [英] Codeigniter - re-populating form on failed validation after submitting

查看:76
本文介绍了Codeigniter-提交后验证失败时重新填充表格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个表格,要求用户输入一些信息。如果他们未能填写必填字段,则会用表格重新显示它们;页面顶部通知他们需要哪些字段,并且我启用了粘性表单(set_value()),因此不会丢失其输入。

I have a form that requires the user to enter some information. If they fail to complete the required fields they are re-presented with the form; the top of the page notifying them what fields are required and I've enabled sticky forms (set_value()) so their input is not lost.

我正在使用flashdata向用户显示消息(即,如果他们输入的内容已经存在于数据库中)。

I'm using flashdata to display messages to the user (i.e., if what they've entered already exists in the database).

我的表单位于控制器的index方法中。
从我的视图中单击Submit时,它将在控制器中调用add()方法。
add()方法执行验证,并根据结果提交到数据库或踢回用户以获取更多数据。

My form is in the index method of my controller. When submit is clicked from my view it calls the add() method in my controller. The add() method performs the validation and depending on the results either submits to the database or kicks back out to the user to get more data.

I我这样做的方式有几个问题。
1.如果验证失败,我将使用$ this-> index()返回表单并显示验证错误。如果尝试使用重定向,则会丢失验证错误和$ _POST []数据,因此粘性表单最终将为空白。
2.使用$ this-> index()将 add附加到我的网址末尾
3.使用$ this-> index()会导致flashdata问题。随机结果。

I have several issues with the way that i've done this. 1. If validation fails I'm using $this->index() to get back to my form and display the validation errors. If I try using redirect, I lose my validation errors and my $_POST[] data so my sticky forms end up blank. 2. Using $this->index() appends the 'add' to the end of my url 3. Using $this->index() causes issues with the flashdata. Random results.

有什么想法吗?

<?php
class Restaurant extends Controller {

    function Restaurant() {
        parent::Controller();
    }

    function index() {

        // Load libraries and models
        $this->load->model('/restaurant/mRestaurantTypes');
        $this->load->model('/restaurant/mRestaurant');
        $this->load->model('/utilities/mUtilities');

        // Get states
        $stateSelect = array();
        $getStates = $this->mUtilities->getStates();

        if($getStates->num_rows() > 0) {
            foreach($getStates->result() as $row) {
                $stateSelect[$row->abbr] = $row->name;
            }
        }


        // Get restaurant types
        $restaurantTypes = array();
        $getRestaurantTypes = $this->mRestaurantTypes->getRestaurantTypes();

        if($getRestaurantTypes->num_rows() > 0) {
            foreach($getRestaurantTypes->result() as $row) {
                $restaurantTypes[$row->restaurant_types_id] = $row->type;
            }
        }

        // Create form elements
        $data['name'] = array(
            'name'      =>  'name',
            'id'        =>  'name',
            'value'     =>  set_value('name'),
            'maxlength' =>  '200',
            'size'      =>  '50'
        );

        $data['address'] = array(
            'name'      =>  'address',
            'id'        =>  'address',
            'value'     =>  set_value('address'),
            'maxlength' =>  '200',
            'size'      =>  '50'
        );

        $data['city'] = array(
            'name'      =>  'city',
            'id'        =>  'city',
            'value'     =>  set_value('city'),
            'maxlength' =>  '50',
            'size'      =>  '25'        
        );

        $data['state'] = $stateSelect;

        $data['zip'] = array(
            'name'      =>  'zip',
            'id'        =>  'zip',
            'value'     =>  set_value('zip'),
            'maxlength' =>  '10',
            'size'      =>  '10'    
        );

        $data['phone'] = array(
            'name'      =>  'phone',
            'id'        =>  'phone',
            'value'     =>  set_value('phone'),
            'maxlength' =>  '15',
            'size'      =>  '15'    
        );

        $data['url'] = array(
            'name'      =>  'url',
            'id'        =>  'url',
            'value'     =>  set_value('url'),
            'maxlength' =>  '255',
            'size'      =>  '50'    
        );

        $data['type'] = $restaurantTypes;

        $data['tags'] = array(
            'name'      =>  'tags',
            'id'        =>  'tags',
            'value'     =>  set_value('tags'),
            'maxlength' =>  '255',
            'size'      =>  '50'    
        );

        $data['active'] = array(
            'name'      =>  'active',
            'id'        =>  'active',
            'value'     =>  'Y',
            'maxlength' =>  '1',
            'size'      =>  '2' 
        );

        // Set page variables
        $data_h['title'] = "Add new restaurant";

        // Load views
        $this->load->view('/template/header', $data_h);
        $this->load->view('/restaurant/index', $data);
        $this->load->view('/template/footer');      

    }


    /**
     * Add the the new restaurant to the database.
     */
    function add() {

        // Load libraries and models
        $this->load->library('form_validation');
        $this->load->model('/restaurant/mRestaurant');

        // Define validation rules
        $this->form_validation->set_rules('name',       'Name',     'trim|required|max_length[255]|xss_clean');
        $this->form_validation->set_rules('address',    'Address',  'trim|required|max_length[100]|xss_clean');
        $this->form_validation->set_rules('city',       'City',     'trim|required|max_length[128]|xss_clean');
        //$this->form_validation->set_rules('state',        'State',    'trim|required');
        $this->form_validation->set_rules('zip',        'Zip',      'trim|required|max_length[128]|xss_clean');
        $this->form_validation->set_rules('phone',      'Phone',    'trim|required|max_length[10]|xss_clean');
        $this->form_validation->set_rules('url',        'URL',      'trim|required|max_length[255]|xss_clean');
        $this->form_validation->set_rules('tags',       'Tags',     'trim|xss_clean');


        // Form validation
        if ($this->form_validation->run() == FALSE) {

            // On failure
            $this->index();

        } else {

            // On success, prepare the data
            $data = array(
                'name'      =>  $_POST['name'],
                'address'   =>  $_POST['address'],
                'city'      =>  $_POST['city'],
                'state'     =>  $_POST['state'],
                'zip'       =>  $_POST['zip'],
                'phone'     =>  $_POST['phone'],
                'url'       =>  $_POST['url'],
                'type'      =>  $_POST['type'],
                'tags'      =>  $_POST['tags'],
                'active'    =>  $_POST['active'],
            );

            // Check if the restaurant already exists
            $check = $this->mRestaurant->getRestaurant($data['name'], $data['zip']);

            // If no records were returned add the new restaurant
            if($check->num_rows() == 0) {
                $query = $this->mRestaurant->addRestaurant($data);

                if ($query) {
                    // On success
                    $this->session->set_flashdata('status', '<div class="success">Added New Restaurant!</div>');
                } else {
                    // On failure
                    $this->session->set_flashdata('status', '<div class="error">Could not add a new restaurant.</div>');    
                }

                redirect('restaurant/confirm', 'refresh');
            } else {
                // Notify the user that the restaurant already exists in the database
                $this->session->set_flashdata('status', '<div class="notice">This restaurant already exists in the database.</div>');
                redirect('restaurant/index');
            }

        }

    }


    function confirm() {

        $data['title'] = "Confirm";

        $this->load->view('/template/header');
        $this->load->view('/restaurant/confirm', $data);
        $this->load->view('/template/footer');
    }
}
?>


推荐答案

我将尝试帮助控制器中的逻辑我经常使用的:

I will try to help with the logic in the controller that I always use:

function index()
{
  //set some default variables
  $data['error_message'] = '';
  //if this is to edit existing value, load it here
  // from database and assign to $data
  //...
  //set form validation rules
  $validation = array();
  $validation['field_name'] = array(
    'field' => 'field_name',
    'label' => 'Field label',
    'rules' => 'trim|required'
  );
  //more rules here
  //...
  $this->load->library('form_validation');
  $this->form_validation->set_rules($validation);
  //run validation
  if ($this->form_validation->run() == FALSE)
  {
    $data['error_message'] .= validation_errors();
  }
  else
  {
    //do insert/update
    //
    //it's better to do redirection after receiving post request
    //you can use flashdata for success message
    if ( $success )
    {
      $this->session_set_flashdata('success_message', MESSAGE_HERE);
    }
    redirect(RESULT_PAGE);
  }
  //reaching this block can have 2 meaning, direct page access, or not have valid form validation
  //assign required variables, such as form dropdown option, etc
  //...
  //load view
  $this->load->view(VIEW_FILE, $data);
}

查看文件:

...
<?php if ( $error_message ): ?>
  <?php echo $error_message; ?>
<?php endif; ?>
<?php echo form_open(current_url, array('id' => 'some_form_id')); ?>
<!-- form field here -->
<label for="field_name">Field label</label>
<input name="field_name" value="<?php echo set_value('field_name', $DEFAULT_FIELD_NAME_IF_NEEDED); ?>" />
<!-- more form field here -->
<?php echo form_close(); ?>
...

我希望这会对您有所帮助。

I hope this will help you.

对于视图文件中的 $ DEFAULT_FIELD_NAME_IF_NEEDED ,如果此表单页面用于编辑数据库中的现有数据,我将使用它传递默认值。您可以将数据加载到控制器中,然后将其传递给查看文件并在表单字段中显示。

For the $DEFAULT_FIELD_NAME_IF_NEEDED in the view file, I use this to pass the default value if this form page is to edit existing data from database. You can load the data in the controller, then pass it to view file and display it in the form field.

这篇关于Codeigniter-提交后验证失败时重新填充表格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆