fix #7754 - fix download and upload for translations
[Pman.Admin] / Import / Core_templatestr.php
1 <?php
2
3 /**
4  * generic import routine..
5  *
6  * - upload a file..
7  *
8  * - preview the result. / edit?
9  *
10  * - import..
11  * 
12  *
13  */
14
15
16 require_once 'Pman.php';
17 class Pman_Admin_Import_Core_templatestr extends Pman
18 {
19     var $cli  = false;
20      
21      
22      
23     function getAuth()
24     {
25         $cli = HTML_FlexyFramework::get()->cli;
26         if ($cli) {
27             $this->cli = true;
28             return true;
29         }
30         parent::getAuth();
31         $au = $this->getAuthUser();
32         if (!$au) {
33             $this->jerrAuth();
34         }
35         return true;
36     }
37     
38     function post($base = '' )
39     {
40         
41            // should handle uploaded file..
42         if (empty($_FILES['imageUpload']['tmp_name']) || 
43             empty($_FILES['imageUpload']['name']) || 
44             empty($_FILES['imageUpload']['type'])
45         ) {
46             $this->jerr ("Missing file details");
47             exit;
48         }
49         
50         PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array($this, 'onPearError'));
51     
52           
53         $this->transObj = DB_DataObject::factory('core_enum');
54         
55         $this->transObj->query('BEGIN');
56         
57         // first convert the file to a readable format..
58         //$rows = $this->readXLS("/home/alan/Downloads/oll_example.xls") ;
59         $rows = $this->readXLS($_FILES['imageUpload']['tmp_name']) ;
60         
61         $ret = $this->processRows($rows);
62         
63          
64         $this->jok("DONE", false, array('extra'=> $ret));
65         
66     }
67     
68     /*
69     function get($base = '',  $opts = array())
70     {
71         $rows = $this->readXLS("/var/lib/php/sessions/pressrelease-translations.xls") ;
72         
73        
74         
75         $ret = $this->processRows($rows);
76          
77         $this->jdata($ret);
78         exit;
79         
80     }
81     */
82     function processRows($rows)
83     { 
84         $ret = array();
85         foreach($rows as $r) {
86             if (isset($r['table id'])) {
87                 $ret[] = $this->updateTableTranslation($r);
88                 continue;
89             }
90             
91             $ret[] = $this->updateTranslation($r);
92             
93         }
94         return $ret;
95     }        
96     function updateTranslation($r)
97     {
98         // determine the type of file:
99         
100         if (empty($r['template']) || empty($r['module']) || empty($r['code'])) {
101             $this->jerr("missing template / module or code column");
102         }
103
104         if (!isset($r['language'])) {
105             $this->jerr("missing language");
106         }
107
108         // table translation
109         if($r['module'] == 'database') {
110             $arr = explode(':', $r['template']);
111             $r['table'] = $arr[0];
112             $r['column'] = $arr[1];
113             $this->updateTableTranslation($r);
114         }
115         // template translation
116         else {
117             $this->updateTranslationRow($r);
118         }
119         return;
120     }
121     
122     var $seq = 1;
123     function updateTranslationRow($r)
124     {
125         //print_R($r); DB_DataObject::DebugLevel(1);
126         $tr = DB_DataObject::Factory('core_templatestr');
127         $tr->autoJoin();
128
129        
130         $tr->whereAdd("join_template_id_id.template='{$tr->escape($r['template'])}'");
131         $tr->whereAdd("join_template_id_id.view_name='{$tr->escape($r['module'])}'");
132         $tr->whereAdd("join_src_id_id.mdsum='{$tr->escape($r['code'])}'");
133         $tr->lang = $r['language'];
134         if ($tr->find(true)) {
135             $tt = DB_DataObject::Factory('core_templatestr');
136             $tt->get($tr->id);
137             $tr= clone($tt);
138             $tt->txt = $r['translation'];
139             $tt->updated = date('Y-m-d H:i:s');
140             $tt->update($tr);
141             return 1;
142         }
143         return 0;
144     }
145     
146     
147     
148     function updateTableTranslation($r)
149     {
150       //   print_R($r); DB_DataObject::DebugLevel(1);
151         $tr = DB_DataObject::Factory('core_templatestr');
152         $tr->autoJoin();
153
154
155         // update duplicate with same on_table, on_col, mdsum and lang
156         // $tr->whereAdd("core_templatestr.on_id='{$tr->escape($r['table id'])}'");
157         $tr->whereAdd("core_templatestr.on_table='{$tr->escape($r['table'])}'");
158         $tr->whereAdd("core_templatestr.on_col='{$tr->escape($r['column'])}'");
159         $tr->whereAdd("join_src_id_id.mdsum='{$tr->escape($r['code'])}'");
160         $tr->lang = $r['language'];
161
162         $duplicate = $tr->fetchAll('id');
163
164         if(!empty($duplicate)) {
165
166             $t = DB_DataObject::factory('core_templatestr');
167             $t->query(
168             "UPDATE 
169                 core_templatestr
170             SET 
171                 txt = '" . $r['translation'] . "',
172                 updated = '" . date('Y-m-d H:i:s') . "' 
173             WHERE 
174                 id IN (" . implode(',', $duplicate) . ")"
175             );
176             return 1;
177         }
178
179         return 0;
180     }
181     
182     
183     function readXLS($file) {
184         
185         require_once 'System.php';
186         $ssconvert = System::which('ssconvert');
187         if (!$ssconvert) die("ssconvert not installed");
188         $csv = $this->tempName('csv');
189         $cmd = "$ssconvert  -T Gnumeric_stf:stf_csv ". escapeshellarg($file) . ' '.$csv;
190         
191          $data= `$cmd`;
192         
193         clearstatcache();
194          if (!file_exists($csv)) {
195             $this->jerr("Failed to make file . \n".
196                         $cmd . "\n" .
197                         $data
198                         );
199             
200             
201         }
202          //echo $data;
203         $fh = fopen($csv, 'r');
204         if (!$fh) {
205             $this->jerr("file invalid");
206         }
207         $rows = array();
208         $head = false;
209         $blank = 0;
210         while (false !== ($row = fgetcsv($fh))) {
211              
212             if ($head === false) {
213                 
214                 $h = $row;
215                 // skip header lines.
216                 array_shift($h);
217                 if (!strlen(implode('', $h))) {
218                     continue;
219                 }
220                 // how many empty rows..
221                 if (count(explode(',',(rtrim(implode(',', $h), " ,")))) < 3) {
222                     continue;
223                 }
224                 
225                 $head = array();
226                 foreach($row as $i=>$c) {
227                    $c = preg_replace('/[\t \n]+/', ' ', $c);
228                    $head[$i] = strtolower(trim($c));
229                 }
230                 continue;
231             }
232             
233             if (!strlen(trim(implode('', $h)))) {
234                 $blank++;
235                 if ($blank > 3) { 
236                     break;
237                 }
238                 continue;
239             }
240             
241             $blank = 0;
242             $rrow = array();
243             foreach($row as $i=>$c) {
244                 $c = preg_replace('/[\t \n]+/', ' ', $c);
245                 $rrow[$head[$i]] = trim($c);
246             }
247            // var_dump($row);
248           //  print_r($max);
249             $rows[] = $rrow;
250         }
251         unlink($csv);
252         return $rows;
253         
254         
255     }
256     
257 }