00001 <?php 00002 00003 class Mage_Dataflow_Model_Session_Adapter_Iterator extends Mage_Dataflow_Model_Convert_Adapter_Abstract 00004 { 00005 public function walk() 00006 { 00007 $sessionId = Mage::registry('current_dataflow_session_id'); 00008 $import = Mage::getResourceModel('dataflow/import'); 00009 $total = $import->loadTotalBySessionId($sessionId); 00010 00011 $callbacks = array(); 00012 if ($mapperCb = $this->_parseCallback($this->getVar('mapper'), 'mapRow')) { 00013 $callbacks[] = $mapperCb; 00014 } 00015 if ($adapterCb = $this->_parseCallback($this->getVar('adapter'), 'saveRow')) { 00016 $callbacks[] = $adapterCb; 00017 } 00018 $callbacks[] = array($this, 'updateProgress'); 00019 00020 echo $this->_getProgressBarHtml($sessionId, $total['cnt']); 00021 00022 Mage::getModel('core/resource_iterator') 00023 ->walk($import->select($sessionId), $callbacks); 00024 } 00025 00026 protected function _getProgressBarHtml($sessionId, $totalRows) 00027 { 00028 return ' 00029 <li> 00030 <div style="position:relative"> 00031 <div id="progress_bar_'.$sessionId.'" style="position:absolute; background:green; height:2px; width:0; top:-2px; left:-2px; overflow:hidden; "></div> 00032 <div> 00033 '.$this->__('Total records: %s', '<strong>'.$totalRows.'</strong>').', 00034 '.$this->__('Processed records: %s', '<strong><span id="records_processed_'.$sessionId.'">0</span></strong>').', 00035 '.$this->__('ETA: %s', '<strong><span id="finish_eta_'.$sessionId.'">N/A</span></strong>').', 00036 '.$this->__('Memory Used: %s', '<strong><span id="memory_'.$sessionId.'">'.memory_get_usage(true).'</span></strong>').' 00037 </div> 00038 </div> 00039 </li> 00040 <script type="text/javascript"> 00041 function updateProgress(sessionId, idx, time, memory) { 00042 var total_rows = '.$totalRows.'; 00043 var elapsed_time = time-'.time().'; 00044 var total_time = Math.round(elapsed_time*total_rows/idx); 00045 var eta = total_time-elapsed_time; 00046 var eta_str = ""; 00047 var eta_hours = Math.floor(eta/3600); 00048 var eta_minutes = Math.floor(eta/60)%60; 00049 00050 if (total_rows==idx) { 00051 eta_str = "'.$this->__('Done').'"; 00052 } else if (!eta_hours && !eta_minutes) { 00053 eta_str = "'.$this->__('Less than a minute').'"; 00054 } else { 00055 if (eta_hours) { 00056 eta_str += eta_hours+" "+(eta_hours>1 ? "'.$this->__('hours').'" : "'.$this->__('hour').'"); 00057 } 00058 if (eta_minutes) { 00059 eta_str += eta_minutes+" "+(eta_minutes>1 ? "'.$this->__('minutes').'" : "'.$this->__('minute').'"); 00060 } 00061 } 00062 00063 document.getElementById("records_processed_'.$sessionId.'").innerHTML= idx; 00064 document.getElementById("finish_eta_'.$sessionId.'").innerHTML = eta_str; 00065 document.getElementById("memory_'.$sessionId.'").innerHTML = memory; 00066 document.getElementById("progress_bar_'.$sessionId.'").style.width = (idx/total_rows*100)+"%"; 00067 } 00068 </script>'; 00069 } 00070 00071 public function updateProgress($args) 00072 { 00073 $memory = !empty($args['memory']) ? $args['memory'] : ''; 00074 echo '<script>updateProgress("'.$args['row']['session_id'].'", "'.$args['idx'].'", "'.time().'", "'.$memory.'");</script>'; 00075 echo '<li>'.$memory.'</li>'; 00076 00077 return array(); 00078 } 00079 00080 protected function _parseCallback($callback, $defaultMethod=null) 00081 { 00082 if (!preg_match('#^([a-z0-9_/]+)(::([a-z0-9_]+))?$#i', $callback, $match)) { 00083 return false; 00084 } 00085 if (!($model = Mage::getModel($match[1]))) { 00086 return false; 00087 } 00088 if (!($method = $match[3] ? $match[3] : $defaultMethod)) { 00089 return false; 00090 } 00091 return array($model, $method); 00092 } 00093 }