source: trunk/export/export.php@ 506

Last change on this file since 506 was 506, checked in by chronos, 12 years ago
  • Upraveno: Části týkající se generování stránky přesunuty z global.php do souboru Page.php.
  • Upraveno: Obecné funkce sloučeny z global_function.php do global.php.
  • Upraveno: Zrušeno načítání globálního seznamu jazyků na začátku souboru global.php. Seznam se načte podle potřeby až samotnými skripty.
File size: 17.2 KB
Line 
1<?php
2
3include_once('../includes/system.php');
4
5class Export extends Module
6{
7 var $Id;
8 var $AnoNe = array('Ne', 'Ano');
9 var $WhereLang;
10 var $WhereUsers;
11 var $SelectedUsers;
12 var $UserNames;
13 var $ClientVersion;
14 var $OrderByUserList;
15
16 function Init()
17 {
18 $this->TempDir = $this->Config['Web']['TempFolder'].'Export/'.$this->Id.'/';
19 if(!file_exists($this->TempDir)) mkdir($this->TempDir, 0777, true);
20 }
21
22 function LoadFilters()
23 {
24 $DbResult = $this->Database->query('SELECT * FROM `Export` WHERE `Id`='.$this->Id);
25 if($DbResult->num_rows == 0) throw new Exception('Export '.$this->Id.' neexistuje');
26 $this->Export = $DbResult->fetch_assoc();
27
28 // Filter selected users
29 $this->UserNames = '';
30 $DbResult = $this->Database->query('SELECT `ExportUser`.*, `User`.`Name`, `User`.`ID` FROM `ExportUser` LEFT JOIN `User` ON `User`.`ID`=`ExportUser`.`User` WHERE `ExportUser`.`Export`='.$this->Id.' ORDER BY `ExportUser`.`Sequence`');
31 while($UserLine = $DbResult->fetch_assoc())
32 {
33 $this->UserNames .= ', '.$UserLine['Name'];
34 }
35 $this->UserNames = substr($this->UserNames, 2);
36
37 $DbResult = $this->Database->query('SELECT * FROM `ClientVersion` WHERE `Id`='.$this->Export['ClientVersion']);
38 $this->ClientVersion = $DbResult->fetch_assoc();
39 }
40
41 function BuildQuery($Group, $Columns = '', $Version = '')
42 {
43 global $TranslationTree;
44
45 if ($Version <> '')
46 $ExportVersion = $Version;
47 else
48 $ExportVersion = $this->ClientVersion['BuildNumber'];
49
50 $Query = 'SELECT * FROM (SELECT `T`.*, '.$Columns.'`User`.`Name` AS `UserName` FROM `'.$Group['TablePrefix'].'` AS `T`'.
51 ' JOIN `ExportUser` ON (`ExportUser`.`User`=`T`.`User`) AND (`ExportUser`.`Export`='.$this->Id.') '.
52 ' JOIN `User` ON `User`.`ID`=`T`.`User`'.
53 ' JOIN `ExportLanguage` ON (`ExportLanguage`.`Export`='.$this->Id.')'.
54 ' WHERE (`Complete` = 1) AND (`VersionStart` <= '.$ExportVersion.') AND (`VersionEnd` >= '.$ExportVersion.')'.
55 ' ORDER BY `ExportLanguage`.`Sequence`, `ExportUser`.`Sequence`) AS `TT` GROUP BY `TT`.`Entry`';
56
57 // Build columns for english texts
58 $OriginalColumns = '';
59 foreach($TranslationTree[$Group['Id']]['Items'] as $Column)
60 $OriginalColumns .= ' `T3`.`'.$Column['Column'].'` AS `En'.$Column['Column'].'`, ';
61 $OriginalColumns = substr($OriginalColumns, 0, -2);
62
63 // Expand query for loading english texts
64 $Query = 'SELECT `T4`.*, '.$OriginalColumns.' FROM ('.$Query.') AS `T4` '.
65 ' LEFT JOIN `'.$Group['TablePrefix'].'` AS `T3` ON (`T3`.`Entry` = `T4`.`Entry`) AND (`T3`.`Language` = 0) AND (`T3`.`VersionStart` = `T4`.`VersionStart`) AND (`T3`.`VersionEnd` = `T4`.`VersionEnd`)';
66
67 return($Query);
68 }
69
70 function ExportToMangosSQL()
71 {
72 global $TranslationTree, $User, $Config;
73
74 $this->LoadFilters();
75
76 $Buffer =
77 "-- Generováno projektem wowpreklad.zdechov.net\n".
78 "-- ===========================================\n".
79 "--\n".
80 "-- Web projektu: ".$this->Config['Web']['Host'].$this->System->Link('/')."\n".
81 "-- Datum exportu: ".date("j.n.Y H:i:s")."\n".
82 "-- Znaková sada: ".$this->Config['Database']['Charset']." / ".$this->Config['Web']['Charset']."\n".
83 "-- Diakritika: ".$this->AnoNe[$this->Export['WithDiacritic']]."\n".
84 "-- Vygeneroval uživatel: ".$User->Name."\n".
85 "-- Vzato od uživatelů: ".$this->UserNames."\n".
86 "-- Generované tabulky: ";
87
88 $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id);
89 while($Group = $DbResult->fetch_assoc())
90 {
91 $Buffer .= $Group['TablePrefix'].', ';
92 }
93 $Buffer .= "\n\n";
94
95 $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id);
96 while($Group = $DbResult->fetch_assoc())
97 {
98 if($Group['MangosTable'] != '')
99 {
100 $Buffer .= "\n\n-- ".$Group['Name']."\n\n";
101 $DbResult2 = $this->Database->query($this->BuildQuery($Group));
102 if($DbResult2->num_rows > 0)
103 while($Line = $DbResult2->fetch_array())
104 {
105 $Values = '';
106 foreach($TranslationTree[$Group['Id']]['Items'] as $GroupItem)
107 if($GroupItem['Column'] != $Group['PrimaryKeyItem']) // Do not update primary key
108 {
109 if($GroupItem['MangosColumn'] == '') $GroupItem['MangosColumn'] = $GroupItem['Column'];
110 $Values .= ', `'.$GroupItem['MangosColumn'].'`="'.addslashes($Line[$GroupItem['Column']]).'"';
111 }
112 $Values = substr($Values, 2);
113
114 // Get multicolumn index
115 $ColumnItems = explode(',', $Group['MangosTableIndex']);
116 if(count($ColumnItems) > 1)
117 {
118 $Where = 'CONCAT(';
119 foreach($ColumnItems as $ColumnItem)
120 $Where .= '`'.$ColumnItem.'`, "_", ';
121 $Where = substr($Where, 0, -7).')';
122 } else $Where = '`'.$Group['MangosTableIndex'].'`';
123 $Where .= ' = "'.$Line[$Group['PrimaryKeyItem']].'";';
124
125 $Line = 'UPDATE `'.$Group['MangosTable'].'` SET '.$Values.' WHERE '.$Where;
126 $Line = str_replace("\n", '\n', $Line);
127 $Line = str_replace("\r", '', $Line);
128 $Buffer .= $Line."\n";
129 }
130 }
131 }
132 if($this->Export['WithDiacritic'] != 1) $Buffer = utf2ascii($Buffer);
133 return($Buffer);
134 }
135
136 function ExportToAoWoWSQL()
137 {
138 global $Config, $TranslationTree, $AoWoWconf;
139
140 require_once('../aowow/configs/config.php');
141
142 $Buffer = $this->ExportToMangosSQL();
143
144 /*
145 // Data to aowow
146 $Database2 = new mysqli($this->Config['Database']['Host'], $this->Config['Database']['User'], $this->Config['Database']['Password'], $this->Config['Database']['Database']);
147 $Database2->query('SET NAMES '.$this->Config['Database']['Charset']);
148 $Database2->select_db($AoWoWconf['mangos']['db']);
149 $AoWoWTables = array(
150 'aowow_resistances' => 'Id',
151 'aowow_spelldispeltype' => 'Id',
152 'aowow_skill' => 'skillID',
153 );
154 foreach($AoWoWTables as $AoWoWTable => $IndexColum)
155 {
156 $Buffer .= '--'.$AoWoWTable.', ';
157 $Buffer .= "\n\n";
158 $Query = 'SELECT `name`,`'.$IndexColum.'` FROM `'.$AoWoWTable.'`';
159 $DbResult = $Database2->query($Query);
160 while($Line = $DbResult->fetch_assoc())
161 {
162 $Ori_text = $Line['name'];
163 $DbResult2 = $Database2->query('SELECT `Text` AS `En`,
164 (SELECT `Text` FROM `'.$Config['Database']['Database'].'`.`TextGlobalString` AS `TableTran`
165 WHERE `TableEn`.`Entry` = `TableTran`.`Entry` AND (`Complete` = 1) AND '.$this->WhereLang.' AND '.$this->WhereUsers.$this->OrderByUserList.' LIMIT 1) AS `Tran`
166 FROM `'.$Config['Database']['Database'].'`.`TextGlobalString` AS `TableEn` WHERE
167 `Text` = "'.addslashes($Ori_text).'" LIMIT 1');
168 $Tran = $DbResult2->fetch_assoc();
169 //echo ($Line['name'].'='.$Tran['tran']);
170 if($Tran['Tran'] == '')
171 {
172 $DbResult2 = $Database2->query('SELECT `OptionText` AS `En`,
173 (SELECT `OptionText` FROM `'.$this->Config['Database']['Database'].'`.`TextNPCOption` AS `TableTran`
174 WHERE `TableEn`.`Entry` = `TableTran`.`Entry` AND (`Complete` = 1) AND '.$this->WhereLang.'
175 AND '.$this->WhereUsers.$this->OrderByUserList.' LIMIT 1) AS `Tran`
176 FROM `'.$this->Config['Database']['Database'].'`.`TextNPCOption` AS `TableEn` WHERE
177 `OptionText` = "'.addslashes($Ori_text).'" LIMIT 1');
178 $Tran = $DbResult2->fetch_assoc();
179 }
180
181 if($Tran['Tran'] <> '')
182 $Buffer .= 'UPDATE `'.$AoWoWTable.'` SET `name` = "'.addslashes($Tran['Tran']).'" WHERE '.$IndexColum.' = '.$Line[$IndexColum].' ;'."\n";
183 }
184 $Buffer .= "\n\n";
185 }
186 */
187 if($this->Export['WithDiacritic'] != 1) $Buffer = utf2ascii($Buffer);
188 return($Buffer);
189 }
190
191
192 function ExportToXML()
193 {
194 global $TranslationTree, $User;
195
196 $this->LoadFilters($this->Id);
197
198 $Buffer = '<?xml version="1.0" encoding="utf-8"?>'."\n".
199 "<document>\n".
200 " <meta>\n".
201 " <projecturl>".$this->Config['Web']['Host'].$this->System->Link('/')."</projecturl>\n".
202 " <time>".date('r')."</time>\n".
203 " <diacritics mode=".'"'.$this->Export['WithDiacritic'].'"'." />\n".
204 " <author>".$User->Name."</author>\n".
205 " <contributors>\n";
206 foreach(explode(',', $this->UserNames) as $UserName)
207 $Buffer .= " <user>".$UserName."</user>\n";
208 $Buffer .=
209 " </contributors>\n".
210 " </meta>\n".
211 " <translation>\n";
212
213 $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id);
214 while($Group = $DbResult->fetch_assoc())
215 {
216 if($Group['MangosTable'] == '')
217 {
218 $Group['MangosTable'] = $Group['TablePrefix'];
219 $Group['MangosTableIndex'] = 'entry';
220 }
221 $Buffer .= ' <group id="'.$Group['Id'].'" name="'.$Group['TablePrefix'].'">'."\n";
222 $DbResult2 = $this->Database->query($this->BuildQuery($Group));
223 while($Line = $DbResult2->fetch_assoc())
224 {
225 $Buffer .= ' <item id="'.$Line['Entry'].'" user="'.$Line['UserName'].'">'."\n";
226 $Values = '';
227 foreach($TranslationTree[$Group['Id']]['Items'] as $GroupItem)
228 {
229 if($GroupItem['MangosColumn'] == '') $GroupItem['MangosColumn'] = $GroupItem['Column'];
230 if($Line[$GroupItem['Column']] != '')
231 $Buffer .= ' <text index="'.$GroupItem['Id'].'" name="'.$GroupItem['Column'].'">'.addslashes($Line[$GroupItem['Column']]).'</text>'."\n";
232 }
233 $Buffer .= " </item>\n";
234 }
235 $Buffer .= " </group>\n";
236 }
237 if($this->Export['WithDiacritic'] != 1) $Buffer = utf2ascii($Buffer);
238 $Buffer .= " </translation>\n".
239 "</document>";
240 return($Buffer);
241 }
242
243 function ExportToDBC()
244 {
245 global $TranslationTree, $Config;
246
247 $this->LoadFilters();
248
249 $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id.' AND `Group`.`DBCFileName` != ""');
250 $Output = 'Počet generovaných skupin: '.$DbResult->num_rows."\n";
251 while($Group = $DbResult->fetch_assoc())
252 {
253 $Output .= $Group['Name'].', ';
254 if(file_exists('../source/'.$this->ClientVersion['Version'].'/dbc/'.$Group['DBCFileName'].'.dbc'))
255 {
256 // Load string column index list
257 $DbResult2 = $this->Database->query('SELECT * FROM `GroupItem` JOIN `GroupItemDBC` ON `GroupItem`.`Id` = `GroupItemDBC`.`GroupItem` AND `GroupItemDBC`.`ClientVersion` = '.$this->ClientVersion['Id'].' WHERE `GroupItem`.`Group` = '.$Group['Id']);
258 $ColumnIndexes = array();
259 $ColumnFormat = array();
260 while($DbRow = $DbResult2->fetch_assoc())
261 {
262 $ColumnFormat[$DbRow['ColumnIndex']] = FORMAT_STRING;
263 $ColumnIndexes[$DbRow['GroupItem']] = $DbRow['ColumnIndex'];
264 }
265
266 // Load all data into lookup table
267 $LookupTable = array();
268 $DbResult2 = $this->Database->query($this->BuildQuery($Group));
269 while($DbRow = $DbResult2->fetch_assoc())
270 $LookupTable[$DbRow[$Group['PrimaryKeyItem']]] = $DbRow;
271
272 // Open original DBC file
273 $SourceDBCFile = new DBCFile();
274 $SourceDBCFile->OpenFile('../source/'.$this->ClientVersion['Version'].'/dbc/'.$Group['DBCFileName'].'.dbc', $ColumnFormat);
275
276 // Create new DBC file
277 if(!file_exists($this->TempDir.'dbc/')) mkdir ($this->TempDir.'dbc/', 0777, true);
278 $NewDBCFile = new DBCFile();
279 $NewDBCFile->CreateFile($this->TempDir.'dbc/'.$Group['DBCFileName'].'.dbc', $ColumnFormat);
280 $NewDBCFile->SetRecordCount($SourceDBCFile->GetRecordCount());
281 $NewDBCFile->SetFieldCount($SourceDBCFile->GetFieldCount());
282 $NewDBCFile->Commit();
283
284 // Replace translated strings
285 $OldProgress = -1;
286 $Output .= "\n\r";
287 $RowCount = $SourceDBCFile->GetRecordCount();
288 $FieldCount = $SourceDBCFile->GetFieldCount();
289 for($Row = 0; $Row < $RowCount; $Row++)
290 {
291 $Line = $SourceDBCFile->GetLine($Row);
292
293 // Get multicolumn index value
294 $PrimaryKeyItem = '';
295 $ColumnItems = explode(',', $Group['DBCIndex']);
296 if(count($ColumnItems) > 1)
297 {
298 foreach($ColumnItems as $ColumnItem)
299 $PrimaryKeyItem .= $Line[$ColumnItem].'_';
300 $PrimaryKeyItem = substr($PrimaryKeyItem, 0, -1);
301 } else $PrimaryKeyItem = $Line[$Group['DBCIndex']];
302
303 if(array_key_exists($PrimaryKeyItem, $LookupTable))
304 {
305 // Replace text columns
306 $LookupTableItem = $LookupTable[$PrimaryKeyItem];
307 foreach($TranslationTree[$Group['Id']]['Items'] as $GroupItem)
308 {
309 if(array_key_exists($GroupItem['Id'], $ColumnIndexes))
310 $Line[$ColumnIndexes[$GroupItem['Id']]] = $LookupTableItem[$GroupItem['Column']];
311 }
312 }
313 $NewDBCFile->SetLine($Row, $Line);
314
315 // Show completion progress
316 $Progress = round($Row / $RowCount * 100);
317 if($Progress != $OldProgress)
318 {
319 $Output .= $Progress."%\r";
320 $OldProgress = $Progress;
321 }
322 }
323 $NewDBCFile->Commit();
324 } else $Output .= ShowMessage('Zdrojový soubor '.'../source/'.$this->ClientVersion['Version'].'/dbc/'.$Group['DBCFileName'].'.dbc'.' nenalezen.'."\n", MESSAGE_CRITICAL);
325 }
326 $Output .= 'Hotovo <br />';
327 return($Output);
328 }
329
330 function ExportToLua()
331 {
332 global $TranslationTree;
333
334 $this->LoadFilters();
335
336 $Output = '';
337 if(!file_exists($this->TempDir.'lua/')) mkdir($this->TempDir.'lua/', 0777, true);
338 $DbResult = $this->Database->query('SELECT `Group`.* FROM `ExportGroup` JOIN `Group` ON `Group`.`Id` = `ExportGroup`.`Group` WHERE `ExportGroup`.`Export`='.$this->Id.' AND `Group`.`LuaFileName` != ""');
339 while($Group = $DbResult->fetch_assoc())
340 {
341 $Output .= $Group['Name'].'... ';
342 $File = new FileStream();
343 $File->OpenFile('../source/'.$this->ClientVersion['Version'].'/lua/'.$Group['LuaFileName'].'.lua');
344 $File2 = new FileStream();
345 $File2->CreateFile($this->TempDir.'lua/'.$Group['LuaFileName'].'.lua');
346
347 $LookupTable = array();
348 $DbResult2 = $this->Database->query($this->BuildQuery($Group));
349 while($DbRow = $DbResult2->fetch_assoc())
350 $LookupTable[$DbRow['ShortCut']] = $DbRow;
351 //print_r($LookupTable);
352
353 while(!$File->EOF())
354 {
355 $Line = $File->ReadLine();
356 if(strpos($Line, '=') !== false)
357 {
358 $LineParts = explode('=', $Line, 2);
359 $Value['ShortCut'] = trim($LineParts[0]);
360 $Line = trim($LineParts[1]);
361 if($Line[0] == '"')
362 {
363 // Quoted string value
364 $Line = substr($Line, 1); // Skip start qoute
365 $TempLine = str_replace('\"', ' ', $Line); // Temporary remove slashed quotes
366 $Value['Text'] = substr($Line, 0, strpos($TempLine, '"'));
367// $Value['Text'] = str_replace('\n', "\n", $Value['Text']);
368// $Value['Text'] = addslashes(stripslashes($Value['Text']));
369 $Line = trim(substr($Line, strpos($TempLine, '"') + 1)); // Skip closing quote and semicolon {
370 } else
371 {
372 // Nonstring value
373 $Value['Text'] = substr($Line, 0, strpos($Line, ';'));
374 }
375 $Line = substr($Line, strpos($Line, ';') + 1);
376 $Value['Comment'] = addslashes(stripslashes(substr($Line, 3))); // Skip " --"
377
378 if(array_key_exists($Value['ShortCut'], $LookupTable))
379 {
380 $DbRow = $LookupTable[$Value['ShortCut']];
381 $Value['Text'] = addslashes($DbRow['Text']);
382 // Escape new line control characters
383 $Value['Text'] = str_replace("\n", '\n', $Value['Text']);
384 $Value['Text'] = str_replace("\r", '', $Value['Text']);
385 $Value['Comment'] = $DbRow['Comment'];
386 // Only one line comments allowed
387 $Value['Comment'] = str_replace("\n", ' ', $Value['Comment']);
388 $Value['Comment'] = str_replace("\r", '', $Value['Comment']);
389 //echo('.');
390 }
391 $NewLine = $Value['ShortCut'].' = "'.$Value['Text'].'";';
392 //if($Value['Comment'] != '') $NewLine .= ' -- '.$Value['Comment'];
393 $NewLine .= "\r\n";
394 $File2->WriteLine($NewLine);
395 } else $File2->WriteLine($Line);
396 }
397 $Output .= 'Hotovo <br/>';
398 }
399 return($Output);
400 }
401}
402
403?>
Note: See TracBrowser for help on using the repository browser.