Index: trunk/core/kernel/utility/temp_handler.php =================================================================== diff -u -r3845 -r3863 --- trunk/core/kernel/utility/temp_handler.php (.../temp_handler.php) (revision 3845) +++ trunk/core/kernel/utility/temp_handler.php (.../temp_handler.php) (revision 3863) @@ -27,7 +27,15 @@ var $CopiedTables = Array(); + /** + * IDs of newly cloned items (key - prefix.special, value - array of ids) + * + * @var Array + */ + var $savedIDs = Array(); + + /** * Description * * @var kDBConnection @@ -49,6 +57,11 @@ $this->MasterTable = $tables['TableName']; } + function saveID($prefix, $special = '', $id = null) + { + $this->savedIDs[$prefix.($special ? '.' : '').$special][] = $id; + } + /** * Get temp table name * @@ -173,18 +186,15 @@ function CloneItems($prefix, $special, $ids, $master=null, $foreign_key=null, $parent_prefix = null) { if (!isset($master)) $master = $this->Tables; - if( strpos($prefix,'.') !== false ) list($prefix,$special) = explode('.', $prefix, 2); - $prefix_special = rtrim($prefix.'.'.$special, '.'); + // recalling by different name, because we may get kDBList, if we recall just by prefix + if (!preg_match('/(.*)-item$/', $special)) { + $special .= '-item'; + } + + $object =& $this->Application->recallObject($prefix.'.'.$special, $prefix, Array('skip_autoload' => true)); - //recalling by different name, because we may get kDBList, if we recall just by prefix - $recall_prefix = $prefix_special.($special ? '' : '.').'-item'; - $this->Application->setUnitOption($prefix, 'AutoLoad', false); - - $object =& $this->Application->recallObject($recall_prefix, $prefix); - - foreach ($ids as $id) - { + foreach ($ids as $id) { $mode = 'create'; if ( $cloned_ids = getArrayValue($this->AlreadyProcessed, $master['TableName']) ) { // if we have already cloned the id, replace it with cloned id and set mode to update @@ -206,20 +216,21 @@ } if ($mode == 'create') { - $this->RaiseEvent('OnBeforeClone', $master['Prefix'], Array($object->GetId()), $foreign_key); + $this->RaiseEvent('OnBeforeClone', $master['Prefix'], $special, Array($object->GetId()), $foreign_key); } $res = $mode == 'update' ? $object->Update() : $object->Create(); - if( $res ) + if ($res) { if ( $mode == 'create' && is_array( getArrayValue($master, 'ForeignKey')) ) { // remember original => clone mapping for dual ForeignKey updating $this->AlreadyProcessed[$master['TableName']][$id] = $object->GetId(); } if($object->mode == 't') $object->setTempID(); if ($mode == 'create') { - $this->RaiseEvent('OnAfterClone', $master['Prefix'], Array($object->GetId()), $foreign_key, array('original_id' => $id) ); + $this->RaiseEvent('OnAfterClone', $master['Prefix'], $special, Array($object->GetId()), $foreign_key, array('original_id' => $id) ); + $this->saveID($master['Prefix'], $special, $object->GetID()); } if ( is_array(getArrayValue($master, 'SubTables')) ) { @@ -248,11 +259,13 @@ $parent_key = $object->GetDBField($parent_key_field); - $this->CloneItems($sub_table['Prefix'], '', $sub_ids, $sub_table, $parent_key, $master['Prefix']); + $this->CloneItems($sub_table['Prefix'], $special, $sub_ids, $sub_table, $parent_key, $master['Prefix']); } } } } + + return $this->savedIDs[$prefix.($special ? '.' : '').$special]; } function DeleteItems($prefix, $special, $ids, $master=null, $foreign_key=null) @@ -339,7 +352,7 @@ $query = 'SELECT '.$master['IdField'].' FROM '.$master['TableName'].' WHERE '.$key_field.' IN ('.$ids.')'; if (isset($master['Constrain'])) $query .= ' AND '.$master['Constrain']; - $this->RaiseEvent( 'OnAfterCopyToTemp', $master['Prefix'], $this->Conn->GetCol($query) ); + $this->RaiseEvent( 'OnAfterCopyToTemp', $master['Prefix'], '', $this->Conn->GetCol($query) ); } if ( getArrayValue($master, 'SubTables') ) { @@ -435,7 +448,7 @@ // delete all ids from live table - for MasterTable ONLY! // because items from Sub Tables get deteleted in CopySubTablesToLive !BY ForeignKey! if ($master['TableName'] == $this->MasterTable) { - $this->RaiseEvent( 'OnBeforeDeleteFromLive', $master['Prefix'], $current_ids ); + $this->RaiseEvent( 'OnBeforeDeleteFromLive', $master['Prefix'], '', $current_ids ); $query = 'DELETE FROM '.$master['TableName'].' WHERE '.$master['IdField'].' IN ('.join(',', $current_ids).')'; $this->Conn->Query($query); @@ -446,7 +459,7 @@ foreach($current_ids AS $id) { - $this->RaiseEvent( 'OnBeforeCopyToLive', $master['Prefix'], Array($id) ); + $this->RaiseEvent( 'OnBeforeCopyToLive', $master['Prefix'], '', Array($id) ); //reset negative ids to 0, so autoincrement in live table works fine if($id < 0) @@ -470,7 +483,7 @@ $this->Conn->Query($query); $insert_id = $id_to_copy == 0 ? $this->Conn->getInsertID() : $id_to_copy; - $this->RaiseEvent( 'OnAfterCopyToLive', $master['Prefix'], Array($insert_id), null, array('temp_id' => $id) ); + $this->RaiseEvent( 'OnAfterCopyToLive', $master['Prefix'], '', Array($insert_id), null, array('temp_id' => $id) ); $this->UpdateForeignKeys($master, $insert_id, $id); @@ -489,7 +502,7 @@ elseif( !in_array($table_sig, $this->CopiedTables) && ($this->FinalRefs[$table_sig] == $master['TableId']) ) { //If current master doesn't have sub-tables - we could use mass operations // We don't need to delete items from live here, as it get deleted in the beggining of the method for MasterTable // or in parent table processing for sub-tables - $this->RaiseEvent('OnBeforeCopyToLive', $master['Prefix'], $current_ids); + $this->RaiseEvent('OnBeforeCopyToLive', $master['Prefix'], '', $current_ids); // reset ALL negative IDs to 0 so it get inserted into live table with autoincrement $query = 'UPDATE '.$this->GetTempName($master['TableName']).' @@ -563,7 +576,7 @@ WHERE '.$foreign_key_field.' IN ('.join(',', $foreign_keys).')'; if (isset($sub_table['Constrain'])) $query .= ' AND '.$sub_table['Constrain']; - $this->RaiseEvent( 'OnBeforeDeleteFromLive', $sub_table['Prefix'], $this->Conn->GetCol($query) ); + $this->RaiseEvent( 'OnBeforeDeleteFromLive', $sub_table['Prefix'], '', $this->Conn->GetCol($query) ); $query = 'DELETE FROM '.$sub_table['TableName'].' WHERE '.$foreign_key_field.' IN ('.join(',', $foreign_keys).')'; @@ -576,11 +589,16 @@ } } - function RaiseEvent($name, $prefix, $ids, $foreign_key = null, $add_params = null) + function RaiseEvent($name, $prefix, $special, $ids, $foreign_key = null, $add_params = null) { - if ( !is_array($ids) ) return; - $event = new kEvent( Array('name'=>$name, 'prefix'=>$prefix, 'special'=>'') ); - if( isset($foreign_key) ) $event->setEventParam('foreign_key', $foreign_key); + if ( !is_array($ids) ) return ; + + $event_key = $prefix.($special ? '.' : '').$special.':'.$name; + $event = new kEvent($event_key); + if (isset($foreign_key)) { + $event->setEventParam('foreign_key', $foreign_key); + } + foreach($ids as $id) { $event->setEventParam('id', $id);