Index: trunk/kernel/include/category.php =================================================================== diff -u -N -r3220 -r3228 --- trunk/kernel/include/category.php (.../category.php) (revision 3220) +++ trunk/kernel/include/category.php (.../category.php) (revision 3228) @@ -51,13 +51,46 @@ return $string; } - function checkAutoFilename($string) + function checkAutoFilename($filename) { - while( preg_match('/(.*)_([\d]+)$/', $string, $rets) ) + global $m_var_list; + + if(!$filename || $this->UniqueId() == 0 ) return $filename; + $db =& GetADODBConnection(); + + $sql = 'SELECT Filename FROM '.$this->tablename.' WHERE CategoryId = '.$this->UniqueId(); + $db_filename = $db->GetOne($sql); + +// $check = true; + $check = $db_filename != $filename; + + if($check) { - $string = $rets[1]; + // 2. filename was changed (manually or automatically) + $sql = 'SELECT CategoryId FROM '.$this->tablename.' WHERE (Filename = '.$db->qstr($filename).') AND (ParentId = '.$m_var_list['cat'].')'; + $category_id = $db->GetOne($sql); + $has_page = preg_match('/(.*)_([\d]+)([a-z]*)$/', $filename, $rets); + if( ($category_id != $this->UniqueId()) || $has_page ) // other category has same filename as ours OR we have filename, that ends with _number + { + $append = $category_id ? 'a' : ''; + if($has_page) + { + $filename = $rets[1].'_'.$rets[2]; + $append = $rets[3] ? $rets[3] : 'a'; + } + + $sql = 'SELECT CategoryId FROM '.$this->tablename.' WHERE (Filename = %s) AND (CategoryId != '.$this->UniqueId().') AND (ParentId = '.$m_var_list['cat'].')'; + while ( $db->GetOne( sprintf($sql, $db->qstr($filename.$append)) ) > 0 ) + { + if (substr($append, -1) == 'z') $append .= 'a'; + $append = substr($append, 0, strlen($append) - 1) . chr( ord( substr($append, -1) ) + 1 ); + } + + return $filename.$append; + } } - return $string; + + return $filename; } function GenerateFilename() @@ -122,17 +155,22 @@ function Update($UpdatedBy=NULL) { - $this->GenerateFilename(); parent::Update($UpdatedBy); + $this->GenerateFilename(); + + parent::Update($UpdatedBy); + if ($this->tablename == GetTablePrefix().'Category') $this->ClearCacheData(); } function Create() { - $this->GenerateFilename(); if( (int)$this->Get('CreatedOn') == 0 ) $this->Set('CreatedOn', date('U') ); - parent::Create(); + + $this->GenerateFilename(); + parent::Update(); + if ($this->tablename == GetTablePrefix().'Category') $this->ClearCacheData(); } @@ -781,6 +819,10 @@ $field = strtolower( $element->GetAttributeByName('_field') ); switch($field) { + case 'filename': + $ret = $this->Get('Filename'); + break; + case 'm_language': $ret = language( $element->GetAttributeByName('_Phrase') ); break; @@ -2091,6 +2133,7 @@ $Id != $ParentTo) { $d->Set("ParentId", $ParentTo); + $d->Set('Filename', ''); $d->Update(); $d->UpdateCachedPath(); RunUp($oldparent, "Decrement_Count"); @@ -2207,6 +2250,7 @@ $dest->UnsetIdField(); $dest->Set("CachedDescendantCatsQty",0); $dest->Set("ResourceId",NULL); + $dest->Set('Filename', ''); $dest->Create(); $dest->UpdateCachedPath(); $p = new clsPermList();