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.'\''); $field_mask = 'l%s_'.$field_name.' '.$describe[0]['Type']; $create_count = $languages_count - count($describe); if($create_count) { $sqls[] = 'ALTER TABLE '.$table_name.( $this->generateAlterSQL($field_mask, count($describe) + 1, $create_count) ); } } } } if($sqls) $this->Conn->Query( implode("\n",$sqls) ); } /** * 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) ); $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.' 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); $lang_xml =& $this->Application->recallObject('LangXML'); $lang_xml->Parse($field_values['LangFile']['tmp_name'], $field_values['PhraseType'], $field_values['Module']); } $event->redirect = 'dummy'; $event->SetRedirectParam('lang_event', 'OnImportProgress'); $event->SetRedirectParam('pass', 'all,lang'); } /** * 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 = 'in-commerce/regional/languages_import_step2'; $import_source = (int)$this->Application->GetVar('source'); $import_steps = Array(0 => 'lang', 1 => 'phrases', 2 => 'emailmessages', 3 => 'finish'); $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'); $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; $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(); $fields = array_keys( $this->Application->getUnitOption($import_prefix,'Fields') ); $sql = 'SELECT * FROM %s LIMIT %s,%s'; $rows = $this->Conn->Query( sprintf($sql,$src_table,$import_start,IMPORT_BY) ); $fields_sql = ''; foreach($fields as $field_name) { $fields_sql .= '`'.$field_name.'`,'; } $fields_sql = preg_replace('/(.*),$/', '\\1', $fields_sql); $values_sql = ''; foreach($rows as $row) { $values_sql .= '('; foreach($row as $field_value) { $values_sql .= $this->Conn->qstr($field_value).','; } $values_sql = preg_replace('/(.*),$/', '\\1', $values_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) ); } /** * 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 = 'in-commerce/regional/languages_export'; } /** * Saves selected languages to xml file passed * * @param kEvent $event */ function OnExportProgress(&$event) { $this->Application->setUnitOption('phrases','AutoLoad',false); $object =& $this->Application->recallObject('phrases.export'); $items_info = $this->Application->GetVar('phrases_export'); if($items_info) { list($id,$field_values) = each($items_info); $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; } $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 = 'in-commerce/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'; } } ?>