Page Menu
Home
In-Portal Phabricator
Search
Configure Global Search
Log In
Files
F1072294
in-portal
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Thu, Jul 24, 1:00 AM
Size
28 KB
Mime Type
text/x-diff
Expires
Sat, Jul 26, 1:00 AM (8 h, 33 m)
Engine
blob
Format
Raw Data
Handle
694917
Attached To
rINP In-Portal
in-portal
View Options
Index: branches/unlabeled/unlabeled-1.20.2/kernel/units/languages/import_xml.php
===================================================================
--- branches/unlabeled/unlabeled-1.20.2/kernel/units/languages/import_xml.php (revision 6553)
+++ branches/unlabeled/unlabeled-1.20.2/kernel/units/languages/import_xml.php (revision 6554)
@@ -1,403 +1,414 @@
<?php
define('LANG_OVERWRITE_EXISTING', 1);
define('LANG_SKIP_EXISTING', 2);
class LangXML_Parser extends kBase {
/**
* Path to current node beeing processed
*
* @var Array
*/
var $path = Array();
/**
* Connection to database
*
* @var kDBConnection
*/
var $Conn = null;
/**
* Fields of language currently beeing processed
*
* @var Array
*/
var $current_language = Array();
/**
* Fields of phrase currently beeing processed
*
* @var Array
*/
var $current_phrase = Array();
/**
* Fields of event currently beeing processed
*
* @var Array
*/
var $current_event = Array();
/**
* Event type + name mapping to id (from system)
*
* @var Array
*/
var $events_hash = Array();
/**
* Phrase types allowed for import/export operations
*
* @var Array
*/
var $phrase_types_allowed = Array();
/**
* Modules allowed for export (import in development)
*
* @var Array
*/
var $modules_allowed = Array();
var $lang_object = null;
var $tables = Array();
var $ip_address = '';
var $import_mode = LANG_SKIP_EXISTING;
var $Encoding = 'base64';
function LangXML_Parser()
{
parent::kBase();
$this->Conn =& $this->Application->GetADODBConnection();
$this->Application->SetVar('lang_mode', 't');
$this->tables['lang'] = $this->prepareTempTable('lang');
$this->lang_object =& $this->Application->recallObject('lang.imp', null, Array('skip_autoload' => true));
$this->tables['phrases'] = $this->prepareTempTable('phrases');
$this->tables['emailmessages'] = $this->prepareTempTable('emailmessages');
$sql = 'SELECT EventId, CONCAT(Event,"_",Type) AS EventMix FROM '.TABLE_PREFIX.'Events';
$this->events_hash = $this->Conn->GetCol($sql, 'EventMix');
$this->ip_address = getenv('HTTP_X_FORWARDED_FOR') ? getenv('HTTP_X_FORWARDED_FOR') : getenv('REMOTE_ADDR');
}
function SetEncoding($enc)
{
$this->Encoding = $enc;
}
function renameTable($table_prefix, $new_name)
{
$this->Conn->Query('ALTER TABLE '.$this->tables[$table_prefix].' RENAME '.$new_name);
$this->tables[$table_prefix] = $new_name;
}
/**
* Create temp table for prefix, if table already exists, then delete it and create again
*
* @param string $prefix
*/
function prepareTempTable($prefix)
{
$idfield = $this->Application->getUnitOption($prefix, 'IDField');
$table = $this->Application->getUnitOption($prefix,'TableName');
$temp_table = $this->Application->GetTempName($table);
$sql = 'DROP TABLE IF EXISTS %s';
$this->Conn->Query( sprintf($sql, $temp_table) );
$sql = 'CREATE TABLE %s SELECT * FROM %s WHERE 0';
$this->Conn->Query( sprintf($sql, $temp_table, $table) );
$sql = 'ALTER TABLE %1$s CHANGE %2$s %2$s INT(11) NOT NULL';
$this->Conn->Query( sprintf($sql, $temp_table, $idfield) );
return $temp_table;
}
function Parse($filename, $phrase_types, $module_ids, $import_mode = LANG_SKIP_EXISTING)
{
// define the XML parsing routines/functions to call based on the handler path
if( !file_exists($filename) || !$phrase_types /*|| !$module_ids*/ ) return false;
$phrase_types = explode('|', substr($phrase_types, 1, -1) );
// $module_ids = explode('|', substr($module_ids, 1, -1) );
$this->phrase_types_allowed = array_flip($phrase_types);
$this->import_mode = $import_mode;
//if (in_array('In-Portal',)
$xml_parser = xml_parser_create();
xml_set_element_handler( $xml_parser, Array(&$this, 'startElement'), Array(&$this, 'endElement') );
xml_set_character_data_handler( $xml_parser, Array(&$this, 'characterData') );
$fdata = file_get_contents($filename);
$ret = xml_parse($xml_parser, $fdata);
xml_parser_free($xml_parser); // clean up the parser object
$this->Application->SetVar('lang_mode', '');
return $ret;
}
function startElement(&$parser, $element, $attributes)
{
array_push($this->path, $element);
$path = implode(' ',$this->path);
//check what path we are in
+ $this->LastLine = xml_get_current_line_number($parser);
+ $this->SecondData = false;
+
switch($path)
{
case 'LANGUAGES LANGUAGE':
$this->current_language = Array('PackName' => $attributes['PACKNAME'], 'LocalName' => $attributes['PACKNAME'], 'Encoding' => $attributes['ENCODING']);
$sql = 'SELECT %s FROM %s WHERE PackName = %s';
$sql = sprintf( $sql,
$this->lang_object->IDField,
$this->Application->GetLiveName($this->lang_object->TableName),
$this->Conn->qstr($this->current_language['PackName']) );
$language_id = $this->Conn->GetOne($sql);
if($language_id)
{
$this->current_language['LanguageId'] = $language_id;
$this->lang_object->SwitchToLive();
$this->lang_object->Load($language_id);
}
break;
case 'LANGUAGES LANGUAGE PHRASES':
case 'LANGUAGES LANGUAGE EVENTS':
if( !getArrayValue($this->current_language,'Charset') ) $this->current_language['Charset'] = 'iso-8859-1';
$this->lang_object->SetFieldsFromHash($this->current_language);
if( !getArrayValue($this->current_language,'LanguageId') )
{
if( $this->lang_object->Create() ) $this->current_language['LanguageId'] = $this->lang_object->GetID();
}
elseif($this->import_mode == LANG_OVERWRITE_EXISTING)
{
$this->lang_object->TableName = $this->Application->getUnitOption($this->lang_object->Prefix, 'TableName');
$this->lang_object->Update();
}
break;
case 'LANGUAGES LANGUAGE PHRASES PHRASE':
$phrase_module = getArrayValue($attributes,'MODULE');
if(!$phrase_module) $phrase_module = 'In-Portal';
$this->current_phrase = Array( 'LanguageId' => $this->current_language['LanguageId'],
'Phrase' => $attributes['LABEL'],
'PhraseType' => $attributes['TYPE'],
'Module' => $phrase_module,
'LastChanged' => adodb_mktime(),
'LastChangeIP' => $this->ip_address,
'Translation' => '');
break;
case 'LANGUAGES LANGUAGE EVENTS EVENT':
$this->current_event = Array( 'LanguageId' => $this->current_language['LanguageId'],
'EventId' => $this->events_hash[ $attributes['EVENT'].'_'.$attributes['TYPE'] ],
'MessageType' => $attributes['MESSAGETYPE'],
'Template' => '');
break;
}
// if($path == 'SHIPMENT PACKAGE')
}
function characterData(&$parser, $line)
{
$line = trim($line);
if(!$line) return ;
$path = join (' ',$this->path);
$language_nodes = Array('DATEFORMAT','TIMEFORMAT','INPUTDATEFORMAT','INPUTTIMEFORMAT','DECIMAL','THOUSANDS','CHARSET','UNITSYSTEM');
$node_field_map = Array('LANGUAGES LANGUAGE DATEFORMAT' => 'DateFormat',
'LANGUAGES LANGUAGE TIMEFORMAT' => 'TimeFormat',
'LANGUAGES LANGUAGE INPUTDATEFORMAT'=> 'InputDateFormat',
'LANGUAGES LANGUAGE INPUTTIMEFORMAT'=> 'InputTimeFormat',
'LANGUAGES LANGUAGE DECIMAL' => 'DecimalPoint',
'LANGUAGES LANGUAGE THOUSANDS' => 'ThousandSep',
'LANGUAGES LANGUAGE CHARSET' => 'Charset',
'LANGUAGES LANGUAGE UNITSYSTEM' => 'UnitSystem');
if( in_array( end($this->path), $language_nodes) )
{
$this->current_language[ $node_field_map[$path] ] = $line;
}
else
{
switch($path)
{
case 'LANGUAGES LANGUAGE PHRASES PHRASE':
if( isset($this->phrase_types_allowed[ $this->current_phrase['PhraseType'] ]) )
{
$this->current_phrase['Translation'] .= $line;
}
break;
case 'LANGUAGES LANGUAGE EVENTS EVENT':
+ $cur_line = xml_get_current_line_number($parser);
+ if ($cur_line != $this->LastLine) {
+ $this->current_event['Template'] .= str_repeat("\r\n", ($cur_line - $this->LastLine) );
+ $this->LastLine = $cur_line;
+ }
$this->current_event['Template'] .= $line;
+
+ $this->SecondData = true;
break;
}
}
}
function endElement(&$parser, $element)
{
$path = implode(' ',$this->path);
switch($path)
{
case 'LANGUAGES LANGUAGE PHRASES PHRASE':
if( isset($this->phrase_types_allowed[ $this->current_phrase['PhraseType'] ]) )
{
if ($this->current_language['Encoding'] == 'plain') {
// nothing to decode!
}
else {
$this->current_phrase['Translation'] = base64_decode($this->current_phrase['Translation']);
}
$this->insertRecord($this->tables['phrases'], $this->current_phrase);
}
break;
case 'LANGUAGES LANGUAGE EVENTS EVENT':
if ($this->current_language['Encoding'] == 'plain') {
+ $this->current_event['Template'] = rtrim($this->current_event['Template']);
// nothing to decode!
}
else {
$this->current_event['Template'] = base64_decode($this->current_event['Template']);
}
$this->insertRecord($this->tables['emailmessages'],$this->current_event);
break;
}
array_pop($this->path);
}
function insertRecord($table, $fields_hash)
{
$fields = '';
$values = '';
foreach($fields_hash as $field_name => $field_value)
{
$fields .= '`'.$field_name.'`,';
$values .= $this->Conn->qstr($field_value).',';
}
$fields = preg_replace('/(.*),$/', '\\1', $fields);
$values = preg_replace('/(.*),$/', '\\1', $values);
$sql = 'INSERT INTO `'.$table.'` ('.$fields.') VALUES ('.$values.')';
$this->Conn->Query($sql);
// return $this->Conn->getInsertID(); // no need because of temp table without auto_increment column at all
}
/**
* Creates XML file with exported language data
*
* @param string $filename filename to export into
* @param Array $phrase_types phrases types to export from modules passed in $module_ids
* @param Array $language_ids IDs of languages to export
* @param Array $module_ids IDs of modules to export phrases from
*/
function Create($filename, $phrase_types, $language_ids, $module_ids)
{
$fp = fopen($filename,'w');
if(!$fp || !$phrase_types || !$module_ids || !$language_ids) return false;
$phrase_types = explode('|', substr($phrase_types, 1, -1) );
$module_ids = explode('|', substr($module_ids, 1, -1) );
$this->events_hash = array_flip($this->events_hash);
$lang_table = $this->Application->getUnitOption('lang','TableName');
$phrases_table = $this->Application->getUnitOption('phrases','TableName');
$emailevents_table = $this->Application->getUnitOption('emailmessages','TableName');
$mainevents_table = $this->Application->getUnitOption('emailevents','TableName');
$phrase_tpl = "\t\t\t".'<PHRASE Label="%s" Module="%s" Type="%s">%s</PHRASE>'."\n";
$event_tpl = "\t\t\t".'<EVENT MessageType="%s" Event="%s" Type="%s">%s</EVENT>'."\n";
$sql = 'SELECT * FROM %s WHERE LanguageId = %s';
$ret = '<LANGUAGES>'."\n";
foreach($language_ids as $language_id)
{
// languages
$row = $this->Conn->GetRow( sprintf($sql, $lang_table, $language_id) );
$ret .= "\t".'<LANGUAGE PackName="'.$row['PackName'].'" Encoding="'.$this->Encoding.'"><DATEFORMAT>'.$row['DateFormat'].'</DATEFORMAT>';
$ret .= '<TIMEFORMAT>'.$row['TimeFormat'].'</TIMEFORMAT><INPUTDATEFORMAT>'.$row['InputDateFormat'].'</INPUTDATEFORMAT>';
$ret .= '<INPUTTIMEFORMAT>'.$row['InputTimeFormat'].'</INPUTTIMEFORMAT><DECIMAL>'.$row['DecimalPoint'].'</DECIMAL>';
$ret .= '<THOUSANDS>'.$row['ThousandSep'].'</THOUSANDS><CHARSET>'.$row['Charset'].'</CHARSET>';
$ret .= '<UNITSYSTEM>'.$row['UnitSystem'].'</UNITSYSTEM>'."\n";
// phrases
$phrases_sql = 'SELECT * FROM '.$phrases_table.' WHERE LanguageId = %s AND PhraseType IN (%s) AND Module IN (%s) ORDER BY Phrase';
if( in_array('In-Portal',$module_ids) ) array_push($module_ids, ''); // for old language packs
$rows = $this->Conn->Query( sprintf($phrases_sql,$language_id, implode(',',$phrase_types), '\''.implode('\',\'',$module_ids).'\'' ) );
if($rows)
{
$ret .= "\t\t".'<PHRASES>'."\n";
foreach($rows as $row)
{
$data = $this->Encoding == 'base64' ? base64_encode($row['Translation']) : '<![CDATA['.$row['Translation'].']]>';
$ret .= sprintf($phrase_tpl, $row['Phrase'], $row['Module'], $row['PhraseType'], $data );
}
$ret .= "\t\t".'</PHRASES>'."\n";
}
// email events
if( in_array('In-Portal',$module_ids) ) unset( $module_ids[array_search('',$module_ids)] ); // for old language packs
$module_sql = preg_replace('/(.*) OR $/', '\\1', preg_replace('/(.*),/U', 'INSTR(Module,\'\\1\') OR ', implode(',', $module_ids).',' ) );
$sql = 'SELECT EventId FROM '.$mainevents_table.' WHERE '.$module_sql;
$event_ids = $this->Conn->GetCol($sql);
if($event_ids)
{
$ret .= "\t\t".'<EVENTS>'."\n";
$event_sql = ' SELECT em.*
FROM '.$emailevents_table.' em
LEFT JOIN '.$mainevents_table.' e ON e.EventId = em.EventId
WHERE em.LanguageId = %s AND em.EventId IN (%s)
ORDER BY e.Event, e.Type';
$rows = $this->Conn->Query( sprintf($event_sql,$language_id, $event_ids ? implode(',',$event_ids) : '' ) );
foreach($rows as $row)
{
list($event_name, $event_type) = explode('_', $this->events_hash[ $row['EventId'] ] );
$data = $this->Encoding == 'base64' ? base64_encode($row['Template']) : '<![CDATA['.$row['Template'].']]>';
$ret .= sprintf($event_tpl, $row['MessageType'], $event_name, $event_type, $data );
}
$ret .= "\t\t".'</EVENTS>'."\n";
}
$ret .= "\t".'</LANGUAGE>'."\n";
}
$ret .= '</LANGUAGES>';
fwrite($fp, $ret);
fclose($fp);
return true;
}
}
?>
\ No newline at end of file
Property changes on: branches/unlabeled/unlabeled-1.20.2/kernel/units/languages/import_xml.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.20
\ No newline at end of property
+1.20.2.1
\ No newline at end of property
Index: branches/unlabeled/unlabeled-1.20.2/core/units/languages/import_xml.php
===================================================================
--- branches/unlabeled/unlabeled-1.20.2/core/units/languages/import_xml.php (revision 6553)
+++ branches/unlabeled/unlabeled-1.20.2/core/units/languages/import_xml.php (revision 6554)
@@ -1,403 +1,414 @@
<?php
define('LANG_OVERWRITE_EXISTING', 1);
define('LANG_SKIP_EXISTING', 2);
class LangXML_Parser extends kBase {
/**
* Path to current node beeing processed
*
* @var Array
*/
var $path = Array();
/**
* Connection to database
*
* @var kDBConnection
*/
var $Conn = null;
/**
* Fields of language currently beeing processed
*
* @var Array
*/
var $current_language = Array();
/**
* Fields of phrase currently beeing processed
*
* @var Array
*/
var $current_phrase = Array();
/**
* Fields of event currently beeing processed
*
* @var Array
*/
var $current_event = Array();
/**
* Event type + name mapping to id (from system)
*
* @var Array
*/
var $events_hash = Array();
/**
* Phrase types allowed for import/export operations
*
* @var Array
*/
var $phrase_types_allowed = Array();
/**
* Modules allowed for export (import in development)
*
* @var Array
*/
var $modules_allowed = Array();
var $lang_object = null;
var $tables = Array();
var $ip_address = '';
var $import_mode = LANG_SKIP_EXISTING;
var $Encoding = 'base64';
function LangXML_Parser()
{
parent::kBase();
$this->Conn =& $this->Application->GetADODBConnection();
$this->Application->SetVar('lang_mode', 't');
$this->tables['lang'] = $this->prepareTempTable('lang');
$this->lang_object =& $this->Application->recallObject('lang.imp', null, Array('skip_autoload' => true));
$this->tables['phrases'] = $this->prepareTempTable('phrases');
$this->tables['emailmessages'] = $this->prepareTempTable('emailmessages');
$sql = 'SELECT EventId, CONCAT(Event,"_",Type) AS EventMix FROM '.TABLE_PREFIX.'Events';
$this->events_hash = $this->Conn->GetCol($sql, 'EventMix');
$this->ip_address = getenv('HTTP_X_FORWARDED_FOR') ? getenv('HTTP_X_FORWARDED_FOR') : getenv('REMOTE_ADDR');
}
function SetEncoding($enc)
{
$this->Encoding = $enc;
}
function renameTable($table_prefix, $new_name)
{
$this->Conn->Query('ALTER TABLE '.$this->tables[$table_prefix].' RENAME '.$new_name);
$this->tables[$table_prefix] = $new_name;
}
/**
* Create temp table for prefix, if table already exists, then delete it and create again
*
* @param string $prefix
*/
function prepareTempTable($prefix)
{
$idfield = $this->Application->getUnitOption($prefix, 'IDField');
$table = $this->Application->getUnitOption($prefix,'TableName');
$temp_table = $this->Application->GetTempName($table);
$sql = 'DROP TABLE IF EXISTS %s';
$this->Conn->Query( sprintf($sql, $temp_table) );
$sql = 'CREATE TABLE %s SELECT * FROM %s WHERE 0';
$this->Conn->Query( sprintf($sql, $temp_table, $table) );
$sql = 'ALTER TABLE %1$s CHANGE %2$s %2$s INT(11) NOT NULL';
$this->Conn->Query( sprintf($sql, $temp_table, $idfield) );
return $temp_table;
}
function Parse($filename, $phrase_types, $module_ids, $import_mode = LANG_SKIP_EXISTING)
{
// define the XML parsing routines/functions to call based on the handler path
if( !file_exists($filename) || !$phrase_types /*|| !$module_ids*/ ) return false;
$phrase_types = explode('|', substr($phrase_types, 1, -1) );
// $module_ids = explode('|', substr($module_ids, 1, -1) );
$this->phrase_types_allowed = array_flip($phrase_types);
$this->import_mode = $import_mode;
//if (in_array('In-Portal',)
$xml_parser = xml_parser_create();
xml_set_element_handler( $xml_parser, Array(&$this, 'startElement'), Array(&$this, 'endElement') );
xml_set_character_data_handler( $xml_parser, Array(&$this, 'characterData') );
$fdata = file_get_contents($filename);
$ret = xml_parse($xml_parser, $fdata);
xml_parser_free($xml_parser); // clean up the parser object
$this->Application->SetVar('lang_mode', '');
return $ret;
}
function startElement(&$parser, $element, $attributes)
{
array_push($this->path, $element);
$path = implode(' ',$this->path);
//check what path we are in
+ $this->LastLine = xml_get_current_line_number($parser);
+ $this->SecondData = false;
+
switch($path)
{
case 'LANGUAGES LANGUAGE':
$this->current_language = Array('PackName' => $attributes['PACKNAME'], 'LocalName' => $attributes['PACKNAME'], 'Encoding' => $attributes['ENCODING']);
$sql = 'SELECT %s FROM %s WHERE PackName = %s';
$sql = sprintf( $sql,
$this->lang_object->IDField,
$this->Application->GetLiveName($this->lang_object->TableName),
$this->Conn->qstr($this->current_language['PackName']) );
$language_id = $this->Conn->GetOne($sql);
if($language_id)
{
$this->current_language['LanguageId'] = $language_id;
$this->lang_object->SwitchToLive();
$this->lang_object->Load($language_id);
}
break;
case 'LANGUAGES LANGUAGE PHRASES':
case 'LANGUAGES LANGUAGE EVENTS':
if( !getArrayValue($this->current_language,'Charset') ) $this->current_language['Charset'] = 'iso-8859-1';
$this->lang_object->SetFieldsFromHash($this->current_language);
if( !getArrayValue($this->current_language,'LanguageId') )
{
if( $this->lang_object->Create() ) $this->current_language['LanguageId'] = $this->lang_object->GetID();
}
elseif($this->import_mode == LANG_OVERWRITE_EXISTING)
{
$this->lang_object->TableName = $this->Application->getUnitOption($this->lang_object->Prefix, 'TableName');
$this->lang_object->Update();
}
break;
case 'LANGUAGES LANGUAGE PHRASES PHRASE':
$phrase_module = getArrayValue($attributes,'MODULE');
if(!$phrase_module) $phrase_module = 'In-Portal';
$this->current_phrase = Array( 'LanguageId' => $this->current_language['LanguageId'],
'Phrase' => $attributes['LABEL'],
'PhraseType' => $attributes['TYPE'],
'Module' => $phrase_module,
'LastChanged' => adodb_mktime(),
'LastChangeIP' => $this->ip_address,
'Translation' => '');
break;
case 'LANGUAGES LANGUAGE EVENTS EVENT':
$this->current_event = Array( 'LanguageId' => $this->current_language['LanguageId'],
'EventId' => $this->events_hash[ $attributes['EVENT'].'_'.$attributes['TYPE'] ],
'MessageType' => $attributes['MESSAGETYPE'],
'Template' => '');
break;
}
// if($path == 'SHIPMENT PACKAGE')
}
function characterData(&$parser, $line)
{
$line = trim($line);
if(!$line) return ;
$path = join (' ',$this->path);
$language_nodes = Array('DATEFORMAT','TIMEFORMAT','INPUTDATEFORMAT','INPUTTIMEFORMAT','DECIMAL','THOUSANDS','CHARSET','UNITSYSTEM');
$node_field_map = Array('LANGUAGES LANGUAGE DATEFORMAT' => 'DateFormat',
'LANGUAGES LANGUAGE TIMEFORMAT' => 'TimeFormat',
'LANGUAGES LANGUAGE INPUTDATEFORMAT'=> 'InputDateFormat',
'LANGUAGES LANGUAGE INPUTTIMEFORMAT'=> 'InputTimeFormat',
'LANGUAGES LANGUAGE DECIMAL' => 'DecimalPoint',
'LANGUAGES LANGUAGE THOUSANDS' => 'ThousandSep',
'LANGUAGES LANGUAGE CHARSET' => 'Charset',
'LANGUAGES LANGUAGE UNITSYSTEM' => 'UnitSystem');
if( in_array( end($this->path), $language_nodes) )
{
$this->current_language[ $node_field_map[$path] ] = $line;
}
else
{
switch($path)
{
case 'LANGUAGES LANGUAGE PHRASES PHRASE':
if( isset($this->phrase_types_allowed[ $this->current_phrase['PhraseType'] ]) )
{
$this->current_phrase['Translation'] .= $line;
}
break;
case 'LANGUAGES LANGUAGE EVENTS EVENT':
+ $cur_line = xml_get_current_line_number($parser);
+ if ($cur_line != $this->LastLine) {
+ $this->current_event['Template'] .= str_repeat("\r\n", ($cur_line - $this->LastLine) );
+ $this->LastLine = $cur_line;
+ }
$this->current_event['Template'] .= $line;
+
+ $this->SecondData = true;
break;
}
}
}
function endElement(&$parser, $element)
{
$path = implode(' ',$this->path);
switch($path)
{
case 'LANGUAGES LANGUAGE PHRASES PHRASE':
if( isset($this->phrase_types_allowed[ $this->current_phrase['PhraseType'] ]) )
{
if ($this->current_language['Encoding'] == 'plain') {
// nothing to decode!
}
else {
$this->current_phrase['Translation'] = base64_decode($this->current_phrase['Translation']);
}
$this->insertRecord($this->tables['phrases'], $this->current_phrase);
}
break;
case 'LANGUAGES LANGUAGE EVENTS EVENT':
if ($this->current_language['Encoding'] == 'plain') {
+ $this->current_event['Template'] = rtrim($this->current_event['Template']);
// nothing to decode!
}
else {
$this->current_event['Template'] = base64_decode($this->current_event['Template']);
}
$this->insertRecord($this->tables['emailmessages'],$this->current_event);
break;
}
array_pop($this->path);
}
function insertRecord($table, $fields_hash)
{
$fields = '';
$values = '';
foreach($fields_hash as $field_name => $field_value)
{
$fields .= '`'.$field_name.'`,';
$values .= $this->Conn->qstr($field_value).',';
}
$fields = preg_replace('/(.*),$/', '\\1', $fields);
$values = preg_replace('/(.*),$/', '\\1', $values);
$sql = 'INSERT INTO `'.$table.'` ('.$fields.') VALUES ('.$values.')';
$this->Conn->Query($sql);
// return $this->Conn->getInsertID(); // no need because of temp table without auto_increment column at all
}
/**
* Creates XML file with exported language data
*
* @param string $filename filename to export into
* @param Array $phrase_types phrases types to export from modules passed in $module_ids
* @param Array $language_ids IDs of languages to export
* @param Array $module_ids IDs of modules to export phrases from
*/
function Create($filename, $phrase_types, $language_ids, $module_ids)
{
$fp = fopen($filename,'w');
if(!$fp || !$phrase_types || !$module_ids || !$language_ids) return false;
$phrase_types = explode('|', substr($phrase_types, 1, -1) );
$module_ids = explode('|', substr($module_ids, 1, -1) );
$this->events_hash = array_flip($this->events_hash);
$lang_table = $this->Application->getUnitOption('lang','TableName');
$phrases_table = $this->Application->getUnitOption('phrases','TableName');
$emailevents_table = $this->Application->getUnitOption('emailmessages','TableName');
$mainevents_table = $this->Application->getUnitOption('emailevents','TableName');
$phrase_tpl = "\t\t\t".'<PHRASE Label="%s" Module="%s" Type="%s">%s</PHRASE>'."\n";
$event_tpl = "\t\t\t".'<EVENT MessageType="%s" Event="%s" Type="%s">%s</EVENT>'."\n";
$sql = 'SELECT * FROM %s WHERE LanguageId = %s';
$ret = '<LANGUAGES>'."\n";
foreach($language_ids as $language_id)
{
// languages
$row = $this->Conn->GetRow( sprintf($sql, $lang_table, $language_id) );
$ret .= "\t".'<LANGUAGE PackName="'.$row['PackName'].'" Encoding="'.$this->Encoding.'"><DATEFORMAT>'.$row['DateFormat'].'</DATEFORMAT>';
$ret .= '<TIMEFORMAT>'.$row['TimeFormat'].'</TIMEFORMAT><INPUTDATEFORMAT>'.$row['InputDateFormat'].'</INPUTDATEFORMAT>';
$ret .= '<INPUTTIMEFORMAT>'.$row['InputTimeFormat'].'</INPUTTIMEFORMAT><DECIMAL>'.$row['DecimalPoint'].'</DECIMAL>';
$ret .= '<THOUSANDS>'.$row['ThousandSep'].'</THOUSANDS><CHARSET>'.$row['Charset'].'</CHARSET>';
$ret .= '<UNITSYSTEM>'.$row['UnitSystem'].'</UNITSYSTEM>'."\n";
// phrases
$phrases_sql = 'SELECT * FROM '.$phrases_table.' WHERE LanguageId = %s AND PhraseType IN (%s) AND Module IN (%s) ORDER BY Phrase';
if( in_array('In-Portal',$module_ids) ) array_push($module_ids, ''); // for old language packs
$rows = $this->Conn->Query( sprintf($phrases_sql,$language_id, implode(',',$phrase_types), '\''.implode('\',\'',$module_ids).'\'' ) );
if($rows)
{
$ret .= "\t\t".'<PHRASES>'."\n";
foreach($rows as $row)
{
$data = $this->Encoding == 'base64' ? base64_encode($row['Translation']) : '<![CDATA['.$row['Translation'].']]>';
$ret .= sprintf($phrase_tpl, $row['Phrase'], $row['Module'], $row['PhraseType'], $data );
}
$ret .= "\t\t".'</PHRASES>'."\n";
}
// email events
if( in_array('In-Portal',$module_ids) ) unset( $module_ids[array_search('',$module_ids)] ); // for old language packs
$module_sql = preg_replace('/(.*) OR $/', '\\1', preg_replace('/(.*),/U', 'INSTR(Module,\'\\1\') OR ', implode(',', $module_ids).',' ) );
$sql = 'SELECT EventId FROM '.$mainevents_table.' WHERE '.$module_sql;
$event_ids = $this->Conn->GetCol($sql);
if($event_ids)
{
$ret .= "\t\t".'<EVENTS>'."\n";
$event_sql = ' SELECT em.*
FROM '.$emailevents_table.' em
LEFT JOIN '.$mainevents_table.' e ON e.EventId = em.EventId
WHERE em.LanguageId = %s AND em.EventId IN (%s)
ORDER BY e.Event, e.Type';
$rows = $this->Conn->Query( sprintf($event_sql,$language_id, $event_ids ? implode(',',$event_ids) : '' ) );
foreach($rows as $row)
{
list($event_name, $event_type) = explode('_', $this->events_hash[ $row['EventId'] ] );
$data = $this->Encoding == 'base64' ? base64_encode($row['Template']) : '<![CDATA['.$row['Template'].']]>';
$ret .= sprintf($event_tpl, $row['MessageType'], $event_name, $event_type, $data );
}
$ret .= "\t\t".'</EVENTS>'."\n";
}
$ret .= "\t".'</LANGUAGE>'."\n";
}
$ret .= '</LANGUAGES>';
fwrite($fp, $ret);
fclose($fp);
return true;
}
}
?>
\ No newline at end of file
Property changes on: branches/unlabeled/unlabeled-1.20.2/core/units/languages/import_xml.php
___________________________________________________________________
Modified: cvs2svn:cvs-rev
## -1 +1 ##
-1.20
\ No newline at end of property
+1.20.2.1
\ No newline at end of property
Event Timeline
Log In to Comment