Index: trunk/core/units/languages/languages_event_handler.php =================================================================== diff -u -N --- trunk/core/units/languages/languages_event_handler.php (revision 8402) +++ trunk/core/units/languages/languages_event_handler.php (revision 0) @@ -1,463 +0,0 @@ - Array('self' => true), - 'OnSetPrimary' => Array('self' => 'advanced:set_primary|add|edit'), - 'OnImportLanguage' => Array('self' => 'advanced:import'), - 'OnImportProgress' => Array('self' => 'advanced:import'), - 'OnExportLanguage' => Array('self' => 'advanced:export'), - 'OnExportProgress' => Array('self' => 'advanced:export'), - - 'OnItemBuild' => Array('self' => true), - ); - - $this->permMapping = array_merge($this->permMapping, $permissions); - } - - /** - * [HOOK] Updates table structure on new language adding/removing language - * - * @param kEvent $event - */ - function OnReflectMultiLingualFields(&$event) - { - $ml_helper =& $this->Application->recallObject('kMultiLanguageHelper'); - /* @var $ml_helper kMultiLanguageHelper */ - - $this->Application->UnitConfigReader->ReReadConfigs(); - foreach ($this->Application->UnitConfigReader->configData as $prefix => $config_data) { - $ml_helper->createFields($prefix); - } - } - - /** - * Allows to set selected language as primary - * - * @param kEvent $event - */ - function OnSetPrimary(&$event) - { - if ($this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1)) { - return; - } - - $this->StoreSelectedIDs($event); - $ids = $this->getSelectedIDs($event); - if ($ids) { - $id = array_shift($ids); - $object =& $event->getObject( Array('skip_autoload' => true) ); - $object->Load($id); - $object->setPrimary(); - } - } - - /** - * [HOOK] Reset primary status of other languages if we are saving primary language - * - * @param kEvent $event - */ - function OnUpdatePrimary(&$event) - { - $object =& $event->getObject( Array('skip_autoload' => true) ); - $object->SwitchToLive(); - - // set primary for each languages, that have this checkbox checked - $ids = explode(',', $event->MasterEvent->getEventParam('ids')); - foreach ($ids as $id) { - $object->Load($id); - if ($object->GetDBField('PrimaryLang')) { - $object->setPrimary(); - } - - } - - // if no primary language left, then set primary last language (not to load again) from edited list - $sql = 'SELECT '.$object->IDField.' - FROM '.$object->TableName.' - WHERE PrimaryLang = 1'; - $primary_language = $this->Conn->GetOne($sql); - - if (!$primary_language) { - $object->setPrimary(false); - } - } - - - /** - * Occurse before updating item - * - * @param kEvent $event - * @access public - */ - function OnBeforeItemUpdate(&$event) - { - $object =& $event->getObject(); - $status_field = array_shift( $this->Application->getUnitOption($event->Prefix, 'StatusField') ); - - if ($object->GetDBField('PrimaryLang') == 1 && $object->GetDBField($status_field) == 0) { - $object->SetDBField($status_field, 1); - } - } - - /** - * 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'); - } - } - - /** - * 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 = $this->Application->GetTempName($phrases_live, 'prefix:phrases'); - $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 = $this->Application->GetTempName($em_table_live, 'prefix:emailmessages'); - - $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 = $this->Application->getUnitOption($event->Prefix, '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) - { - if ($this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1)) { - return; - } - - $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'); - /* @var $lang_xml LangXML_Parser */ - $lang_xml->Parse($filename, $field_values['PhraseType'], $modules, $field_values['ImportOverwrite']); - - $event->redirect = true; - $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 = $this->Application->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 = $this->Application->GetTempName($dst_table); - $import_total = $this->Conn->GetOne('SELECT COUNT(*) FROM '.$src_table); - } - - if($import_total > 0) - { - $done_percent = ($import_start * 100) / $import_total; - } - else - { - $done_percent = 100; - } - - $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); - - //break out of buffering - $buffer_content = Array(); - while (ob_get_level()) { - $buffer_content[] = ob_get_clean(); - } - $ret = implode('', array_reverse($buffer_content)); - echo $ret; - 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) - { - if ($this->Application->CheckPermission('SYSTEM_ACCESS.READONLY', 1)) { - return; - } - - $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'); - if ($object->GetDBField('DoNotEncode')) { - $lang_xml->SetEncoding('plain'); - } - $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'; - } - - function OnScheduleTopFrameReload(&$event) - { - $this->Application->StoreVar('RefreshTopFrame',1); - } - - /** - * Do now allow deleting current language - * - * @param kEvent $event - */ - function OnBeforeItemDelete(&$event) - { - $del_id = $event->getEventParam('id'); - $object =& $event->getObject(array('skip_autload' => true)); - $object->Load($del_id); - - if ($object->GetDBField('PrimaryLang') || $del_id == $this->Application->GetVar('m_lang')) { - $event->status = erFAIL; - } - } - - } - -?> \ No newline at end of file