簡體   English   中英

使用單一表單進行插入和更新功能,Codeigniter

[英]Using a single form for insert and update function, Codeigniter

我正在嘗試使用單個表單來插入新數據並更新現有數據的值。我可以輕松顯示表單、獲取數據並更新它,但是當我嘗試插入新數據時,表格沒有出現。 這是我的看法

<div class="card-body">
  <small><?php echo validation_errors(); ?></small>
  <?php if (isset($packages)) { ?>
  <form action="<?= base_url('admin/update_package/' . $packages->id) ?>" method="POST" enctype="multipart/form-data">
    <div class="form-group">
      <label for="name" class="control-label">Package Name</label>
      <input type="text" class="form-control mb-3" name="title" placeholder="Enter Package Name" value="<?php echo !empty($packages->title) ? $packages->title : ''; ?>">
    </div>
    <div class="form-group">
      label for="short_name" class="control-label">Inclusions</label>
      <textarea id="compose-textarea" class="form-control" name="tour_location" style="height: 300px;"><?php echo !empty($packages->tour_location) ? $packages->tour_location : ''; ?></textarea>
    </div>
    <div class="form-group">
      <label for="short_name" class="control-label">Description</label>
      <textarea id="compose-textarea2" class="form-control" name="description" style="height: 300px;"><?php echo !empty($packages->description) ? $packages->description : ''; ?></textarea>
    </div>
    <div class="form-group">
      <label for="price" class="control-label">Price</label>
      <input type="number" step="any" class="form-control form" required name="cost" value="<?php echo !empty($packages->cost) ? $packages->cost : 0; ?>">
    </div>
    <div class="form-group">
      <label for="status" class="control-label">Status</label>
      <select name="status" id="status" class="custom-select select">
        <option value="1" <?php echo isset($status) && $status==1 ? 'selected' : '- Select Status -' ?>>Active</option>
        <option value="0" <?php echo isset($status) && $status==0 ? 'selected' : '- Select Status -' ?>>Inactive</option>
      </select>
    </div>
    <div class="form-group">
      <label for="short_name" class="control-label">Images</label>
      <div class="custom-file">
        <label class="btn custom-file-label text-light" for="customFile">Choose file
        <input type="hidden" name="current_image" value="<?php echo !empty($packages->upload_path) ? $packages->upload_path : ''; ?>">
        <input type="file" class="form-control custom-file-input" id="customFile" name="image" multiple accept="image/*"><small><?php if (isset($error)) {
        echo $error;} ?></small>
        </label>
      </div>
    </div>
    <?php 
         } ?>
    <!-- <div class="col-md-4">
        <img src="<?php echo base_url('images/' . $packages->upload_path) ?>" alt="Package Image" class="w-100 h-100">
        </div> -->

    <div class="card-footer">
      <input type="submit" name="packageData" class="btn btn-success " value="Save">
      <a class="btn btn-flat btn-default" href="<?php echo base_url('admin/packages'); ?>">Cancel</a>
    </div>
  </form>
</div>

我的模型

 public function insert($data = array())
    {
        if (!empty($data)) {
            $this->db->insert('packages', $data);

            return $this->db->insert_id();
        }
        return false;
    }
public function edit($id)
    {
        $query = $this->db->get_where("packages", array('id' => $id));

        return $query->row();
    }

    public function update($data, $id)
    {
        return $this->db->update("packages", $data, array('id' => $id));
    }

然后控制器

