* www.linkedin.com/profile/view?id=206267783 * https://github.com/Akshay-Hegde * * @version 1.0.2 ( update callback fix (28-07-2015 13:17:00), function_renamed (11-08-2015 10:24:00 ) ) * @copyright Copyright (c) 2010 through 2014, John Skoumbourdis * @license https://github.com/scoumbourdis/grocery-crud/blob/master/license-grocery-crud.txt * * Thanks * John Skoumbourdis, Amit Shah & Victor */ class Grocery_CRUD_Multiuploader extends grocery_CRUD { protected $callback_read_field = array(); protected $multi_upload_function ; /* multiupload css directory */ protected $multiupload_css_path = 'assets/grocery_crud_multiuploader/styles/'; /* multiupload js directory */ protected $multiupload_javascript_path = 'assets/grocery_crud_multiuploader/scripts/'; /* Default upload directory */ protected $path_to_directory = 'assets/grocery_crud_multiuploader/GC_uploads'; /* No file text on list/read state */ protected $no_file_text = '

Empty

'; /* Anchor text */ protected $enable_full_path = true; /* download button on read state */ protected $enable_download_button = true; /* download button filetypes read state */ protected $download_allowed = null; /* Table where files saved */ protected $file_table; /* Primary Key of table */ protected $primary_key; /* upload Field */ protected $upload_field; /* Allowed file types */ protected $allowed_types = 'gif|jpeg|jpg|png|pdf|doc'; /* Show allowed types - edit state */ protected $show_allowed_types = true; /* Upload options */ protected $hash_fields = array( "upload_field", "allowed_types", "show_allowed_types", "path_to_directory", "no_file_text", "enable_full_path", "enable_download_button", "download_allowed" ); /* Temp storage */ protected $hash = array(); public $basic_model,$ci; /* * Constructor - Initializes and references CI */ public function __construct() { parent::__construct(); $this->ci = &get_instance(); $this->ci->load->model('grocery_CRUD_Model'); $this->basic_model = new grocery_CRUD_Model(); log_message('debug', "Grocery_CRUD_Multiuploader Class Initialized."); } /* /* Callback read field /* Thanks Amit shah for hint... */ public function callback_read_field($field, $callback = null) { $this->callback_read_field[$field] = $callback; return $this; } /* * Nothing much changed added field info */ protected function change_list($list,$types) { $primary_key = $this->get_primary_key(); $has_callbacks = !empty($this->callback_column); $output_columns = $this->get_columns(); foreach($list as $num_row => $row) { foreach($output_columns as $column) { $field_name = $column->field_name; $field_value = isset( $row->{"$column->field_name"} ) ? $row->{"$column->field_name"} : null; if( $has_callbacks && isset($this->callback_column[$field_name]) ) $list[$num_row]->$field_name = call_user_func($this->callback_column[$field_name], $field_value, $row,$this->get_field_types()[$column->field_name]); elseif(isset($types[$field_name])) $list[$num_row]->$field_name = $this->change_list_value($types[$field_name] , $field_value); else $list[$num_row]->$field_name = $field_value; } } return $list; } /* * _is_image * * @access public * @param string * @return boolean */ function _is_image($name) { $imgs = array('.jpg','.png','.jpeg','.gif','.tiff'); $inp = array(substr($name, -4),substr($name, -5)); return count(array_intersect($imgs, $inp)) > 0; } /* * _reset - used for multiple upload field... * * @access public * @param string * @return void */ function _reset($field) { foreach($this->hash_fields as $f){ $this->{"$f"} = $this->hash[$field][$f]; } } /* * remote_file_exists * * @access public * @param string * @return boolean */ function remote_file_exists($url) { return(bool)preg_match( '~HTTP/1\.\d\s+200\s+OK~', @current(get_headers($url)) ); } /* * segment_check * * @access public * @param string * @param string * @return void */ function segment_check($fun, $field) { if($this->ci->input->post("field") && $this->ci->input->post("field") === $field) { $this->_reset($field); $seg = $this->ci->uri->segments; if(!empty($seg)) { if( $seg[count($seg)-1] === $fun && in_array($seg[count($seg)],array('uploade','delete_file')) ) { switch ($seg[count($seg)]) { case 'uploade': $this->multiupload_file(); break; case 'delete_file': $this->delete_multi_file(); break; default: break; } die(); } } } } /* * Callback override fix for callback_before_(insert|update|delete) * * @access protected * @return void */ protected function pre_render() { $this->_initialize_variables(); $this->_initialize_helpers(); $this->_load_language(); $this->state_code = $this->getStateCode(); if($this->basic_model === null) $this->set_default_Model(); $this->set_basic_db_table($this->get_table()); $this->_load_date_format(); $this->_set_primary_keys_to_model(); switch($this->state_code) { case 4 : // before delete $this->_delete_this_key($this->get_state_info_from_url()->first_parameter); break; case 5 : // before insert $_POST = $this->_set_files($_POST); break; case 6 : // before update $_POST = $this->_set_files($_POST,$this->get_state_info_from_url()->first_parameter); break; } } /* * set_callbacks * * @access protected * @param string * @return void */ protected function set_callbacks($file_field) { /* Callback on list state */ $this->callback_column($file_field,array($this,'_file_url')); /* Callback on add state */ $this->callback_add_field($file_field,array($this, 'add_upload_field')); /* Callback on edit state */ $this->callback_edit_field($file_field,array($this, 'edit_upload_fied')); /* Callback on read state */ // GC < 1.5 we have some issue... $version = explode(".",grocery_CRUD::VERSION); switch($version[1]) { case 5: $this->callback_read_field($file_field, array($this,'view_upload_field')); break; default : if($this->getState() == "read") { $this->callback_field($file_field, array($this,'view_upload_field')); }else { $this->callback_read_field($file_field, array($this,'view_upload_field')); } } } /* * new_multi_upload * * @access public * @param upload-field * @param obj/array * @return void */ public function new_multi_upload($field=null, $obj=null) { /* Whether field is null */ if(is_null($field)) { throw new Exception("field is mandotory"); die(); } $this->file_table = $this->basic_db_table; $this->primary_key = $this->primary_key = $this->basic_model->get_primary_key($this->file_table); $this->multi_upload_function = __FUNCTION__; $this->upload_field = $field; /* Whether field exists in table ? */ if(!$this->basic_model->field_exists($this->upload_field,$this->file_table)) { throw new Exception("field : ".$this->upload_field." Not Found in table ".$this->file_table); die(); } /* Override default configuration */ if (!is_null($obj) && is_array($obj) && !empty($obj) ) { foreach ($obj as $k => $v) { if (property_exists($this,$k)) { $this->{"$k"} = $v; }else { log_message('debug', "$k doesn't exists in Grocery_CRUD_Multiuploader."); } } } /* Upload directory exists ? */ if(!file_exists($this->path_to_directory)) { throw new Exception("Directory does not exist : ".$this->path_to_directory); die(); } /* Upload directory has write permission ? */ if(!is_writable($this->path_to_directory)) { throw new Exception("Not writable : ".$this->path_to_directory."\n Current Permission : ".substr(sprintf('%o', fileperms($this->path_to_directory)), -4)); die(); } /* temp storage */ foreach($this->hash_fields as $f){ $this->hash[$field][$f] = $this->{"$f"}; } /* Check whether req is to upload file / delete file */ $this->segment_check(__FUNCTION__,$field); /* Initialize Callbacks */ $this->set_callbacks($field); /* Set Scripts */ $this->set_scripts(); } /* * set_scripts * * @access protected * @return void */ protected function set_scripts() { $css = array( 'assets/grocery_crud/css/ui/simple/' . grocery_CRUD::JQUERY_UI_CSS, 'assets/grocery_crud/css/jquery_plugins/file_upload/file-uploader.css', 'assets/grocery_crud/css/jquery_plugins/file_upload/jquery.fileupload-ui.css', 'assets/grocery_crud/css/jquery_plugins/fancybox/jquery.fancybox.css', $this->multiupload_css_path.'multi_uploader.css', ); $js = array( 'assets/grocery_crud/js/' . grocery_CRUD::JQUERY, 'assets/grocery_crud/js/jquery_plugins/ui/' . grocery_CRUD::JQUERY_UI_JS, 'assets/grocery_crud/js/jquery_plugins/tmpl.min.js', 'assets/grocery_crud/js/jquery_plugins/load-image.min.js', 'assets/grocery_crud/js/jquery_plugins/jquery.iframe-transport.js', 'assets/grocery_crud/js/jquery_plugins/jquery.fileupload.js', 'assets/grocery_crud/js/jquery_plugins/config/jquery.fileupload.config.js', 'assets/grocery_crud/js/jquery_plugins/jquery.fancybox.pack.js', 'assets/grocery_crud/js/jquery_plugins/jquery.easing-1.3.pack.js', 'assets/grocery_crud/js/jquery_plugins/config/jquery.fancybox.config.js', $this->multiupload_javascript_path.'jquery.mousewheel.js', ); foreach($css as $c){ $this->set_css($c); } foreach($js as $c){ $this->set_js($c); } } /* * add_upload_field callback * * @access public * @return string */ function add_upload_field() { $args = func_get_args(); $name = $args[2]->name; $this->_reset( $name ); $html = '
Upload a file '.( $this->show_allowed_types ? ''.str_replace('|',',',$this->allowed_types).'' : null ) .'
'; $html.=$this->JS( $name ); return $html; } function edit_upload_fied($value, $primary_key) { $args = func_get_args(); $name = $args[2]->name; $this->_reset( $name ); $result = $this->ci->db->get_where($this->file_table,array($this->primary_key => $primary_key)); $result = $result->result_array(); if(!empty($result)) { $files = unserialize($result[0][$this->upload_field]); }else { $files = array(); } $html = '
Upload a file '.( $this->show_allowed_types ? ''.str_replace('|',',',$this->allowed_types).'' : null ) .'
'; $html.= ''; $html.='
'; if (!empty($files)) { foreach ($files as $items) { $thisfile = base_url() . $this->path_to_directory . $items ; if($this->remote_file_exists($thisfile)) { if( strpos ($items,"." ) !== false ) { if ($this->_is_image($items) === true) { $html.= '
'; $html.= ''; $html.=''; $html.='
'; $html.='Delete'; $html.='
'; } else { $html.='
' . $items . ' Delete
'; } } } } } $html.='
'; $html.=$this->JS($name); return $html; } /* * JS * @param upload-field * @access protected * @return string */ protected function JS($field=null) { if(is_null($field))return $field; $js = " if (typeof string_progress === 'undefined') { var string_upload_file = 'Upload a file'; var string_delete_file = 'Deleting file'; var string_progress = 'Progress: '; var error_on_uploading = 'An error has occurred on uploading.'; var message_prompt_delete_file = 'Are you sure that you want to delete this file?'; var error_max_number_of_files = 'You can only upload one file each time.'; var error_accept_file_types = 'You are not allow to upload this kind of extension.'; var error_max_file_size = 'The uploaded file exceeds the 5000MB directive that was specified.'; var error_min_file_size = 'You cannot upload an empty file.'; } function delete_" . $this->upload_field . "_svc(link,filename) { $('#" . $this->upload_field . "_multiple_select option[value=\"'+filename+'\"]').remove(); link.parent().remove(); $.post('" . $this->multi_upload_function . "/delete_file', {'file_name':filename,'".$this->ci->security->get_csrf_token_name()."':'".$this->ci->security->get_csrf_hash()."','field':'".$field."','state':window.location.href.substring(window.location.href.lastIndexOf('/') + 1)}, function(json){ if(json.succes == 'true') { console.log('json data', json); } }, 'json'); } $(document).ready(function() { $('#" . $this->upload_field . "_new_multi_upload_field').fileupload({ url: '" . $this->multi_upload_function . "/uploade', sequentialUploads: true, formData:{'".$this->ci->security->get_csrf_token_name()."':'".$this->ci->security->get_csrf_hash()."','field':'".$field."'}, cache: false, autoUpload: true, dataType: 'json', acceptFileTypes: /(\.|\/)(" . $this->ci->config->item('grocery_crud_file_upload_allow_file_types') . ")$/i, limitMultiFileUploads: 1, beforeSend: function() { $('#" . $this->upload_field . "_upload-button-svc').slideUp('fast'); $('#ajax-loader-file').css('display','block'); $('#" . $this->upload_field . "_progress-multiple').css('display','block'); }, progress: function (e, data) { $('#" . $this->upload_field . "_progress-multiple').html(string_progress + parseInt(data.loaded / data.total * 100, 10) + '%'); }, done: function (e, data) { /*console.log(data.result);*/ if(data.result.success == 'false') { alert(data.result.error); $('#" . $this->upload_field . "_upload-button-svc').show('fast'); $('#ajax-loader-file').css('display','none'); $('#" . $this->upload_field . "_progress-multiple').css('display','none'); $('#" . $this->upload_field . "_progress-multiple').html(''); return; } $('#" . $this->upload_field . "_multiple_select').append('