⚠ In case you've missed it, we have migrated to our new website, with a brand new forum. For more details about the migration you can read our blog post for website migration. This is an archived forum. ⚠

  •     

profile picture

File upload url error on edit record



a.zekree

a.zekree
  • profile picture
  • Member

Posted 16 March 2015 - 09:24 AM

Hi all,
First thanks for this great effort.
 
i am new in grucery crud library and i am facing a problem that i build a site that has many images so i want to upload images in different folders for example a folder for every day upload so i write this code
 
$crud->set_field_upload('image','assets/uploads/fashion-media/'.date('Y').'/'.date('m').'/'.date('d'));
 
and i made a function to create the destination folder if it is not exists
the upload works fine but when i tried to edit a record i have image preview error because it uses the the upload path that found in set_file_upload and not uses the last file upload destination
 
so i want to pass the file url to the edit record page
 
can any one help ?
 

[attachment=910:Screenshot from 2015-03-16 11:23:19.png]


a.zekree

a.zekree
  • profile picture
  • Member

Posted 17 March 2015 - 08:45 AM

all i want to do is to divide my uploads into more than one folder because i have more uploads and i don't want to put them all in the same folder, can any one tell me how to do that ?

 

this is my code that has an issue in image url while editing the record

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Designer extends MY_Controller {

  public function index(){    
    // CRUD table
    $this->load->model('designer_model');
    $this->load->helper('crud');
    $this->load->helper('my_dir_helper');

    $crud = generate_crud('designers');

    if($this->uri->segment(4) && $crud->getState() == 'success'){
      redirect('crop/image_crop/designer/'.$this->uri->segment(4));
    }
    
    $crud->columns('title', 'description', 'category_id', 'media_count', 'image');
    $crud->display_as('media_count', 'Media Count')
    ->display_as('category_id', 'Category');

    // sert relation
    $crud->set_relation('category_id', 'designer_categories', 'title');

    $crud->required_fields('title', 'category_id', 'image');

    $crud->field_type('slug', 'invisible');
    $crud->field_type('media_count', 'invisible');
    $crud->field_type('created', 'invisible');
    $crud->field_type('updated', 'invisible');
    $crud->field_type('views', 'invisible');
    $crud->field_type('likes', 'invisible');
    $crud->field_type('image_path', 'invisible');

    $crud->set_lang_string('form_update_changes','Update designer')
         ->set_lang_string('form_update_and_go_back','Update and go to crop image')
         ->set_lang_string('form_save_and_go_back','Save and go to crop image')
         ->set_lang_string('form_save','Save designer');

    // prepare for file upload
    mkdir_if_not_exists('assets/uploads/fashion-media/'.date('Y').'/'.date('m').'/'.date('d'));
    $crud->set_field_upload('image','assets/uploads/fashion-media/'.date('Y').'/'.date('m').'/'.date('d'));

    // callback functions
    $crud->callback_before_insert(array($this, 'callback_before_create_designer'));
    $crud->callback_before_update(array($this, 'callback_before_update_designer'));
    $crud->callback_after_upload(array($this, 'callback_after_upload_designer'));
    $crud->callback_column('image',array($this,'callback_image_url'));

    $this->mTitle = "Designers";
    $this->mViewFile = '_partial/crud';
    $this->mViewData['crud_data'] = $crud->render();
  }

  /**
   * Add created and updated fields on insert
   */
  public function callback_before_create_designer($post_array){
    $post_array['slug'] = url_title($post_array['title'], 'dash', TRUE);
    $post_array['image_path'] = 'assets/uploads/fashion-media/'.date('Y').'/'.date('m').'/'.date('d');
    $post_array['created'] = date('Y-m-d H:i:s');
    $post_array['updated'] = date('Y-m-d H:i:s');
    return $post_array;
  }

  /**
   * Change updated field with current time on update
   */
  public function callback_before_update_designer($post_array){
    $post_array['slug'] = url_title($post_array['title'], 'dash', TRUE);
    $post_array['updated'] = date('Y-m-d H:i:s');
    return $post_array;
  }

  public function callback_image_url($value, $row){
    return '<a href="'.base_url($row->image_path.'/'.$row->image).'" class="image-thumbnail"><img src="'.base_url($row->image_path.'/athumb_'.$row->image).'" height="50px"></a>';
  }

  /**
   * callback function to create automatic thumb after uploading the image
   */
  public function callback_after_upload_designer($uploader_response,$field_info, $files_to_upload){
    $this->load->library('image_moo');
    //Is only one file uploaded so it ok to use it with $uploader_response[0].
    $file_uploaded = 'assets/uploads/fashion-media/'.date('Y').'/'.date('m').'/'.date('d') .'/'.$uploader_response[0]->name;
    if($this->image_moo->load($file_uploaded)->resize_crop(323,283)->save_pa('athumb_')){
      return true;
    }else{
      return false;
    }
  }

}

when you edit a designer that his image uploaded any day before today i get preview error (you can check image above in the topic)


