Index: branches/5.1.x/core/units/phrases/phrases_event_handler.php =================================================================== diff -u -N -r13086 -r13151 --- branches/5.1.x/core/units/phrases/phrases_event_handler.php (.../phrases_event_handler.php) (revision 13086) +++ branches/5.1.x/core/units/phrases/phrases_event_handler.php (.../phrases_event_handler.php) (revision 13151) @@ -1,6 +1,6 @@ Special == 'import') { $object->setRequired('LangFile', true); $object->setRequired('Phrase', false); - $object->setRequired('Translation', false); + $object->setRequired('l' . $this->Application->GetVar('m_lang') . '_Translation', false); // allow multiple phrase types to be selected during import $field_options = $object->GetFieldOptions('PhraseType'); @@ -65,68 +65,97 @@ $permissions = Array ( 'OnItemBuild' => Array('self' => true, 'subitem' => true), - 'OnNew' => Array('self' => true, 'subitem' => true), - 'OnPrepareUpdate' => Array('self' => true, 'subitem' => true), + 'OnPreparePhrase' => Array('self' => true, 'subitem' => true), ); $this->permMapping = array_merge($this->permMapping, $permissions); } /** + * Prepares phrase for translation + * + * @param kEvent $event + */ + function OnPreparePhrase(&$event) + { + $label = $this->Application->GetVar($event->getPrefixSpecial() . '_label'); + + if (!$label) { + return ; + } + + // we got label, try to get it's ID then if any + $phrase_id = $this->_getPhraseId($label); + + if ($phrase_id) { + $event->SetRedirectParam($event->getPrefixSpecial(true) . '_id', $phrase_id); + $event->SetRedirectParam('pass', 'm,' . $event->getPrefixSpecial()); + } + else { + $event->CallSubEvent('OnNew'); + } + + if ($this->Application->GetVar('simple_mode')) { + $event->SetRedirectParam('simple_mode', 1); + } + } + + function _getPhraseId($phrase) + { + $sql = 'SELECT ' . $this->Application->getUnitOption($this->Prefix, 'IDField') . ' + FROM ' . $this->Application->getUnitOption($this->Prefix, 'TableName') . ' + WHERE PhraseKey = ' . $this->Conn->qstr( mb_strtoupper($phrase) ); + + return $this->Conn->GetOne($sql); + } + + /** * Forces new label in case if issued from get link * * @param kEvent $event */ function OnNew(&$event) { parent::OnNew($event); - $label = $this->Application->GetVar('phrases_label'); - $object =& $event->getObject( $label ? Array('live_table' => true, 'skip_autoload' => true) : Array('skip_autoload' => true) ); + $object =& $event->getObject(); + /* @var $object kDBItem */ + + $label = $this->Application->GetVar($event->getPrefixSpecial() . '_label'); + if ($label) { - $object->SetDBField('Phrase', $label); // phrase is created in language, used to display phrases - $object->SetDBField('LanguageId', $this->Application->GetVar('m_lang')); - $object->SetDBField('PhraseType', 1); - - $primary_language = $this->Application->GetDefaultLanguageId(); - $live_table = $this->Application->getUnitOption($event->Prefix, 'TableName'); - $sql = 'SELECT Translation FROM %s WHERE Phrase = %s'; - $primary_value = $this->Conn->GetOne( sprintf($sql, $live_table, $this->Conn->qstr($label) ) ); - $object->SetDBField('PrimaryTranslation', $primary_value); + $object->SetDBField('Phrase', $label); + $object->SetDBField('PhraseType', 1); // admin + $object->SetDBField('PrimaryTranslation', $this->_getPrimaryTranslation($label)); } + // set module from cookie $last_module = $this->Application->GetVar('last_module'); + if ($last_module) { $object->SetDBField('Module', $last_module); } - if ($event->Special == 'export' || $event->Special == 'import') { + if (($event->Special == 'export') || ($event->Special == 'import')) { $object->SetDBField('PhraseType', '|0|1|2|'); - $modules = $this->Conn->GetCol('SELECT Name FROM '.TABLE_PREFIX.'Modules'); - $object->SetDBField('Module', '|'.implode('|', $modules).'|' ); + $object->SetDBField('Module', '|' . implode('|', array_keys($this->Application->ModuleInfo)) . '|' ); } } /** - * Prepares existing phrase editing + * Returns given phrase translation on primary language * - * @param kEvent $event + * @param string $phrase + * @return string */ - function OnPrepareUpdate(&$event) + function _getPrimaryTranslation($phrase) { - $language_id = $this->Application->GetVar('m_lang'); - $label = $this->Application->GetVar('phrases_label'); + $sql = 'SELECT l' . $this->Application->GetDefaultLanguageId() . '_Translation + FROM ' . $this->Application->getUnitOption($this->Prefix, 'TableName') . ' + WHERE PhraseKey = ' . $this->Conn->qstr( mb_strtoupper($phrase) ); - $table_name = $this->Application->getUnitOption($event->Prefix, 'TableName'); - $label_idfield = $this->Application->getUnitOption($event->Prefix, 'IDField'); - - $sql = 'SELECT ' . $label_idfield . ' - FROM ' . $table_name . ' - WHERE Phrase = '.$this->Conn->qstr($label).' AND LanguageId = '.(int)$language_id; - $this->Application->SetVar($event->getPrefixSpecial() . '_id', $this->Conn->GetOne($sql)); - - $event->redirect = false; + return $this->Conn->GetOne($sql); } /** @@ -156,8 +185,27 @@ { parent::OnBeforeItemCreate($event); - $this->_setPhraseKey($event); - $this->_setLastUpdated($event); + $object =& $event->getObject(); + /* @var $object kDBItem */ + + $primary_language_id = $this->Application->GetDefaultLanguageId(); + + if (!$object->GetDBField('l' . $primary_language_id . '_Translation')) { + // no translation on primary language -> try to copy from other language + $src_languages = Array ('lang_id', 'm_lang'); // editable language, theme language + + foreach ($src_languages as $src_language) { + $src_language = $this->Application->GetVar($src_language); + $src_value = $src_language ? $object->GetDBField('l' . $src_language . '_Translation') : false; + + if ($src_value) { + $object->SetDBField('l' . $primary_language_id . '_Translation', $src_value); + break; + } + } + } + + $this->_phraseChanged($event); } /** @@ -169,33 +217,21 @@ { parent::OnBeforeItemUpdate($event); - $this->_setPhraseKey($event); - $this->_setLastUpdated($event); + $this->_phraseChanged($event); } /** - * Set's phrase key, used for phrase updating and loading + * Set's phrase key and last change info, used for phrase updating and loading * * @param kEvent $event */ - function _setPhraseKey(&$event) + function _phraseChanged(&$event) { $object =& $event->getObject(); /* @var $object kDBItem */ $object->SetDBField('PhraseKey', mb_strtoupper($object->GetDBField('Phrase'))); - } - /** - * Save phrase change date & ip translation was made from - * - * @param kEvent $event - */ - function _setLastUpdated(&$event) - { - $object =& $event->getObject(); - /* @var $object kDBItem */ - if ($object->GetOriginalField('Translation') != $object->GetDBField('Translation')) { $object->SetDBField('LastChanged_date', adodb_mktime() ); $object->SetDBField('LastChanged_time', adodb_mktime() ); @@ -219,6 +255,78 @@ $fields['Module']['default'] = 'Custom'; $this->Application->setUnitOption($event->Prefix, 'Fields', $fields); } + + // make sure, that PrimaryTranslation column always refrers to primary language column + $language_id = $this->Application->GetVar('lang_id'); + + if (!$language_id) { + $language_id = $this->Application->GetVar('m_lang'); + } + + $primary_language_id = $this->Application->GetDefaultLanguageId(); + $calculated_fields = $this->Application->getUnitOption($event->Prefix, 'CalculatedFields'); + + foreach ($calculated_fields[''] as $field_name => $field_expression) { + $field_expression = str_replace('%5$s', $language_id, $field_expression); + $field_expression = str_replace('%4$s', $primary_language_id, $field_expression); + + $calculated_fields[''][$field_name] = $field_expression; + } + + $this->Application->setUnitOption($event->Prefix, 'CalculatedFields', $calculated_fields); + + if ($this->Application->GetVar('regional')) { + $this->Application->setUnitOption($event->Prefix, 'PopulateMlFields', true); + } } + /** + * Saves changes & changes language + * + * @param kEvent $event + */ + function OnPreSaveAndChangeLanguage(&$event) + { + $label = $this->Application->GetVar($event->getPrefixSpecial() . '_label'); + + if ($label && !$this->UseTempTables($event)) { + $phrase_id = $this->_getPhraseId($label); + + if ($phrase_id) { + $event->CallSubEvent('OnUpdate'); + $event->SetRedirectParam('opener', 's'); + } + else { + $event->CallSubEvent('OnCreate'); + $event->SetRedirectParam('opener', 's'); + } + + if ($event->status != erSUCCESS) { + return ; + } + + $event->SetRedirectParam($event->getPrefixSpecial() . '_event', 'OnPreparePhrase'); + $event->SetRedirectParam('pass_events', true); + } + + if ($this->Application->GetVar('simple_mode')) { + $event->SetRedirectParam('simple_mode', 1); + } + + parent::OnPreSaveAndChangeLanguage($event); + } + + /** + * Prepare temp tables and populate it + * with items selected in the grid + * + * @param kEvent $event + */ + function OnEdit(&$event) + { + parent::OnEdit($event); + + // use language from grid, instead of primary language used by default + $event->SetRedirectParam('m_lang', $this->Application->GetVar('m_lang')); + } } \ No newline at end of file