Page Menu
Home
In-Portal Phabricator
Search
Configure Global Search
Log In
Files
F1051307
languages_event_handler.php
No One
Temporary
Actions
Download 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 3, 10:09 PM
Size
12 KB
Mime Type
text/x-php
Expires
Sat, Jul 5, 10:09 PM (1 d, 3 h)
Engine
blob
Format
Raw Data
Handle
679236
Attached To
rINP In-Portal
languages_event_handler.php
View Options
<?php
class
LanguagesEventHandler
extends
InpDBEventHandler
{
/**
* Updates table structure on new language adding/removing language
*
* @param kEvent $event
*/
function
OnReflectMultiLingualFields
(
$event
)
{
$table_name
=
$this
->
Application
->
getUnitOption
(
$event
->
Prefix
,
'TableName'
);
$languages_count
=
$this
->
Conn
->
GetOne
(
'SELECT COUNT(*) FROM '
.
$table_name
);
$languages_count
=
$languages_count
+
5
-
(
$languages_count
%
5
?
(
$languages_count
%
5
)
:
5
);
$sqls
=
Array
();
$unit_config_reader
=&
$this
->
Application
->
recallObject
(
'kUnitConfigReader'
);
foreach
(
$unit_config_reader
->
configData
as
$prefix
=>
$config_data
)
{
$table_name
=
getArrayValue
(
$config_data
,
'TableName'
);
$fields
=
getArrayValue
(
$config_data
,
'Fields'
);
if
(!(
$table_name
&&
$fields
)
)
continue
;
foreach
(
$fields
as
$field_name
=>
$field_options
)
{
if
(
isset
(
$field_options
[
'formatter'
])
&&
$field_options
[
'formatter'
]
==
'kMultiLanguage'
)
{
$describe
=
$this
->
Conn
->
Query
(
'DESCRIBE '
.
$table_name
.
'
\'
l%_'
.
$field_name
.
'
\'
'
);
$created_count
=
count
(
$describe
);
if
(!
$describe
)
{
// no multilingual fields at all
$describe
=
$this
->
Conn
->
Query
(
'DESCRIBE '
.
$table_name
.
'
\'
'
.
$field_name
.
'
\'
'
);
$created_count
=
0
;
}
if
(!
$describe
)
continue
;
$field_mask
=
'l%s_'
.
$field_name
.
' '
.
$describe
[
0
][
'Type'
];
$create_count
=
$languages_count
-
$created_count
;
if
(
$create_count
>
0
)
{
$sqls
[]
=
'ALTER TABLE '
.
$table_name
.(
$this
->
generateAlterSQL
(
$field_mask
,
$created_count
+
1
,
$create_count
)
);
}
}
}
}
if
(
$sqls
)
$this
->
Conn
->
Query
(
implode
(
"
\n
"
,
$sqls
)
);
}
/**
* Shows only enabled languages on front
*
* @param kEvent $event
*/
function
SetCustomQuery
(&
$event
)
{
if
(
$event
->
Special
==
'enabled'
)
{
$object
=&
$event
->
getObject
();
$object
->
addFilter
(
'enabled_filter'
,
'%1$s.Enabled = 1'
);
}
}
/**
* Returns ALTER statement part for adding required fields to table
*
* @param string $field_mask sql mask for creating field with correct definition (type & size)
* @param int $start_index add new fields starting from this index
* @param int $create_count create this much new multilingual field translations
* @return string
*/
function
generateAlterSQL
(
$field_mask
,
$start_index
,
$create_count
)
{
$i_count
=
$start_index
+
$create_count
;
$ret
=
''
;
while
(
$start_index
<
$i_count
)
{
list
(
$prev_field
,
$type
)
=
explode
(
' '
,
sprintf
(
$field_mask
,
$start_index
-
1
)
);
if
(
substr
(
$prev_field
,
0
,
3
)
==
'l0_'
)
{
$prev_field
=
substr
(
$prev_field
,
3
,
strlen
(
$prev_field
)
);
}
$ret
.=
' ADD COLUMN '
.
sprintf
(
$field_mask
,
$start_index
).
' AFTER `'
.
$prev_field
.
'`, '
;
$start_index
++;
}
return
preg_replace
(
'/, $/'
,
';'
,
$ret
);
}
/**
* Copy labels from another language
*
* @param kEvent $event
*/
function
OnCopyLabels
(&
$event
)
{
$object
=&
$event
->
getObject
();
$from_lang_id
=
$object
->
GetDBField
(
'CopyFromLanguage'
);
if
(
(
$event
->
MasterEvent
->
status
==
erSUCCESS
)
&&
$object
->
GetDBField
(
'CopyLabels'
)
==
1
&&
(
$from_lang_id
>
0
)
)
{
$lang_id
=
$object
->
GetID
();
// 1. phrases import
$phrases_live
=
$this
->
Application
->
getUnitOption
(
'phrases'
,
'TableName'
);
$phrases_temp
=
kTempTablesHandler
::
GetTempName
(
$phrases_live
);
$sql
=
'INSERT INTO '
.
$phrases_temp
.
'
SELECT Phrase, Translation, PhraseType, 0-PhraseId, '
.
$lang_id
.
', '
.
adodb_mktime
().
', "", Module
FROM '
.
$phrases_live
.
'
WHERE LanguageId='
.
$from_lang_id
;
$this
->
Conn
->
Query
(
$sql
);
// 2. events import
$em_table_live
=
$this
->
Application
->
getUnitOption
(
'emailmessages'
,
'TableName'
);
$em_table_temp
=
kTempTablesHandler
::
GetTempName
(
$em_table_live
);
$sql
=
'SELECT * FROM '
.
$em_table_live
.
' WHERE LanguageId = '
.
$from_lang_id
;
$email_messages
=
$this
->
Conn
->
Query
(
$sql
);
if
(
$email_messages
)
{
$id
=
$this
->
Conn
->
GetOne
(
'SELECT MIN(EmailMessageId) FROM '
.
$em_table_live
);
if
(
$id
>
0
)
$id
=
0
;
$id
--;
$sqls
=
Array
();
foreach
(
$email_messages
as
$email_message
)
{
$sqls
[]
=
$id
.
','
.
$this
->
Conn
->
qstr
(
$email_message
[
'Template'
]).
','
.
$this
->
Conn
->
qstr
(
$email_message
[
'MessageType'
]).
','
.
$lang_id
.
','
.
$email_message
[
'EventId'
];
$id
--;
}
$sql
=
'INSERT INTO '
.
$em_table_temp
.
'(EmailMessageId,Template,MessageType,LanguageId,EventId) VALUES ('
.
implode
(
'),('
,
$sqls
).
')'
;
$this
->
Conn
->
Query
(
$sql
);
}
$object
->
SetDBField
(
'CopyLabels'
,
0
);
}
}
/**
* Prepare temp tables for creating new item
* but does not create it. Actual create is
* done in OnPreSaveCreated
*
* @param kEvent $event
*/
function
OnPreCreate
(&
$event
)
{
parent
::
OnPreCreate
(
$event
);
$object
=&
$event
->
getObject
();
$object
->
SetDBField
(
'CopyLabels'
,
1
);
$live_table
=
kTempTablesHandler
::
GetLiveName
(
$object
->
TableName
);
$primary_lang_id
=
$this
->
Conn
->
GetOne
(
'SELECT '
.
$object
->
IDField
.
' FROM '
.
$live_table
.
' WHERE PrimaryLang = 1'
);
$object
->
SetDBField
(
'CopyFromLanguage'
,
$primary_lang_id
);
}
function
OnChangeLanguage
(&
$event
)
{
$this
->
Application
->
SetVar
(
'm_lang'
,
$this
->
Application
->
GetVar
(
'language'
));
//$this->Application->LinkVar('language', 'm_lang');
}
/**
* Parse language XML file into temp tables and redirect to progress bar screen
*
* @param kEvent $event
*/
function
OnImportLanguage
(&
$event
)
{
$items_info
=
$this
->
Application
->
GetVar
(
'phrases_import'
);
if
(
$items_info
)
{
list
(
$id
,
$field_values
)
=
each
(
$items_info
);
$object
=&
$this
->
Application
->
recallObject
(
'phrases.import'
,
'phrases'
,
Array
(
'skip_autoload'
=>
true
)
);
$object
->
SetFieldsFromHash
(
$field_values
);
$filename
=
getArrayValue
(
$field_values
,
'LangFile'
,
'tmp_name'
);
if
(
filesize
(
$filename
)
)
{
$modules
=
getArrayValue
(
$field_values
,
'Module'
);
$lang_xml
=&
$this
->
Application
->
recallObject
(
'LangXML'
);
$lang_xml
->
Parse
(
$filename
,
$field_values
[
'PhraseType'
],
$modules
,
$field_values
[
'ImportOverwrite'
]);
$event
->
redirect
=
'dummy'
;
$event
->
SetRedirectParams
(
Array
(
'lang_event'
=>
'OnImportProgress'
,
'pass'
=>
'all,lang'
,
'mode'
=>
$field_values
[
'ImportOverwrite'
])
);
}
else
{
$object
=&
$this
->
Application
->
recallObject
(
'phrases.import'
);
$object
->
SetError
(
'LangFile'
,
'la_empty_file'
,
'la_EmptyFile'
);
$event
->
redirect
=
false
;
}
}
}
/**
* Copies imported from xml file from temp table to live table
*
* @param kEvent $event
*/
function
OnImportProgress
(&
$event
)
{
define
(
'IMPORT_BY'
,
300
);
// import this much records per step
$template_name
=
'regional/languages_import_step2'
;
$import_mode
=
(
int
)
$this
->
Application
->
GetVar
(
'mode'
);
// 1 - overwrite existing phrases, 0 - don't overwrite existing phrases
$import_source
=
(
int
)
$this
->
Application
->
GetVar
(
'source'
);
$import_steps
=
Array
(
0
=>
'lang'
,
1
=>
'phrases'
,
2
=>
'emailmessages'
,
3
=>
'finish'
);
$key_fields
=
Array
(
0
=>
'PackName'
,
1
=>
'Phrase'
,
2
=>
'EventId'
);
// by what field should we search record match
$import_titles
=
Array
(
0
=>
'la_ImportingLanguages'
,
1
=>
'la_ImportingPhrases'
,
2
=>
'la_ImportingEmailEvents'
,
3
=>
'la_Done'
);
// --- BEFORE ---
$import_prefix
=
$import_steps
[
$import_source
];
$import_start
=
(
int
)
$this
->
Application
->
GetVar
(
'start'
);
$id_field
=
$this
->
Application
->
getUnitOption
(
$import_prefix
,
'IDField'
);
$dst_table
=
$this
->
Application
->
getUnitOption
(
$import_prefix
,
'TableName'
);
$src_table
=
kTempTablesHandler
::
GetTempName
(
$dst_table
);
$import_total
=
$this
->
Application
->
GetVar
(
'total'
);
if
(!
$import_total
)
$import_total
=
$this
->
Conn
->
GetOne
(
'SELECT COUNT(*) FROM '
.
$src_table
);
// --- AFTER ---
if
(
$import_start
==
$import_total
)
{
$import_source
++;
$import_prefix
=
$import_steps
[
$import_source
];
if
(
$import_prefix
==
'finish'
)
{
$event
->
SetRedirectParam
(
'opener'
,
'u'
);
return
true
;
}
$import_start
=
0
;
$id_field
=
$this
->
Application
->
getUnitOption
(
$import_prefix
,
'IDField'
);
$dst_table
=
$this
->
Application
->
getUnitOption
(
$import_prefix
,
'TableName'
);
$src_table
=
kTempTablesHandler
::
GetTempName
(
$dst_table
);
$import_total
=
$this
->
Conn
->
GetOne
(
'SELECT COUNT(*) FROM '
.
$src_table
);
}
$done_percent
=
(
$import_start
*
100
)
/
$import_total
;
$block_params
=
Array
(
'name'
=>
$template_name
,
'title'
=>
$import_titles
[
$import_source
],
'percent_done'
=>
$done_percent
,
'percent_left'
=>
100
-
$done_percent
);
$this
->
Application
->
InitParser
();
$this
->
Application
->
setUnitOption
(
'phrases'
,
'AutoLoad'
,
false
);
echo
$this
->
Application
->
ParseBlock
(
$block_params
);
flush
();
$sql
=
'SELECT * FROM %s LIMIT %s,%s'
;
$rows
=
$this
->
Conn
->
Query
(
sprintf
(
$sql
,
$src_table
,
$import_start
,
IMPORT_BY
)
);
$values_sql
=
''
;
// if found and mode = 1 (overwrite)
$search_sql
=
'SELECT '
.
$id_field
.
' FROM '
.
$dst_table
.
' WHERE '
.
$key_fields
[
$import_source
].
' = %s AND LanguageId = %s'
;
$update_sql
=
'UPDATE '
.
$dst_table
.
' SET %s WHERE '
.
$id_field
.
' = %s'
;
foreach
(
$rows
as
$row
)
{
$tmp_sql
=
sprintf
(
$search_sql
,
$this
->
Conn
->
qstr
(
$row
[
$key_fields
[
$import_source
]
]),
$row
[
'LanguageId'
]
);
$tmp_id
=
$this
->
Conn
->
GetOne
(
$tmp_sql
);
if
(
$tmp_id
>
0
&&
$import_mode
==
1
)
{
// update
$update_fields
=
''
;
foreach
(
$row
as
$field_name
=>
$field_value
)
{
if
(
$field_name
==
$id_field
)
continue
;
$update_fields
.=
'`'
.
$field_name
.
'` = '
.
$this
->
Conn
->
qstr
(
$field_value
).
','
;
}
$update_fields
=
preg_replace
(
'/(.*),$/'
,
'
\\
1'
,
$update_fields
);
$this
->
Conn
->
Query
(
sprintf
(
$update_sql
,
$update_fields
,
$tmp_id
)
);
}
elseif
(!
$tmp_id
)
{
$values_sql
.=
'('
;
foreach
(
$row
as
$field_value
)
{
$values_sql
.=
$this
->
Conn
->
qstr
(
$field_value
).
','
;
}
$values_sql
=
preg_replace
(
'/(.*),$/'
,
'
\\
1'
,
$values_sql
).
'),'
;
}
}
if
(
$values_sql
)
{
$fields_sql
=
''
;
$fields
=
array_keys
(
$this
->
Application
->
getUnitOption
(
$import_prefix
,
'Fields'
)
);
foreach
(
$fields
as
$field_name
)
{
$fields_sql
.=
'`'
.
$field_name
.
'`,'
;
}
$fields_sql
=
preg_replace
(
'/(.*),$/'
,
'
\\
1'
,
$fields_sql
);
$values_sql
=
preg_replace
(
'/(.*),$/'
,
'
\\
1'
,
$values_sql
);
$sql
=
sprintf
(
'INSERT INTO %s (%s) VALUES %s'
,
$dst_table
,
$fields_sql
,
$values_sql
);
$this
->
Conn
->
Query
(
$sql
);
}
$event
->
setRedirectParams
(
Array
(
'lang_event'
=>
'OnImportProgress'
,
'pass'
=>
'all,lang'
,
'start'
=>
$import_start
+=
count
(
$rows
),
'total'
=>
$import_total
,
'source'
=>
$import_source
,
'mode'
=>
$import_mode
)
);
}
/**
* Stores ids of selected languages and redirects to export language step 1
*
* @param kEvent $event
*/
function
OnExportLanguage
(&
$event
)
{
$this
->
Application
->
setUnitOption
(
'phrases'
,
'AutoLoad'
,
false
);
$this
->
StoreSelectedIDs
(
$event
);
$this
->
Application
->
StoreVar
(
'export_language_ids'
,
implode
(
','
,
$this
->
getSelectedIDs
(
$event
))
);
$event
->
setRedirectParams
(
Array
(
'm_opener'
=>
'd'
,
'phrases.export_event'
=>
'OnNew'
,
'pass'
=>
'all,phrases.export'
)
);
$event
->
redirect
=
'regional/languages_export'
;
}
/**
* Saves selected languages to xml file passed
*
* @param kEvent $event
*/
function
OnExportProgress
(&
$event
)
{
$items_info
=
$this
->
Application
->
GetVar
(
'phrases_export'
);
if
(
$items_info
)
{
list
(
$id
,
$field_values
)
=
each
(
$items_info
);
$object
=&
$this
->
Application
->
recallObject
(
'phrases.export'
,
'phrases'
,
Array
(
'skip_autoload'
=>
true
)
);
$object
->
SetFieldsFromHash
(
$field_values
);
$lang_ids
=
explode
(
','
,
$this
->
Application
->
RecallVar
(
'export_language_ids'
)
);
if
(
!
getArrayValue
(
$field_values
,
'LangFile'
)
)
{
$object
->
SetError
(
'LangFile'
,
'required'
);
$event
->
redirect
=
false
;
return
false
;
}
if
(
!
is_writable
(
EXPORT_PATH
)
)
{
$object
->
SetError
(
'LangFile'
,
'write_error'
,
'la_ExportFolderNotWritable'
);
$event
->
redirect
=
false
;
return
false
;
}
if
(
substr
(
$field_values
[
'LangFile'
],
-
5
)
!=
'.lang'
)
$field_values
[
'LangFile'
]
.=
'.lang'
;
$filename
=
EXPORT_PATH
.
'/'
.
$field_values
[
'LangFile'
];
$lang_xml
=&
$this
->
Application
->
recallObject
(
'LangXML'
);
$lang_xml
->
Create
(
$filename
,
$field_values
[
'PhraseType'
],
$lang_ids
,
$field_values
[
'Module'
]);
}
$event
->
redirect
=
'regional/languages_export_step2'
;
$event
->
SetRedirectParam
(
'export_file'
,
$field_values
[
'LangFile'
]);
}
/**
* Returns to previous template in opener stack
*
* @param kEvent $event
*/
function
OnGoBack
(&
$event
)
{
$event
->
redirect_params
[
'opener'
]
=
'u'
;
}
}
?>
Event Timeline
Log In to Comment