[英]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.