Index: trunk/core/units/languages/languages_item.php =================================================================== diff -u -N -r1566 -r4169 --- trunk/core/units/languages/languages_item.php (.../languages_item.php) (revision 1566) +++ trunk/core/units/languages/languages_item.php (.../languages_item.php) (revision 4169) @@ -7,6 +7,20 @@ $sql = 'SELECT MAX('.$this->IDField.') FROM '.kTempTablesHandler::GetLiveName($this->TableName); return $this->Conn->GetOne($sql) + 1; } + + function setPrimary($reset_primary = true) + { + if ($reset_primary) { + $sql = 'UPDATE '.$this->TableName.' + SET PrimaryLang = 0'; + $this->Conn->Query($sql); + } + + $sql = 'UPDATE '.$this->TableName.' + SET PrimaryLang = 1, Enabled = 1 + WHERE '.$this->IDField.' = '.$this->GetID(); + $this->Conn->Query($sql); + } } ?> \ No newline at end of file Index: trunk/kernel/units/languages/languages_config.php =================================================================== diff -u -N -r3983 -r4169 --- trunk/kernel/units/languages/languages_config.php (.../languages_config.php) (revision 3983) +++ trunk/kernel/units/languages/languages_config.php (.../languages_config.php) (revision 4169) @@ -9,13 +9,7 @@ 'RegisterClasses' => Array( Array('pseudo'=>'LangXML','class'=>'LangXML_Parser','file'=>'import_xml.php'), ), - /*'AggregateTags' => Array( - Array( - 'AggregateTo' => 'm', - 'AggregatedTagName' => 'IsMetricUnits', - 'LocalTagName' => 'Main_IsMetricUnits', - ), - ), */ + 'AutoLoad' => true, 'Hooks' => Array( Array( @@ -39,6 +33,17 @@ 'DoSpecial' => '', 'DoEvent' => 'OnCopyLabels', ), + + Array( + 'Mode' => hAFTER, + 'Conditional' => false, + 'HookToPrefix' => 'lang', + 'HookToSpecial' => '*', + 'HookToEvent' => Array('OnSave'), + 'DoPrefix' => '', + 'DoSpecial' => '', + 'DoEvent' => 'OnUpdatePrimary', + ), ), 'QueryString' => Array( 1 => 'id', Index: trunk/kernel/admin_templates/regional/languages_list.tpl =================================================================== diff -u -N -r3664 -r4169 --- trunk/kernel/admin_templates/regional/languages_list.tpl (.../languages_list.tpl) (revision 3664) +++ trunk/kernel/admin_templates/regional/languages_list.tpl (.../languages_list.tpl) (revision 4169) @@ -30,8 +30,15 @@ std_delete_items('lang') } ) ); + a_toolbar.AddButton( new ToolBarSeparator('sep1') ); + a_toolbar.AddButton( new ToolBarButton('primary_language', '', function() { + submit_event('lang','OnSetPrimary'); + } + ) ); + + a_toolbar.AddButton( new ToolBarButton('import_language', '', function() { redirect(''); } @@ -58,7 +65,7 @@ \ No newline at end of file Index: trunk/kernel/units/languages/languages_item.php =================================================================== diff -u -N -r1566 -r4169 --- trunk/kernel/units/languages/languages_item.php (.../languages_item.php) (revision 1566) +++ trunk/kernel/units/languages/languages_item.php (.../languages_item.php) (revision 4169) @@ -7,6 +7,20 @@ $sql = 'SELECT MAX('.$this->IDField.') FROM '.kTempTablesHandler::GetLiveName($this->TableName); return $this->Conn->GetOne($sql) + 1; } + + function setPrimary($reset_primary = true) + { + if ($reset_primary) { + $sql = 'UPDATE '.$this->TableName.' + SET PrimaryLang = 0'; + $this->Conn->Query($sql); + } + + $sql = 'UPDATE '.$this->TableName.' + SET PrimaryLang = 1, Enabled = 1 + WHERE '.$this->IDField.' = '.$this->GetID(); + $this->Conn->Query($sql); + } } ?> \ No newline at end of file Index: trunk/kernel/admin_templates/incs/script.js =================================================================== diff -u -N -r4029 -r4169 --- trunk/kernel/admin_templates/incs/script.js (.../script.js) (revision 4029) +++ trunk/kernel/admin_templates/incs/script.js (.../script.js) (revision 4169) @@ -452,7 +452,7 @@ function RemoveTranslationLink($string) { - return $string.match(/(.*)<\/a>/) ? RegExp.$2 : $string; + return $string.match(/<a href="(.*)">(.*)<\/a>/) ? RegExp.$2 : $string; } function redirect($url) Index: trunk/core/kernel/db/db_event_handler.php =================================================================== diff -u -N -r4029 -r4169 --- trunk/core/kernel/db/db_event_handler.php (.../db_event_handler.php) (revision 4029) +++ trunk/core/kernel/db/db_event_handler.php (.../db_event_handler.php) (revision 4169) @@ -879,8 +879,8 @@ function OnSave(&$event) { $event->CallSubEvent('OnPreSave'); - if ($event->status==erSUCCESS) { - $skip_master=false; + if ($event->status == erSUCCESS) { + $skip_master = false; $temp =& $this->Application->recallObject($event->getPrefixSpecial().'_TempHandler', 'kTempTablesHandler'); // newly created item @@ -896,8 +896,11 @@ } $this->clearSelectedIDs($event); - $event->redirect_params = Array('opener'=>'u'); + $event->redirect_params = Array('opener' => 'u'); $this->Application->RemoveVar($event->getPrefixSpecial().'_modified'); + + // all temp tables are deleted here => all after hooks should think, that it's live mode now + $this->Application->SetVar($event->Prefix.'_mode', ''); } } Index: trunk/core/kernel/utility/event.php =================================================================== diff -u -N -r3709 -r4169 --- trunk/core/kernel/utility/event.php (.../event.php) (revision 3709) +++ trunk/core/kernel/utility/event.php (.../event.php) (revision 4169) @@ -90,7 +90,6 @@ */ var $redirect = true; - /** * Params passed to redirect on succsessfull event * @@ -193,11 +192,11 @@ $this->pseudoClass=$this->Prefix.$appendix; } - function Init($prefix,$special='') + function Init($prefix, $special = '') { - $this->Prefix=$prefix; - $this->pseudoClass=$prefix; // default value - $this->Special=$special; + $this->Prefix = $prefix; + $this->pseudoClass = $prefix; // default value + $this->Special = $special; $this->Prefix_Special = rtrim($this->Prefix.'.'.$this->Special,'.'); } @@ -274,6 +273,22 @@ return is_object($this->MasterEvent) ? $this->MasterEvent->Name : false; } + /** + * Allows to tell if this event was called some how (e.g. subevent, hook) from event requested + * + * @param string $event_key event key in format [prefix[.special]:]event_name + * @return unknown + */ + function hasAncestor($event_key) + { + $event_manager =& $this->Application->recallObject('EventManager'); + if (strpos($event_key, ':') === false) { + $event_key = $this->getPrefixSpecial().':'.$event_key; + } + + return $event_manager->eventRunning($event_key); + } + } ?> \ No newline at end of file Index: trunk/kernel/units/languages/languages_event_handler.php =================================================================== diff -u -N -r4000 -r4169 --- trunk/kernel/units/languages/languages_event_handler.php (.../languages_event_handler.php) (revision 4000) +++ trunk/kernel/units/languages/languages_event_handler.php (.../languages_event_handler.php) (revision 4169) @@ -19,6 +19,71 @@ } /** + * Allows to set selected language as primary + * + * @param kEvent $event + */ + function OnSetPrimary(&$event) + { + $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 Index: trunk/core/kernel/event_manager.php =================================================================== diff -u -N -r3907 -r4169 --- trunk/core/kernel/event_manager.php (.../event_manager.php) (revision 3907) +++ trunk/core/kernel/event_manager.php (.../event_manager.php) (revision 4169) @@ -375,7 +375,7 @@ function processHooks(&$event, $mode) { // * - get hooks that are valid with any special of given prefix - $hooks = array_merge_recursive2($this->getHooks($event, $mode, '*'), $this->getHooks($event, $mode)); + $hooks = array_merge($this->getHooks($event, $mode, '*'), $this->getHooks($event, $mode)); if ($hooks) { foreach ($hooks as $hook) { @@ -449,6 +449,17 @@ $sql = 'REPLACE INTO '.TABLE_PREFIX.'Cache (VarName,Data,Cached) VALUES (%s,%s,%s)'; $this->Conn->Query( sprintf($sql, $this->Conn->qstr('RegularEventRuns'), $this->Conn->qstr(serialize($event_last_runs)), adodb_mktime() ) ); } + + /** + * Allows to determine, that required event is beeing processed right now + * + * @param string $event_key Event name in format prefix[.special]:event_name + * @return bool + */ + function eventRunning($event_key) + { + return array_search($event_key, $this->recursionStack) !== false; + } } Index: trunk/core/units/languages/languages_event_handler.php =================================================================== diff -u -N -r4000 -r4169 --- trunk/core/units/languages/languages_event_handler.php (.../languages_event_handler.php) (revision 4000) +++ trunk/core/units/languages/languages_event_handler.php (.../languages_event_handler.php) (revision 4169) @@ -19,6 +19,71 @@ } /** + * Allows to set selected language as primary + * + * @param kEvent $event + */ + function OnSetPrimary(&$event) + { + $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 Index: trunk/core/units/languages/languages_config.php =================================================================== diff -u -N -r3983 -r4169 --- trunk/core/units/languages/languages_config.php (.../languages_config.php) (revision 3983) +++ trunk/core/units/languages/languages_config.php (.../languages_config.php) (revision 4169) @@ -9,13 +9,7 @@ 'RegisterClasses' => Array( Array('pseudo'=>'LangXML','class'=>'LangXML_Parser','file'=>'import_xml.php'), ), - /*'AggregateTags' => Array( - Array( - 'AggregateTo' => 'm', - 'AggregatedTagName' => 'IsMetricUnits', - 'LocalTagName' => 'Main_IsMetricUnits', - ), - ), */ + 'AutoLoad' => true, 'Hooks' => Array( Array( @@ -39,6 +33,17 @@ 'DoSpecial' => '', 'DoEvent' => 'OnCopyLabels', ), + + Array( + 'Mode' => hAFTER, + 'Conditional' => false, + 'HookToPrefix' => 'lang', + 'HookToSpecial' => '*', + 'HookToEvent' => Array('OnSave'), + 'DoPrefix' => '', + 'DoSpecial' => '', + 'DoEvent' => 'OnUpdatePrimary', + ), ), 'QueryString' => Array( 1 => 'id',