Index: branches/5.1.x/core/units/languages/languages_event_handler.php =================================================================== diff -u -N -r13086 -r13140 --- branches/5.1.x/core/units/languages/languages_event_handler.php (.../languages_event_handler.php) (revision 13086) +++ branches/5.1.x/core/units/languages/languages_event_handler.php (.../languages_event_handler.php) (revision 13140) @@ -1,6 +1,6 @@ getObject(); - $from_lang_id = $object->GetDBField('CopyFromLanguage'); + /* @var $object kDBItem */ - if( ($event->MasterEvent->status == erSUCCESS) && $object->GetDBField('CopyLabels') == 1 && ($from_lang_id > 0) ) - { - $lang_id = $object->GetID(); + $src_language = $object->GetDBField('CopyFromLanguage'); - // 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); + if ($object->GetDBField('CopyLabels') && $src_language) { + $dst_language = $object->GetID(); - // 2. events import - $em_table_live = $this->Application->getUnitOption('emailmessages','TableName'); - $em_table_temp = $this->Application->GetTempName($em_table_live, 'prefix:emailmessages'); + // 1. schedule data copy after OnSave event is executed + $var_name = $event->getPrefixSpecial() . '_copy_data' . $this->Application->GetVar('m_wid'); + $pending_actions = $this->Application->RecallVar($var_name, Array ()); - $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--; + if ($pending_actions) { + $pending_actions = unserialize($pending_actions); + } - $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).')'; + $pending_actions[$src_language] = $dst_language; + $this->Application->StoreVar($var_name, serialize($pending_actions)); + + if ($object->IsTempTable()) { + // 2. phrases import + $phrases_live = $this->Application->getUnitOption('phrases','TableName'); + $phrases_temp = $this->Application->GetTempName($phrases_live, 'prefix:phrases'); + + $sql = 'INSERT INTO ' . $phrases_temp . '(Phrase, PhraseKey, Translation, PhraseType, PhraseId, LanguageId, LastChanged, LastChangeIP, Module) + SELECT Phrase, PhraseKey, Translation, PhraseType, 0-PhraseId, ' . $dst_language . ', ' . adodb_mktime() . ', "", Module + FROM ' . $phrases_live . ' + WHERE LanguageId = ' . $src_language; $this->Conn->Query($sql); } @@ -218,6 +213,51 @@ } /** + * Saves language from temp table to live + * + * @param kEvent $event + */ + function OnSave(&$event) + { + parent::OnSave($event); + + if ($event->status != erSUCCESS) { + return ; + } + + $var_name = $event->getPrefixSpecial() . '_copy_data' . $this->Application->GetVar('m_wid'); + $pending_actions = $this->Application->RecallVar($var_name, Array ()); + + if ($pending_actions) { + $pending_actions = unserialize($pending_actions); + } + + // create multilingual columns for phrases & email events table first (actual for 6+ language) + $ml_helper =& $this->Application->recallObject('kMultiLanguageHelper'); +// $ml_helper->createFields('phrases'); + $ml_helper->createFields('emailevents'); + + foreach ($pending_actions as $src_language => $dst_language) { + // phrases import + /*$sql = 'UPDATE ' . $this->Application->getUnitOption('phrases', 'TableName') . ' + SET l' . $dst_language . '_Translation = l' . $src_language . '_Translation'; + $this->Conn->Query($sql);*/ + + // events import + $sql = 'UPDATE ' . $this->Application->getUnitOption('emailevents', 'TableName') . ' + SET + l' . $dst_language . '_Subject = l' . $src_language . '_Subject, + l' . $dst_language . '_Body = l' . $src_language . '_Body, + l' . $dst_language . '_Description = l' . $src_language . '_Description'; + $this->Conn->Query($sql); + } + + $this->Application->RemoveVar($var_name); + + $event->CallSubEvent('OnReflectMultiLingualFields'); + } + + /** * Prepare temp tables for creating new item * but does not create it. Actual create is * done in OnPreSaveCreated @@ -425,6 +465,27 @@ } /** + * Deletes phrases and email events on given language + * + * @param kEvent $event + */ + function OnAfterItemDelete(&$event) + { + parent::OnAfterItemDelete($event); + + $object =& $event->getObject(); + /* @var $object kDBItem */ + + $fields_hash = Array ( + 'l' . $object->GetID() . '_Subject' => NULL, + 'l' . $object->GetID() . '_Body' => NULL, + 'l' . $object->GetID() . '_Description' => NULL, + ); + + $this->Conn->doUpdate($fields_hash, $this->Application->getUnitOption('emailevents', 'TableName'), 1); + } + + /** * Copy missing phrases across all system languages (starting from primary) * * @param kEvent $event