Amit Shah

Amit Shah
  • profile picture
  • Member

Posted 20 March 2015 - 20:01 PM

well that is bound to happen  because you are uploading it correctly but presrving it the wrong way.

instead you need to write a callback to move the uploaded file to the required directory. Post that is done - update the record with the path (ex: the date) ... thats the only additional path required..

by default your upload path should have been set to the folder just before the date.

 

So when u edit / list - it will append the date and the image name in the path - thats it.. you done with..

 

Happy GCing:)


a.zekree

a.zekree
  • profile picture
  • Member

Posted 23 March 2015 - 12:17 PM

Many thanks for your reply.

 

my solution

i checked the current state and on edit i saved the current record image path into a session and use this path to set the upload file and on add state i used the default upload path that works for me .. check the code below

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Designer extends MY_Controller {

  public function index(){    
    // CRUD table
    $this->load->model('designer_model');
    $this->load->helper('crud');
    $this->load->helper('my_dir_helper');

    $crud = generate_crud('designers');

    // state and state info
    $state = $crud->getState();
    $state_info = $crud->getStateInfo();

    // save current designer image name in a session to update it in the db if it is changed
    if($state == 'edit' && $this->uri->segment(4)){
      $current = $this->designer_model->get($this->uri->segment(4));
      $this->session->set_userdata('last_image_name', $current['image']);
      $this->session->set_userdata('last_image_path', $current['image_path']);
    }
    
    // redirect to manual crop image from page
    if($state == 'success' && $this->uri->segment(4)){
      redirect('crop/image_crop/designer/'.$state_info->primary_key);
    }
    
    $crud->columns('title', 'description', 'category_id', 'media_count', 'image', 'move_up_down');
    $crud->display_as('media_count', 'Media Count')
    ->display_as('category_id', 'Category');

    // sert relation
    $crud->set_relation('category_id', 'designer_categories', 'title');

    $crud->required_fields('title', 'category_id', 'image');

    $crud->field_type('slug', 'invisible');
    $crud->field_type('media_count', 'invisible');
    $crud->field_type('created', 'invisible');
    $crud->field_type('updated', 'invisible');
    $crud->field_type('views', 'invisible');
    $crud->field_type('likes', 'invisible');
    $crud->field_type('image_path', 'invisible');
    $crud->field_type('priority', 'invisible');

    // designer ordering
    $crud->callback_column('move_up_down', array($this, 'populate_up_down'));
    $crud->order_by('priority', 'desc');
    $this->session->set_userdata('callableAction', site_url(). '/designer/updatePosition/designers');
    $this->session->set_userdata('primary_key', 'id');
    $crud->set_js("backend.php/designer/dragdrop_js");

    $crud->set_lang_string('form_update_changes','Update designer')
         ->set_lang_string('form_update_and_go_back','Update and go to crop image')
         ->set_lang_string('form_save_and_go_back','Save and go to crop image')
         ->set_lang_string('form_save','Save designer');

    // prepare for file upload
    mkdir_if_not_exists('assets/uploads/fashion-media/'.date('Y').'/'.date('m').'/'.date('d'));

    // set file upload path according to the current controller state
    if($state == 'add' || $state == 'upload_file'){
      $crud->set_field_upload('image','assets/uploads/fashion-media/'.date('Y').'/'.date('m').'/'.date('d'));
    }elseif($state == 'edit' || $state == 'delete_file'){
      $crud->set_field_upload('image', $this->session->userdata('last_image_path'));

      // delete the auto and manual thumb on deleting the original file
      if($state == 'delete_file') {
        // auto thumb
        if(file_exists($this->session->userdata('last_image_path') . '/athumb_' . $this->session->userdata('last_image_name'))){
          unlink($this->session->userdata('last_image_path') . '/athumb_' . $this->session->userdata('last_image_name'));
        }
        
        // manual thumb
        if(file_exists($this->session->userdata('last_image_path') . '/mthumb_' . $this->session->userdata('last_image_name'))){
          unlink($this->session->userdata('last_image_path') . '/mthumb_' . $this->session->userdata('last_image_name'));
        }
      }

    }else{
      $crud->set_field_upload('image','assets/uploads/fashion-media/'.date('Y').'/'.date('m').'/'.date('d'));
    }

    // callback functions
    $crud->callback_before_insert(array($this, 'callback_before_create_designer'));
    $crud->callback_after_insert(array($this, 'callback_after_create_designer'));
    $crud->callback_before_delete(array($this, 'callback_before_delete_designer'));
    $crud->callback_before_update(array($this, 'callback_before_update_designer'));
    $crud->callback_after_upload(array($this, 'callback_after_upload_designer'));
    $crud->callback_column('image',array($this,'callback_image_url'));

    $this->mTitle = "Designers";
    $this->mViewFile = '_partial/crud';
    $this->mViewData['crud_data'] = $crud->render();
  }
}
?>

again thanks for this awesome library it saved my time