Index: trunk/core/kernel/utility/temp_handler.php =================================================================== diff -u -r2797 -r2799 --- trunk/core/kernel/utility/temp_handler.php (.../temp_handler.php) (revision 2797) +++ trunk/core/kernel/utility/temp_handler.php (.../temp_handler.php) (revision 2799) @@ -135,6 +135,7 @@ 'TableName' => $this->Application->getUnitOption($prefix,'TableName'), 'IdField' => $this->Application->getUnitOption($prefix,'IDField'), 'ForeignKey' => $this->Application->getUnitOption($prefix,'ForeignKey'), + 'ParentPrefix' => $this->Application->getUnitOption($prefix, 'ParentPrefix'), 'ParentTableKey' => $this->Application->getUnitOption($prefix,'ParentTableKey'), 'Prefix' => $prefix, 'AutoClone' => $this->Application->getUnitOption($prefix,'AutoClone'), @@ -163,7 +164,7 @@ $tables['SubTables'][] = $tmp; } - function CloneItems($prefix, $special, $ids, $master=null, $foreign_key=null, $parent_prefix=null) + function CloneItems($prefix, $special, $ids, $master=null, $foreign_key=null) { if (!isset($master)) $master = $this->Tables; if( strpos($prefix,'.') !== false ) list($prefix,$special) = explode('.', $prefix, 2); @@ -194,7 +195,7 @@ $object->NameCopy($master, $foreign_key); if (isset($foreign_key)) { - $master_foreign_key_field = is_array($master['ForeignKey']) ? $master['ForeignKey'][$parent_prefix] : $master['ForeignKey']; + $master_foreign_key_field = is_array($master['ForeignKey']) ? $master['ForeignKey'][ $master['ParentPrefix'] ] : $master['ForeignKey']; $object->SetDBField($master_foreign_key_field, $foreign_key); } @@ -240,7 +241,7 @@ $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'], '', $sub_ids, $sub_table, $parent_key); } } } Index: trunk/core/kernel/db/dbitem.php =================================================================== diff -u -r2787 -r2799 --- trunk/core/kernel/db/dbitem.php (.../dbitem.php) (revision 2787) +++ trunk/core/kernel/db/dbitem.php (.../dbitem.php) (revision 2799) @@ -513,7 +513,10 @@ $sql = 'SELECT COUNT(*) FROM %s WHERE ('.implode(') AND (',$where).') AND ('.$this->IDField.' <> '.(int)$this->ID.')'; $res_temp = $this->Conn->GetOne( str_replace('%s', $this->TableName, $sql) ); - $res_live = $this->Conn->GetOne( str_replace('%s', kTempTablesHandler::GetLiveName($this->TableName), $sql) ); + + $current_table_only = getArrayValue($params, 'current_table_only'); // check unique record only in current table + $res_live = $current_table_only ? 0 : $this->Conn->GetOne( str_replace('%s', kTempTablesHandler::GetLiveName($this->TableName), $sql) ); + $res = ($res_temp == 0) && ($res_live == 0); if(!$res) $this->FieldErrors[$error_field]['pseudo'] = 'unique'; @@ -723,8 +726,11 @@ $query = 'SELECT '.$title_field.' FROM '.$this->TableName.' WHERE '.$title_field.' = '.$this->Conn->qstr($new_name); - if (getArrayValue($master, 'ForeignKey') && isset($foreign_key)) { - $query .= ' AND '.$master['ForeignKey'].' = '.$foreign_key; + $foreign_key_field = getArrayValue($master, 'ForeignKey'); + $foreign_key_field = is_array($foreign_key_field) ? $foreign_key_field[ $master['ParentPrefix'] ] : $foreign_key_field; + + if ($foreign_key_field && isset($foreign_key)) { + $query .= ' AND '.$foreign_key_field.' = '.$foreign_key; } $res = $this->Conn->GetOne($query); Index: trunk/kernel/units/selectors/selectors_event_handler.php =================================================================== diff -u -r2798 -r2799 --- trunk/kernel/units/selectors/selectors_event_handler.php (.../selectors_event_handler.php) (revision 2798) +++ trunk/kernel/units/selectors/selectors_event_handler.php (.../selectors_event_handler.php) (revision 2799) @@ -7,47 +7,45 @@ { /** - * Occures after an item has been cloned + * Occures before an item has been cloned * Id of newly created item is passed as event' 'id' param * * @param kEvent $event */ - function OnAfterClone(&$event) + function OnBeforeClone(&$event) { - $object =& $event->getObject( Array('skip_autoload' => true) ); - $object->Load( $event->getEventParam('id') ); + $event->Init($event->Prefix, '-item'); + $object =& $event->getObject(); - $linked_info = $object->getLinkedInfo(); - $selector_name = $object->GetDBField('SelectorName'); - - // temp table sql - $sql = 'SELECT RIGHT(SelectorName, LENGTH(SelectorName) - %s) AS SelectorIndex - FROM %s - WHERE (%s = %s) AND SelectorName LIKE %s AND (%s != %s) - ORDER BY SelectorIndex DESC'; - $sql = sprintf( $sql, - strlen($selector_name), - $object->TableName, - $linked_info['ForeignKey'], - $linked_info['ParentId'], - $this->Conn->qstr($selector_name.'%' ), - $object->IDField, - $object->GetID() ); - - $selector_index = $this->Conn->GetOne($sql); - if($selector_index !== false) - { - $selector_index = (int)ltrim($selector_index, '-'); - $object->SetDBField('SelectorName', $selector_name.'-'.(++$selector_index) ); - $object->Update(); - } - - // live table sql if previous was in temp table - $live_table = $this->Application->getUnitOption($object->Prefix, 'TableName'); - if($live_table != $object->TableName) - { + $title_field = 'SelectorName'; + $new_name = $object->GetDBField($title_field); + $original_checked = false; + do { + if ( preg_match('/(.*)-([\d]+)/', $new_name, $regs) ) { + $new_name = $regs[1].'-'.($regs[2]+1); + } + elseif ($original_checked) { + $new_name = $new_name.'-1'; + } - } + // if we are cloning in temp table this will look for names in temp table, + // since object' TableName contains correct TableName (for temp also!) + // 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'); + $res = $this->Conn->GetOne($query); + + /*// if not found in live table, check in temp table if applicable + if ($res === false && $object->Special == 'temp') { + $query = 'SELECT '.$name_field.' FROM '.$this->GetTempName($master['TableName']).' + WHERE '.$name_field.' = '.$this->Conn->qstr($new_name); + $res = $this->Conn->GetOne($query); + }*/ + + $original_checked = true; + } while ($res !== false); + $object->SetDBField($title_field, $new_name); } /** Index: trunk/core/units/selectors/selectors_config.php =================================================================== diff -u -r2792 -r2799 --- trunk/core/units/selectors/selectors_config.php (.../selectors_config.php) (revision 2792) +++ trunk/core/units/selectors/selectors_config.php (.../selectors_config.php) (revision 2799) @@ -88,9 +88,9 @@ ), 'Fields' => Array( 'SelectorId' => Array(), - 'StylesheetId' => Array('type' => 'int', 'unique'=>Array('SelectorName'), 'not_null' => '1','default' => '0'), + 'StylesheetId' => Array('type' => 'int', 'unique'=>Array('SelectorName'), 'current_table_only' => 1, 'not_null' => '1','default' => '0'), 'Name' => Array('type' => 'string','not_null' => '1','default' => '','required'=>1), - 'SelectorName' => Array('type' => 'string', 'unique'=>Array('StylesheetId'), 'not_null' => '1','default' => '','required'=>1), + 'SelectorName' => Array('type' => 'string', 'unique'=>Array('StylesheetId'), 'current_table_only' => 1, 'not_null' => '1','default' => '','required'=>1), 'SelectorData' => Array('not_null' => '1','default' => ''), 'Description' => Array('type' => 'string','not_null' => '1','default' => ''), 'Type' => Array('type' => 'int', 'formatter'=>'kOptionsFormatter', 'options'=>Array( 1 => 'la_BaseSelectors', 2 => 'la_BlockSelectors'), 'use_phrases' => 1, 'not_null' => '1','default' => '0'), Index: trunk/core/units/selectors/selectors_event_handler.php =================================================================== diff -u -r2798 -r2799 --- trunk/core/units/selectors/selectors_event_handler.php (.../selectors_event_handler.php) (revision 2798) +++ trunk/core/units/selectors/selectors_event_handler.php (.../selectors_event_handler.php) (revision 2799) @@ -7,47 +7,45 @@ { /** - * Occures after an item has been cloned + * Occures before an item has been cloned * Id of newly created item is passed as event' 'id' param * * @param kEvent $event */ - function OnAfterClone(&$event) + function OnBeforeClone(&$event) { - $object =& $event->getObject( Array('skip_autoload' => true) ); - $object->Load( $event->getEventParam('id') ); + $event->Init($event->Prefix, '-item'); + $object =& $event->getObject(); - $linked_info = $object->getLinkedInfo(); - $selector_name = $object->GetDBField('SelectorName'); - - // temp table sql - $sql = 'SELECT RIGHT(SelectorName, LENGTH(SelectorName) - %s) AS SelectorIndex - FROM %s - WHERE (%s = %s) AND SelectorName LIKE %s AND (%s != %s) - ORDER BY SelectorIndex DESC'; - $sql = sprintf( $sql, - strlen($selector_name), - $object->TableName, - $linked_info['ForeignKey'], - $linked_info['ParentId'], - $this->Conn->qstr($selector_name.'%' ), - $object->IDField, - $object->GetID() ); - - $selector_index = $this->Conn->GetOne($sql); - if($selector_index !== false) - { - $selector_index = (int)ltrim($selector_index, '-'); - $object->SetDBField('SelectorName', $selector_name.'-'.(++$selector_index) ); - $object->Update(); - } - - // live table sql if previous was in temp table - $live_table = $this->Application->getUnitOption($object->Prefix, 'TableName'); - if($live_table != $object->TableName) - { + $title_field = 'SelectorName'; + $new_name = $object->GetDBField($title_field); + $original_checked = false; + do { + if ( preg_match('/(.*)-([\d]+)/', $new_name, $regs) ) { + $new_name = $regs[1].'-'.($regs[2]+1); + } + elseif ($original_checked) { + $new_name = $new_name.'-1'; + } - } + // if we are cloning in temp table this will look for names in temp table, + // since object' TableName contains correct TableName (for temp also!) + // 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'); + $res = $this->Conn->GetOne($query); + + /*// if not found in live table, check in temp table if applicable + if ($res === false && $object->Special == 'temp') { + $query = 'SELECT '.$name_field.' FROM '.$this->GetTempName($master['TableName']).' + WHERE '.$name_field.' = '.$this->Conn->qstr($new_name); + $res = $this->Conn->GetOne($query); + }*/ + + $original_checked = true; + } while ($res !== false); + $object->SetDBField($title_field, $new_name); } /** Index: trunk/kernel/units/selectors/selectors_config.php =================================================================== diff -u -r2792 -r2799 --- trunk/kernel/units/selectors/selectors_config.php (.../selectors_config.php) (revision 2792) +++ trunk/kernel/units/selectors/selectors_config.php (.../selectors_config.php) (revision 2799) @@ -88,9 +88,9 @@ ), 'Fields' => Array( 'SelectorId' => Array(), - 'StylesheetId' => Array('type' => 'int', 'unique'=>Array('SelectorName'), 'not_null' => '1','default' => '0'), + 'StylesheetId' => Array('type' => 'int', 'unique'=>Array('SelectorName'), 'current_table_only' => 1, 'not_null' => '1','default' => '0'), 'Name' => Array('type' => 'string','not_null' => '1','default' => '','required'=>1), - 'SelectorName' => Array('type' => 'string', 'unique'=>Array('StylesheetId'), 'not_null' => '1','default' => '','required'=>1), + 'SelectorName' => Array('type' => 'string', 'unique'=>Array('StylesheetId'), 'current_table_only' => 1, 'not_null' => '1','default' => '','required'=>1), 'SelectorData' => Array('not_null' => '1','default' => ''), 'Description' => Array('type' => 'string','not_null' => '1','default' => ''), 'Type' => Array('type' => 'int', 'formatter'=>'kOptionsFormatter', 'options'=>Array( 1 => 'la_BaseSelectors', 2 => 'la_BlockSelectors'), 'use_phrases' => 1, 'not_null' => '1','default' => '0'),