public function insert_package()
    {
        $packageData = array();

        // If add request is submitted
        if ($this->input->post('packageData')) {
            // Form field validation rules
            $this->form_validation->set_rules('title', 'Package Name', 'required');
            $this->form_validation->set_rules('tour_location', 'Inclusions', 'trim');
            $this->form_validation->set_rules('description', 'Description', 'trim|required');
            $this->form_validation->set_rules('cost', 'Price', 'required');
            $this->form_validation->set_rules('status', 'Status', 'required');
            // $this->form_validation->set_rules('image', 'Images', 'required');

            // Validate submitted form data
            if ($this->form_validation->run() == true) {
                $ori_filename = $_FILES['image']['name'];
                $update_image = time() . "" . str_replace(' ', '-', $ori_filename);
                $config = [
                    'upload_path' => './images',
                    'allowed_types' => 'gif|jpg|png',
                    'file_name' => $update_image,
                ];

                $this->load->library('upload', $config);

                if (!$this->upload->do_upload('image')) {
                    $error = array('error' => $this->upload->display_errors());
                    $this->load->view(base_url('admin/packages'), $error);
                } else {

                    $image = $this->upload->data('file_name');
                    $packageData = array(
                        'title' => $this->input->post('title'),
                        'tour_location' => $this->input->post(htmlentities('tour_location')),
                        'description' => $this->input->post(htmlentities('description')),
                        'cost' => $this->input->post('cost'),
                        'status' => $this->input->post('status'),
                        'upload_path' => $image
                    );
                    $img = new Admin_model;
                    // Insert member data
                    $img->insert($packageData);
                    $this->session->set_flashdata('status', 'Package InsertedSuccesfully');
                    redirect(base_url('admin/packages'));
                }
            }
        }

        $data['title'] = 'Add Package';

        $this->load->view('../admin/template/admin_header');
        $this->load->view('../admin/template/admin_topnav');
        $this->load->view('../admin/template/admin_sidebar');
        $this->load->view('../admin/packages/manage_package', $data);
        $this->load->view('../admin/template/admin_footer');
    }

    public function edit_package($id)
    {
        $data['title'] = 'Update Package';

        $this->load->view('../admin/template/admin_header');
        $package = new Admin_model;
        $data['packages'] = $package->edit($id);
        $this->load->view('../admin/template/admin_topnav');
        $this->load->view('../admin/template/admin_sidebar');
        $this->load->view('../admin/packages/manage_package', $data);
        $this->load->view('../admin/template/admin_footer');
    }

    public function update_package($id)
    {
        $this->form_validation->set_rules('title', 'Package Name', 'required');
        $this->form_validation->set_rules('tour_location', 'Inclusions', 'trim');
        $this->form_validation->set_rules('description', 'Description', 'trim|required');
        $this->form_validation->set_rules('cost', 'Price', 'required');
        $this->form_validation->set_rules('status', 'Status', 'required');

        if ($this->form_validation->run() == true) {
            $current_image = $this->input->post('current_image');
            $new_image = $_FILES['image']['name'];

            if ($new_image == TRUE) {

                $update_image = time() . "-" . str_replace(' ', '-', $_FILES['image']['name']);
                $config = [
                    'upload_path' => './images',
                    'allowed_types' => 'gif|jpg|png',
                    'file_name' => $update_image,
                ];

                $this->load->library('upload', $config);

                if (!$this->upload->do_upload('image')) {
                    if (file_exists('./images' . $current_image)) {
                        unlink('./images' . $current_image);
                    }
                }
            } else {
                $update_image = $current_image;
            }

            $packageData = array(
                'title' => $this->input->post('title'),
                'tour_location' => $this->input->post(htmlentities('tour_location')),
                'description' => $this->input->post(htmlentities('description')),
                'cost' => $this->input->post('cost'),
                'status' => $this->input->post('status'),
                'upload_path' => $update_image
            );
            
            $this->Admin_model->update($packageData, $id);
            $this->session->set_flashdata('status', 'Package InsertedSuccesfully');
            redirect(base_url('admin/packages/'));
        } else {
            return $this->edit_package($id);
        }
    }

我在這里找到了一個問題以及一個答案和建議,但我仍然無法解決我的問題。

重用表單進行插入和更新的最簡單方法是將表單操作留空。 如果表單操作留空,則表單將發送回用於顯示它的同一 URL。 如果您使用相同的方法(一種用於插入,一種用於更新)來處理和呈現 from,則此方法有效。

由於您的更新表單處理位於admin/update_package/$id ,但您的更新表單呈現位於admin/edit_package/$id ,因此您需要指定的表單操作取決於您用於顯示更新表單的 URL。

如果您使用指向admin/update_package/$id的鏈接來顯示更新表單,則可以將表單操作留空(或將其完全刪除): <form method="POST" enctype="multipart/form-data">

update_package然后運行表單驗證,然后使用edit_package顯示表單,但 URL 仍然是admin/update_package/$id ,這是您要回發到的位置,因此不需要表單操作。

在這種情況下,我建議您也將控制器中的edit_package方法設為私有,這樣您就不會意外通過edit_package URL 顯示表單: private function edit_package($id)


但是,如果您使用指向 URL admin/edit_package/$id的鏈接來顯示更新表單,則回發到該 URL 不會觸發表單處理,因此在這種情況下您確實需要指定表單操作。

您可以使用$packages變量來判斷表單是用於插入還是更新,如果$packages存在,則將操作設置為update_package URL: action="<?= isset($packages) ? base_url('admin/update_package/'.$packages->id) : ''; ?>"

然后 Insert 獲得一個空操作,該操作回發到用於呈現插入表單的同一 URL。


編輯:還要刪除表單周圍的<?php if (isset($packages)) ,否則它也不會在插入時顯示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM