1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
26: class Mage_Dataflow_Model_Session_Adapter_Iterator extends Mage_Dataflow_Model_Convert_Adapter_Abstract
27: {
28: public function walk()
29: {
30: $sessionId = Mage::registry('current_dataflow_session_id');
31: $import = Mage::getResourceModel('dataflow/import');
32: $total = $import->loadTotalBySessionId($sessionId);
33:
34: $callbacks = array();
35: if ($mapperCb = $this->_parseCallback($this->getVar('mapper'), 'mapRow')) {
36: $callbacks[] = $mapperCb;
37: }
38: if ($adapterCb = $this->_parseCallback($this->getVar('adapter'), 'saveRow')) {
39: $callbacks[] = $adapterCb;
40: }
41: $callbacks[] = array($this, 'updateProgress');
42:
43: echo $this->_getProgressBarHtml($sessionId, $total['cnt']);
44:
45: Mage::getModel('core/resource_iterator')
46: ->walk($import->select($sessionId), $callbacks);
47: }
48:
49: protected function _getProgressBarHtml($sessionId, $totalRows)
50: {
51: return '
52: <li>
53: <div style="position:relative">
54: <div id="progress_bar_'.$sessionId.'" style="position:absolute; background:green; height:2px; width:0; top:-2px; left:-2px; overflow:hidden; "></div>
55: <div>
56: '.$this->__('Total records: %s', '<strong>'.$totalRows.'</strong>').',
57: '.$this->__('Processed records: %s', '<strong><span id="records_processed_'.$sessionId.'">0</span></strong>').',
58: '.$this->__('ETA: %s', '<strong><span id="finish_eta_'.$sessionId.'">N/A</span></strong>').',
59: '.$this->__('Memory Used: %s', '<strong><span id="memory_'.$sessionId.'">'.memory_get_usage(true).'</span></strong>').'
60: </div>
61: </div>
62: </li>
63: <script type="text/javascript">
64: function updateProgress(sessionId, idx, time, memory) {
65: var total_rows = '.$totalRows.';
66: var elapsed_time = time-'.time().';
67: var total_time = Math.round(elapsed_time*total_rows/idx);
68: var eta = total_time-elapsed_time;
69: var eta_str = "";
70: var eta_hours = Math.floor(eta/3600);
71: var eta_minutes = Math.floor(eta/60)%60;
72:
73: if (total_rows==idx) {
74: eta_str = "'.$this->__('Done').'";
75: } else if (!eta_hours && !eta_minutes) {
76: eta_str = "'.$this->__('Less than a minute').'";
77: } else {
78: if (eta_hours) {
79: eta_str += eta_hours+" "+(eta_hours>1 ? "'.$this->__('hours').'" : "'.$this->__('hour').'");
80: }
81: if (eta_minutes) {
82: eta_str += eta_minutes+" "+(eta_minutes>1 ? "'.$this->__('minutes').'" : "'.$this->__('minute').'");
83: }
84: }
85:
86: document.getElementById("records_processed_'.$sessionId.'").innerHTML= idx;
87: document.getElementById("finish_eta_'.$sessionId.'").innerHTML = eta_str;
88: document.getElementById("memory_'.$sessionId.'").innerHTML = memory;
89: document.getElementById("progress_bar_'.$sessionId.'").style.width = (idx/total_rows*100)+"%";
90: }
91: </script>';
92: }
93:
94: public function updateProgress($args)
95: {
96: $memory = !empty($args['memory']) ? $args['memory'] : '';
97: echo '<script type="text/javascript">updateProgress("'.$args['row']['session_id'].'", "'.$args['idx'].'", "'.time().'", "'.$memory.'");</script>';
98: echo '<li>'.$memory.'</li>';
99:
100: return array();
101: }
102:
103: protected function _parseCallback($callback, $defaultMethod=null)
104: {
105: if (!preg_match('#^([a-z0-9_/]+)(::([a-z0-9_]+))?$#i', $callback, $match)) {
106: return false;
107: }
108: if (!($model = Mage::getModel($match[1]))) {
109: return false;
110: }
111: if (!($method = $match[3] ? $match[3] : $defaultMethod)) {
112: return false;
113: }
114: return array($model, $method);
115: }
116: }
117: