php - Codeigniter - 提交后验证失败时重新填充表单

标签 php codeigniter

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

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

我的表单在我的 Controller 的索引方法中。 当从我的 View 中单击提交时,它会调用我的 Controller 中的 add() 方法。 add() 方法执行验证并根据结果提交到数据库或踢回给用户以获取更多数据。

我在执行此操作时遇到了几个问题。 1. 如果验证失败,我使用 $this->index() 返回我的表单并显示验证错误。如果我尝试使用重定向,我会丢失我的验证错误和我的 $_POST[] 数据,所以我的粘性表单最终会变成空白。 2. 使用 $this->index() 将 'add' 附加到我的 url 的末尾 3. 使用 $this->index() 会导致闪存数据出现问题。随机结果。

有什么想法吗?

<?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');
    }
}
?>

最佳答案

我将尝试帮助处理我经常使用的 Controller 中的逻辑:

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(); ?>
...

希望对您有所帮助。

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

关于php - Codeigniter - 提交后验证失败时重新填充表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1973802/

相关文章:

php - CodeIgniter 查询获取位置

mysql - 如何根据特定的id删除多个文件(codeigniter)?

php - 如何将数据从记录表传递到 Modal 以进行编辑

php - 使用 Jquery 使用选择下拉列表更新表行

php - 无法更改高度和宽度输入类型文本区域

javascript - 在 iframe 中嵌入谷歌地图时,如何删除附近的地点?

PHP 创建并格式化 Microsoft Word 文档

jquery - codeigniter 文本框 id 中的 jquery 自动完成功能不起作用

php - 将博客添加到现有 codeigniter 网站的选项有哪些

php - MySQL 不接受 PHP 查询