Index: trunk/core/kernel/utility/temp_handler.php =================================================================== diff -u -r2799 -r2800 --- trunk/core/kernel/utility/temp_handler.php (.../temp_handler.php) (revision 2799) +++ trunk/core/kernel/utility/temp_handler.php (.../temp_handler.php) (revision 2800) @@ -164,7 +164,7 @@ $tables['SubTables'][] = $tmp; } - function CloneItems($prefix, $special, $ids, $master=null, $foreign_key=null) + 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); @@ -195,12 +195,12 @@ $object->NameCopy($master, $foreign_key); if (isset($foreign_key)) { - $master_foreign_key_field = is_array($master['ForeignKey']) ? $master['ForeignKey'][ $master['ParentPrefix'] ] : $master['ForeignKey']; + $master_foreign_key_field = is_array($master['ForeignKey']) ? $master['ForeignKey'][$parent_prefix] : $master['ForeignKey']; $object->SetDBField($master_foreign_key_field, $foreign_key); } if ($mode == 'create') { - $this->RaiseEvent('OnBeforeClone', $master['Prefix'], Array($object->GetId()) ); + $this->RaiseEvent('OnBeforeClone', $master['Prefix'], Array($object->GetId()), $foreign_key); } $res = $mode == 'update' ? $object->Update() : $object->Create(); @@ -213,7 +213,7 @@ } if($object->mode == 't') $object->setTempID(); if ($mode == 'create') { - $this->RaiseEvent('OnAfterClone', $master['Prefix'], Array($object->GetId()) ); + $this->RaiseEvent('OnAfterClone', $master['Prefix'], Array($object->GetId()), $foreign_key ); } if ( is_array(getArrayValue($master, 'SubTables')) ) { @@ -226,7 +226,8 @@ $query = 'SELECT '.$sub_table['IdField'].' FROM '.$sub_TableName.' WHERE '.$foreign_key_field.' = '.$original_values[$parent_key_field]; - + if (isset($sub_table['Constrain'])) $query .= ' AND '.$sub_table['Constrain']; + $sub_ids = $this->Conn->GetCol($query); if ( is_array(getArrayValue($sub_table, 'ForeignKey')) ) { @@ -241,7 +242,7 @@ $parent_key = $object->GetDBField($parent_key_field); - $this->CloneItems($sub_table['Prefix'], '', $sub_ids, $sub_table, $parent_key); + $this->CloneItems($sub_table['Prefix'], '', $sub_ids, $sub_table, $parent_key, $master['Prefix']); } } } @@ -287,7 +288,7 @@ } } - + function DoCopyLiveToTemp($master, $ids, $parent_prefix=null) { // when two tables refers the same table as sub-sub-table, and ForeignKey and ParentTableKey are arrays @@ -419,6 +420,8 @@ if (isset($master['Constrain'])) $query .= ' WHERE '.$master['Constrain']; $current_ids = $this->Conn->GetCol($query); + $table_sig = $master['TableName'].(isset($master['Constrain']) ? $master['Constrain'] : ''); + if ($current_ids) { // delete all ids from live table - for MasterTable ONLY! // because items from Sub Tables get deteleted in CopySubTablesToLive !BY ForeignKey! @@ -430,18 +433,24 @@ } if ( getArrayValue($master, 'SubTables') ) { - foreach ($current_ids AS $id) { + if( in_array($table_sig, $this->CopiedTables) ) continue; + + foreach($current_ids AS $id) + { $this->RaiseEvent( 'OnBeforeCopyToLive', $master['Prefix'], Array($id) ); //reset negative ids to 0, so autoincrement in live table works fine - if ($id < 0) { + if($id < 0) + { $query = 'UPDATE '.$this->GetTempName($master['TableName']).' SET '.$master['IdField'].' = 0 WHERE '.$master['IdField'].' = '.$id; + if (isset($master['Constrain'])) $query .= ' AND '.$master['Constrain']; $this->Conn->Query($query); $id_to_copy = 0; } - else { + else + { $id_to_copy = $id; } @@ -462,13 +471,15 @@ if (isset($master['Constrain'])) $query .= ' AND '.$master['Constrain']; $this->Conn->Query($query); } + + $this->CopiedTables[] = $table_sig; + // when all of ids in current master has been processed, copy all sub-tables data $this->CopySubTablesToLive($master, $current_ids); } - else { //If current master doesn't have sub-tables - we could use mass operations + elseif( !in_array($table_sig, $this->CopiedTables) ) { //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); // reset ALL negative IDs to 0 so it get inserted into live table with autoincrement @@ -483,7 +494,8 @@ SELECT * FROM '.$this->GetTempName($master['TableName']); if (isset($master['Constrain'])) $query .= ' WHERE '.$master['Constrain']; $this->Conn->Query($query); - + + $this->CopiedTables[] = $table_sig; /* !!! WE NEED TO FIND A WAY TO DETERMINE IF OnAfterCopyToLive is not an empty method, and do on-by-one insert @@ -528,9 +540,11 @@ function CopySubTablesToLive($master, $current_ids) { foreach ($master['SubTables'] as $sub_table) { + $table_sig = $sub_table['TableName'].(isset($sub_table['Constrain']) ? $sub_table['Constrain'] : ''); + // delete records from live table by foreign key, so that records deleted from temp table // get deleted from live - if (count($current_ids) > 0) { + if (count($current_ids) > 0 && !in_array($table_sig, $this->CopiedTables) ) { $foreign_keys = $this->GetForeignKeys($master, $sub_table, $current_ids); $foreign_key_field = is_array($sub_table['ForeignKey']) ? $sub_table['ForeignKey'][$master['Prefix']] : $sub_table['ForeignKey']; if (count($foreign_keys) > 0) { @@ -546,17 +560,18 @@ $this->Conn->Query($query); } } - //sub_table passed here becomes master in the method, and recursively updated and copy its sub tables $this->DoCopyTempToOriginal($sub_table, $master['Prefix']); } } - function RaiseEvent($name, $prefix, $ids) + function RaiseEvent($name, $prefix, $ids, $foreign_key = null) { if ( !is_array($ids) ) return; - foreach ($ids as $id) { - $event = new kEvent( Array('name'=>$name, 'prefix'=>$prefix, 'special'=>'') ); + $event = new kEvent( Array('name'=>$name, 'prefix'=>$prefix, 'special'=>'') ); + if( isset($foreign_key) ) $event->setEventParam('foreign_key', $foreign_key); + foreach($ids as $id) + { $event->setEventParam('id', $id); $this->Application->HandleEvent($event); } Index: trunk/kernel/units/selectors/selectors_event_handler.php =================================================================== diff -u -r2799 -r2800 --- trunk/kernel/units/selectors/selectors_event_handler.php (.../selectors_event_handler.php) (revision 2799) +++ trunk/kernel/units/selectors/selectors_event_handler.php (.../selectors_event_handler.php) (revision 2800) @@ -20,6 +20,10 @@ $title_field = 'SelectorName'; $new_name = $object->GetDBField($title_field); $original_checked = false; + + $foreign_key = $event->getEventParam('foreign_key'); // in case if whole stylesheet is cloned + if($foreign_key === false) $foreign_key = $object->GetDBField('StylesheetId'); // in case if selector is copied ifself + do { if ( preg_match('/(.*)-([\d]+)/', $new_name, $regs) ) { $new_name = $regs[1].'-'.($regs[2]+1); @@ -33,7 +37,8 @@ // if we are cloning live - look in live $query = ' SELECT '.$title_field.' FROM '.$object->TableName.' - WHERE '.$title_field.' = '.$this->Conn->qstr($new_name).' AND StylesheetId = '.$object->GetDBField('StylesheetId'); + WHERE '.$title_field.' = '.$this->Conn->qstr($new_name).' AND StylesheetId = '.$foreign_key; + $res = $this->Conn->GetOne($query); /*// if not found in live table, check in temp table if applicable Index: trunk/core/units/selectors/selectors_event_handler.php =================================================================== diff -u -r2799 -r2800 --- trunk/core/units/selectors/selectors_event_handler.php (.../selectors_event_handler.php) (revision 2799) +++ trunk/core/units/selectors/selectors_event_handler.php (.../selectors_event_handler.php) (revision 2800) @@ -20,6 +20,10 @@ $title_field = 'SelectorName'; $new_name = $object->GetDBField($title_field); $original_checked = false; + + $foreign_key = $event->getEventParam('foreign_key'); // in case if whole stylesheet is cloned + if($foreign_key === false) $foreign_key = $object->GetDBField('StylesheetId'); // in case if selector is copied ifself + do { if ( preg_match('/(.*)-([\d]+)/', $new_name, $regs) ) { $new_name = $regs[1].'-'.($regs[2]+1); @@ -33,7 +37,8 @@ // if we are cloning live - look in live $query = ' SELECT '.$title_field.' FROM '.$object->TableName.' - WHERE '.$title_field.' = '.$this->Conn->qstr($new_name).' AND StylesheetId = '.$object->GetDBField('StylesheetId'); + WHERE '.$title_field.' = '.$this->Conn->qstr($new_name).' AND StylesheetId = '.$foreign_key; + $res = $this->Conn->GetOne($query); /*// if not found in live table, check in temp table if applicable