Unlink only if there is a new image to upload
Issue:
Hello,
I have an edit page which enables the client to update the sale information, what I would like to do is that if a new image is not uploaded it will keep the original but if a new image is uploaded it will delete the old image from the database row
and unlink
the file from the server,
But I am unsure how to work it into my below code. How do I also make the file field not required?
Update:
Ross,
I have done the following but if the image is wrong I still get sale updated + the message how could I only have the error when its needed?
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Editsale extends CI_Controller {
function __construct() {
parent::__construct();
}
function index() {
echo 'index';
$id = $this->uri->segment(4);
# Set Main Page Data
$data['title'] = 'Edit Sale:';
$data['sales_pages'] = $this->sales_model->getSalesPages();
$data['cms_pages'] = $this->navigation_model->getCMSPages();
$data['sale']= $this->sales_model->getSalesContent($id);
#Set The Validation Rules
$this->form_validation->set_rules('name', 'Name', 'trim|required|xss_clean');
$this->form_validation->set_rules('location', 'Location', 'trim|required|xss_clean');
$this->form_validation->set_rules('bedrooms', 'Bedrooms', 'trim|numeric|required|xss_clean');
$this->form_validation->set_rules('bathrooms', 'Bathrooms', 'trim|numeric|required|xss_clean');
$this->form_validation->set_rules('condition', 'Condition', 'trim|required|xss_clean');
$this->form_validation->set_rules('description', 'Description', 'trim|required|xss_clean');
$this->form_validation->set_rules('price', 'Price', 'trim|required|xss_clean');
if($this->form_validation->run()) #If Valid Run
{
$content = array(
'name' => $this->input->post('name', TRUE),
'location' => $this->input->post('location', TRUE),
'bedrooms' => $this->input->post('bedrooms', TRUE),
'bathrooms' => $this->input->post('bathrooms', TRUE),
'condition' => $this->input->post('condition', TRUE),
'description' => $this->input->post('description', TRUE),
'price' => $this->input->post('price', TRUE)
);
if($_FILES['userfile']['error'] != 4)
{
//Set File Settings
$config['upload_path'] = 'includes/uploads/sales/';
$config['allowed_types'] = 'jpg|png';
$config['remove_spaces'] = TRUE ;
$config['overwrite'] = TRUE;
$config['max_size'] = '1024';
$config['max_width'] = '1024';
$config['max_height'] = '768';
$this->load->library('upload', $config);
//Continue and resize the image
$data = array('upload_data' => $this->upload->data());
$config['image_library'] = 'GD2';
$config['source_image'] = $this->upload->upload_path.$this->upload->file_name;
$config['new_image'] = 'includes/uploads/sales/thumbs/';
$config['create_thumb'] = 'TRUE';
$config['thumb_marker'] ='_thumb';
$config['maintain_ratio'] = 'FALSE';
$config['width'] = '200';
$config['height'] = '150';
$this->load->library('image_lib', $config);
$this->image_lib->resize();
if(!$this->upload->do_upload()) //Process the upload function and uploads image
{
$data['message'] = array('imageError' => $this->upload->display_errors()); // Capture any $config errors and output them
}
else
{
$file_info = $this->upload->data(); //Returns an data array
// Append image data to content array in preparation for db update
$content['imagename'] = $file_info['file_name'];
$content['thumbname'] = $file_info['raw_name'].'_thumb'.$file_info['file_ext'];
}
}
// After everything, update DB
if($this->sales_model->updateSale($id, $content))
{
$data['success'] = TRUE;
}
else
{
$data['success'] = FALSE;
}
} # End Form Validation
$data['cms_pages'] = $this->navigation_model->getCMSPages();
$data['sales_pages'] = $this->sales_model->getSalesPages($id);
$data['sale']= $this->sales_model->getSalesContent($id);
$data['content'] = $this->load->view('admin/editsale', $data, TRUE); #Loads the "content"
$this->load->view('admintemplate', $data); #Loads the given template and passes the $data['content'] into it
} # End Index Function
} # End Controller
View:
<?php
//Setting form attributes
$formEditSale = array('id' => 'editSale', 'name' => 'editSale');
$formEditSaleName = array('id' => 'name', 'name' => 'name');
$formEditSaleLocation = array('id' => 'location', 'name' => 'location');
$formEditSaleBedrooms = array('id' => 'bedrooms','name' => 'bedrooms');
$formEditSaleBathrooms = array('id' => 'bathrooms','name' => 'bathrooms');
$formEditSaleCondition = array('id' => 'condition','name' => 'condition');
$formEditSaleImage = array('id' => 'userfile', 'name'=> 'userfile');
$formEditSalePrice = array('id' => 'price','name' => 'price');
$formEditSaleDescription = array('id' => 'description','name' => 'description');
$formEditSaleSubmit = array('id' => 'submit', 'name'=> 'submit');
?>
<div id ="formLayout" class="form">
<?php
if($success == TRUE) {
echo '<section id = "validation">Sale Updated</section>';
}
echo '<section id = "validation">'.$message['imageError'].'</section>';
?>
<h4>You are editing sale: <?= $sale[0]['name']; ?></h4>
<?php echo form_open_multipart('admin/editsale/index/'.$sale[0]['id'].'/'.url_title($sale[0]['name'],'dash', TRUE),$formEditSale); ?>
<?php echo form_fieldset(); ?>
<label><?php echo form_label('Name:','name'); ?> <span class="small">Required Field - Text</span></label>
<?php echo form_input($formEditSaleName, $sale[0]['name']); ?>
<div id="error"><?php echo form_error('name'); ?></div>
<label><?php echo form_label('Location:','location');?> <span class="small">Required Field - Text</span></label>
<?php echo form_input($formEditSaleLocation, $sale[0]['location']);?>
<div id="error"><?php echo form_error('location'); ?></div>
<label><?php echo form_label('Bedrooms: ','bedrooms');?> <span class="small">Required Field - Number</span></label>
<?php echo form_input($formEditSaleBedrooms, $sale[0]['bedrooms']);?>
<div id="error"><?php echo form_error('bedrooms'); ?></div>
<label><?php echo form_label('Bathrooms: ','bathrooms');?> <span class="small">Required Field - Number</span></label>
<?php echo form_input($formEditSaleBathrooms, $sale[0]['bathrooms']);?>
<div id="error"><?php echo form_error('bathrooms'); ?></div>
<label><?php echo form_label('Condition: ','condition');?> <span class="small">Required Field - Text</span></label>
<?php echo form_input($formEditSaleCondition, $sale[0]['condition']);?>
<div id="error"><?php echo form_error('condition'); ?></div>
<label><?php echo form_label('Price: ','price');?> <span class="small">Required Field - Number</span></label>
<?php echo form_input($formEditSalePrice, $sale[0]['price']);?>
<div id="error"><?php echo form_error('price'); ?></div>
<label><?php echo form_label('Image: ','userfile');?> <span class="small">1MB Max JPG/PNG</span></label>
<?php echo form_upload($formEditSaleImage);?>
<div id="error"><?php echo form_error('userfile'); ?></div>
<label><?php echo form_label('Description: ','description');?> <span class="small">Required Field - Text</span></label>
<div id="error"><?php echo form_error('description'); ?></div>
<?php echo form_textarea($formEditSaleDescription, $sale[0]['description']);?>
<script type="text/javascript">CKEDITOR.replace('description');</script>
<?php echo form_submit($formEditSaleSubmit,'Submit Edit');?>
<?php echo form_fieldset_close(); ?>
<?php echo form_close(); ?>
</div>
Controller:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Editsale extends CI_Controller {
function __construct() {
parent::__construct();
}
function index() {
$id = $this->uri->segment(4);
# Set Main Page Data
$data['title'] = 'Edit Sale:';
$data['sales_pages'] = $this->sales_model->getSalesPages();
$data['cms_pages'] = $this->navigation_model->getCMSPages();
$data['sale']= $this->sales_model->getSalesContent($id);
#Set The Validation Rules
$this->form_validation->set_rules('name', 'Name', 'trim|required|xss_clean');
$this->form_validation->set_rules('location', 'Location', 'trim|required|xss_clean');
$this->form_validation->set_rules('bedrooms', 'Bedrooms', 'trim|numeric|required|xss_clean');
$this->form_validation->set_rules('bathrooms', 'Bathrooms', 'trim|numeric|required|xss_clean');
$this->form_validation->set_rules('condition', 'Condition', 'trim|required|xss_clean');
$this->form_validation->set_rules('description', 'Description', 'trim|required|xss_clean');
$this->form_validation->set_rules('price', 'Price', 'trim|required|xss_clean');
if($this->form_validation->run())
{
//Set File Settings
$config['upload_path'] = 'includes/uploads/sales/';
$config['allowed_types'] = 'jpg|png';
$config['remove_spaces'] = TRUE;
$config['overwrite'] = TRUE;
$config['max_size'] = '1024';
$config['max_width'] = '1024';
$config['max_height'] = '768';
$this->load->library('upload', $config);
if(!$this->upload->do_upload())
{
$data['message'] = array('imageError' => $this->upload->display_errors());
}
else{
$data = array('upload_data' => $this->upload->data());
$data['success'] = TRUE;
$config['image_library'] = 'GD2';
$config['source_image'] = $this->upload->upload_path.$this->upload->file_name;
$config['new_image'] = 'includes/uploads/sales/thumbs/';
$config['create_thumb'] = 'TRUE';
$config['thumb_marker'] ='_thumb';
$config['maintain_ratio'] = 'FALSE';
$config['width'] = '200';
$config['height'] = '150';
$this->load->library('image_lib', $config);
$this->image开发者_运维百科_lib->resize();
$file_info = $this->upload->data();
#Lets Set What We Are Sending To The DB
$this->db->escape($content);
$content = array(
'name' => $this->input->post('name', TRUE),
'location' => $this->input->post('location', TRUE),
'bedrooms' => $this->input->post('bedrooms', TRUE),
'bathrooms' => $this->input->post('bathrooms', TRUE),
'condition' => $this->input->post('condition', TRUE),
'description' => $this->input->post('description', TRUE),
'price' => $this->input->post('price', TRUE),
'imagename' => $file_info['file_name'],
'thumbname' => $file_info['raw_name'].'_thumb'.$file_info['file_ext']
);
$this->sales_model->updateSale($id, $content);
}# else end
} # End Form Validation
$data['cms_pages'] = $this->navigation_model->getCMSPages();
$data['sales_pages'] = $this->sales_model->getSalesPages($id);
$data['sale']= $this->sales_model->getSalesContent($id);
$data['content'] = $this->load->view('admin/editsale', $data, TRUE); #Loads the "content"
$this->load->view('admintemplate', $data); #Loads the given template and passes the $data['content'] into it
} # End Index Function
} # End Controller
Model:
function updateSale($id, $content) {
$this ->db->where('id', $id);
$update = $this->db->get('sales');
$row = $update->row_array();
if($update->num_rows() > 0) {
#lets delete the image
unlink("/includes/uploads/gallery/".$row['imagename']);
#lets delete the thumb.
unlink("/includes/uploads/gallery/thumbs/".$row['thumbname']);
$this->db->update('sales', $content);
} # End IF
} # End Update
You'll have to rework the if(!$this->upload->do_upload()
bit, as it will always fail if there is no file.
So how about...
if($_FILES['userfile']['error']==4) {
// no file was selected
} else {
// you can upload!
}
// carry on.
So we check for the existence of a file in $_FILES
using it's error code 4
to determine if it's empty or not.
You can still use CI's do_upload()
but check for the existence first, not using CI, other wise your code will always fail due to how CI's file validation works.
精彩评论