Welcome Guest, Not a member yet? Register   Sign In
Codeignier 3 update post image functionality fails
#1

I am working on a basic blog application in Codeigniter 3.1.8.
There is a create post and an update post functionality.
As one would expect, a lot of the code from the update post functionality is made from the create functionality's code.
The create.php view:

Code:
<?php echo form_open_multipart ("posts/create"); ?>
<div class="form-group <?php if(form_error('title')) echo 'has-error';?>">
 <input type="text" name="title" id="title" class="form-control" placeholder="Title">
 <?php if(form_error('title')) echo form_error('title'); ?>
</div>
<div class="form-group <?php if(form_error('desc')) echo 'has-error';?>">
 <input type="text" name="desc" id="desc" class="form-control" placeholder="Short decription">
 <?php if(form_error('desc')) echo form_error('desc'); ?>
</div>
<div class="form-group <?php if(form_error('body')) echo 'has-error';?>">
 <textarea name="body" id="body" cols="30" rows="5" class="form-control" placeholder="Add post body"></textarea>
 <?php if(form_error('body')) echo form_error('body'); ?>
</div>
<div class="form-group">
 <select name="category" id="category" class="form-control">
   <?php foreach ($categories as $category): ?>
   <option value="<?php echo $category->id; ?>"><?php echo $category->name; ?></option>
   <?php endforeach; ?>
 </select>
</div>
<label for="postimage">Upload an image</label>
<div class="form-group">
 <input type="file" name="userfile" id="postimage" size="20">
</div>
<div class="form-group">
 <input type="submit" value="Save" class="btn btn-block btn-md btn-success">
</div>
<?php echo form_close(); ?>

The update.php view:

Code:
<?php echo form_open_multipart("posts/update"); ?>
<input type="hidden" name="id" id="pid" value="<?php echo $post->id; ?>">
<div class="form-group <?php if(form_error('title')) echo 'has-error';?>">
 <input type="text" name="title" id="title" class="form-control" placeholder="Title" value="<?php echo $post->title; ?>">
 <?php if(form_error('title')) echo form_error('title'); ?>
</div>
<div class="form-group <?php if(form_error('desc')) echo 'has-error';?>">
 <input type="text" name="desc" id="desc" class="form-control" placeholder="Short decription" value="<?php echo $post->description; ?>">
 <?php if(form_error('desc')) echo form_error('desc'); ?>
</div>
<div class="form-group <?php if(form_error('body')) echo 'has-error';?>">
 <textarea name="body" id="body" cols="30" rows="5" class="form-control" placeholder="Add post body"><?php echo $post->content; ?></textarea>
 <?php if(form_error('body')) echo form_error('body'); ?>
</div>
<div class="form-group">
 <select name="category" id="category" class="form-control">
   <?php foreach ($categories as $category): ?>
   <?php if ($category->id == $post->cat_id): ?>
   <option value="<?php echo $category->id; ?>" selected><?php echo $category->name; ?></option>
   <?php else: ?>
   <option value="<?php echo $category->id; ?>"><?php echo $category->name; ?></option>
   <?php endif; ?>
   <?php endforeach; ?>
 </select>
</div>
<label for="postimage">Upload an image</label>
<div class="form-group">
 <input type="file" name="userfile" id="postimage" size="20">
</div>
<div class="form-group">
 <input type="submit" value="Save" class="btn btn-block btn-md btn-success">
</div>
<?php echo form_close(); ?>

The method for creating posts has an image upload feature that works very well:
Controller:

Code:
public function create() {
   $data = $this->Static_model->get_static_data();
   $data['tagline'] = "Add New Post";
   $data['categories'] = $this->Categories_model->get_categories();

   $this->form_validation->set_rules('title', 'Title', 'required');
   $this->form_validation->set_rules('desc', 'Short description', 'required');
   $this->form_validation->set_rules('body', 'Body', 'required');
   $this->form_validation->set_error_delimiters('<p class="error">', '</p>');

   if($this->form_validation->run() === FALSE){
       $this->load->view('partials/header', $data);
       $this->load->view('create');
       $this->load->view('partials/footer');
   } else {
       // Upload image
       $config['upload_path'] = './assets/img/posts';
       $config['allowed_types'] = 'jpg|png';
       $config['max_size'] = '2048';

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

       if(!$this->upload->do_upload()){
           $errors = array('error' => $this->upload->display_errors());
           $post_image = 'default.jpg';
       } else {
           $data = array('upload_data' => $this->upload->data());
           $post_image = $_FILES['userfile']['name'];
       }

       $this->Posts_model->create_post($post_image);
       redirect('posts');
   }
}

Model:

Code:
public function create_post($post_image) {
   $data = [
       'title' => $this->input->post('title'),
       'description' => $this->input->post('desc'),
       'content' => $this->input->post('body'),
       'post_image' => $post_image,
       'author_id' => 3,
       'cat_id' => $this->input->post('category'),
       'created_at' => date('Y-m-d H:i:s')
   ];
   return $this->db->insert('posts', $data);
}

I have tried to "copy" the image upload feature in the post update:
In the Posts Controller:

Code:
public function update() {
   // Form data validation rules
   $this->form_validation->set_rules('title', 'Title', 'required',  array('required' => 'The %s field can not be empty'));
   $this->form_validation->set_rules('desc', 'Short description', 'required',  array('required' => 'The %s field can not be empty'));
   $this->form_validation->set_rules('body', 'Body', 'required',  array('required' => 'The %s field can not be empty'));
   $this->form_validation->set_error_delimiters('<p class="error">', '</p>');

   $id = $this->input->post('id');

       // Upload image
       $config['upload_path'] = './assets/img/posts';
       $config['allowed_types'] = 'jpg|png';
       $config['max_size'] = '2048';

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

       $data = array('upload_data' => $this->upload->data());
       $post_image = $_FILES['userfile']['name'];

   if ($this->form_validation->run()) {
       $this->Posts_model->update_post($id, $data);
       redirect('posts/post/' . $id);
   } else {
       $this->edit($id);
   }
}

In the Posts_model model:

Code:
public function update_post($post_image) {
   $data = [
       'title' => $this->input->post('title'),
       'description' => $this->input->post('desc'),
       'content' => $this->input->post('body'),
       'post_image' => $post_image,
       'cat_id' => $this->input->post('category')
   ];
   $this->db->where('id', $this->input->post('id'));
   return $this->db->update('posts', $data);
}

Yet, whenever I update a posts image, it inserts the post's id instead of the image name

Code:
<img src="http://localhost/ciblog/assets/img/posts/60">

.
Where am I wrong?
Reply
#2

Read the Users Guide on the upload library and look at the data array.
What did you Try? What did you Get? What did you Expect?

Joined CodeIgniter Community 2009.  ( Skype: insitfx )
Reply
#3

(This post was last modified: 04-28-2018, 12:40 PM by jreklund.)

You aren't adding the name of the file, but the ID.
Code:
$this->Posts_model->update_post($id, $data);

public function update_post($post_image) {
...
}
Reply




Theme © iAndrew 2016 - Forum software by © MyBB