commit 95d0af6e834c6e3346e81d2d9dcc1b2b7e48e230
parent 5024fe88928772a1c9c7f062bb745fe7f02c0d17
Author: dankert <devnull@localhost>
Date: Thu, 15 Oct 2009 00:06:07 +0200
Übergeordnete Ordner rekursiv ermitteln, entfernen einer Methode in 'Folder.class'
Diffstat:
4 files changed, 53 insertions(+), 159 deletions(-)
diff --git a/actionClasses/FolderAction.class.php b/actionClasses/FolderAction.class.php
@@ -1306,7 +1306,7 @@ class FolderAction extends ObjectAction
switch( $name)
{
case 'createfolder':
- return $this->folder->hasRight(ACL_CREATE_FOLDER) && count($this->folder->parentObjectIds(true,true)) < MAX_FOLDER_DEPTH;
+ return $this->folder->hasRight(ACL_CREATE_FOLDER) && count($this->folder->parentObjectFileNames(true,true)) < MAX_FOLDER_DEPTH;
case 'createfile':
return $this->folder->hasRight(ACL_CREATE_FILE);
diff --git a/objectClasses/Folder.class.php b/objectClasses/Folder.class.php
@@ -211,7 +211,6 @@ class Folder extends Object
$sql = new Sql('SELECT id FROM {t_object}'.
' WHERE parentid={objectid}'.
' ORDER BY orderid ASC' );
- $sql->setInt('projectid',$this->projectid );
$sql->setInt('objectid' ,$this->objectid );
return( $db->getCol( $sql ) );
@@ -550,7 +549,7 @@ class Folder extends Object
if ( $inherit )
{
// ?bergeordnete Ordner ermitteln
- $parentfolder = $this->parentObjectIds();
+ $parentfolder = $this->parentObjectFileNames();
// ?bergeordnete Ordner immer anzeigen (Schalter 'show'=true)
foreach( $parentfolder as $folderid=>$name )
@@ -583,67 +582,6 @@ class Folder extends Object
}
- // Ermitteln aller ?bergeordneten Ordner
- //
- function parentfolder_bak( $with_root = false, $with_self = false )
- {
- $db = db_connection();
- $this->parentfolders = array();
-
- // ?bergeordneten Ordner lesen
- $sql = new Sql('SELECT parentid FROM {t_folder} WHERE id={folderid}');
-
- $sql->setInt('folderid',$this->folderid);
- $parentid = $db->getOne( $sql );
-
- // Ordner ist bereits h?chster Ordner
- if ( !is_numeric($parentid))
- {
- // Falls Anzeige h?chster oder aktueller Ordner
- if ( $with_root && $with_self )
- {
- if ( $this->filenames )
- $this->parentfolders[ $this->folderid ] = $this->filename;
- else $this->parentfolders[ $this->folderid ] = $this->name;
- }
-
- return $this->parentfolders;
- }
-
- // Aktuellen Ordner hinzuf?gen
- if ( $with_self )
- {
- if ( $this->filenames )
- $this->parentfolders[ $this->folderid ] = $this->filename;
- else $this->parentfolders[ $this->folderid ] = $this->name;
- }
-
- // Schleife ?ber alle ?bergeordneten Ordner
- while( is_numeric($parentid) )
- {
- $sql = new Sql('SELECT * FROM {t_folder} WHERE id={folderid}');
- $sql->setInt('folderid',$parentid);
-
- $row_folder = $db->getRow( $sql );
-
- if (is_numeric($row_folder['parentid']) || $with_root)
- {
- if ( $this->filenames )
- $this->parentfolders[ $parentid ] = $row_folder['filename'];
- else $this->parentfolders[ $parentid ] = $row_folder['name'];
- }
-
- $parentid = $row_folder['parentid'];
- }
-
-
- // Reihenfolge umdrehen
- $this->parentfolders = array_reverse($this->parentfolders,true);
-
- return $this->parentfolders;
- }
-
-
function addParentFolder( $id,$name,$filename='' )
{
if ( empty($name) )
@@ -684,89 +622,37 @@ class Folder extends Object
}
- // Ermitteln aller ?bergeordneten Ordner
- //
- function parentObjectIds( $with_root = false, $with_self = false )
- {
- $db = Session::getDatabase();
- $this->parentfolders = array();
-
- // ?bergeordneten Ordner lesen
- //$sql = new Sql('SELECT parentid FROM {t_object} WHERE id={objectid}');
- $sql = new Sql('SELECT F0.id AS f0id,'.
- ' F1.id AS f1id,'.
- ' F2.id AS f2id,'.
- ' F3.id AS f3id,'.
- ' F4.id AS f4id,'.
- ' F5.id AS f5id '.
- ' FROM {t_object} AS F0'.
- ' LEFT JOIN {t_object} AS F1 on F0.parentid=F1.id '.
- ' LEFT JOIN {t_object} AS F2 on F1.parentid=F2.id '.
- ' LEFT JOIN {t_object} AS F3 on F2.parentid=F3.id '.
- ' LEFT JOIN {t_object} AS F4 on F3.parentid=F4.id '.
- ' LEFT JOIN {t_object} AS F5 on F4.parentid=F5.id '.
- ' WHERE F0.id={objectid}');
-
-// ' LEFT JOIN {t_name} '.
-// ' ON {t_object}.id={t_name}.objectid AND {t_name}.languageid={languageid} '.
-
- $sql->setInt('objectid',$this->objectid);
-
- $row = $db->getRow( $sql );
-
- $this->parentfolders = array();
- $this->addParentfolder( $row['f0id'],$row['f0id'] );
- $this->addParentfolder( $row['f1id'],$row['f1id'] );
- $this->addParentfolder( $row['f2id'],$row['f2id'] );
- $this->addParentfolder( $row['f3id'],$row['f3id'] );
- $this->addParentfolder( $row['f4id'],$row['f4id'] );
- $this->addParentfolder( $row['f5id'],$row['f5id'] );
-
- $this->checkParentFolders($with_root,$with_self);
-
- return $this->parentfolders;
- }
-
-
function parentObjectFileNames( $with_root = false, $with_self = false )
{
$db = Session::getDatabase();
+
+ $foid = $this->id;
+ $idCache = array();
+
+ while( intval($foid)!=0 )
+ {
+ $sql = new Sql( <<<SQL
+
+SELECT parentid,id,filename
+ FROM {t_object}
+ WHERE {t_object}.id={parentid}
- $sql = new Sql( <<<EOF
-SELECT F0.id AS f0id,
- F0.filename AS f0filename,
- F1.id AS f1id,
- F1.filename AS f1filename,
- F2.id AS f2id,
- F2.filename AS f2filename,
- F3.id AS f3id,
- F3.filename AS f3filename,
- F4.id AS f4id,
- F4.filename AS f4filename,
- F5.id AS f5id,
- F5.filename AS f5filename
- FROM {t_object} AS F0
-LEFT JOIN {t_object} AS F1 on F0.parentid=F1.id
-LEFT JOIN {t_object} AS F2 on F1.parentid=F2.id
-LEFT JOIN {t_object} AS F3 on F2.parentid=F3.id
-LEFT JOIN {t_object} AS F4 on F3.parentid=F4.id
-LEFT JOIN {t_object} AS F5 on F4.parentid=F5.id
-WHERE F0.id={objectid}
-EOF
+SQL
);
-
- $sql->setInt('objectid' ,$this->objectid );
- $sql->setInt('languageid',$this->languageid);
-
- $row = $db->getRow( $sql );
-
- $this->addParentfolder( $row['f0id'],$row['f0filename'] );
- $this->addParentfolder( $row['f1id'],$row['f1filename'] );
- $this->addParentfolder( $row['f2id'],$row['f2filename'] );
- $this->addParentfolder( $row['f3id'],$row['f3filename'] );
- $this->addParentfolder( $row['f4id'],$row['f4filename'] );
- $this->addParentfolder( $row['f5id'],$row['f5filename'] );
-
+ $sql->setInt('parentid' ,$foid );
+
+ $row = $db->getRow( $sql );
+
+ if ( in_array($row['id'],$idCache))
+ Http::serverError('fatal: parent-rekursion in object-id: '.$this->objectid.', double-parent-id: '.$row['id']);
+ else
+ $idCache[] = $row['id'];
+
+ $this->addParentfolder( $row['id'],$row['filename'] );
+ $foid = $row['parentid'];
+ }
+
+
$this->checkParentFolders($with_root,$with_self);
return $this->parentfolders;
diff --git a/objectClasses/Object.class.php b/objectClasses/Object.class.php
@@ -768,26 +768,30 @@ SQL
$this->checkFilename();
- $sql = new Sql('UPDATE {t_object} SET '.
- ' parentid={parentid},'.
- ' lastchange_date = {time} ,'.
- ' lastchange_userid = {userid},'.
- ' filename = {filename}'.
- ' WHERE id={objectid}');
+ $sql = new Sql( <<<SQL
+UPDATE {t_object} SET
+ parentid = {parentid},
+ lastchange_date = {time} ,
+ lastchange_userid = {userid} ,
+ filename = {filename}
+ WHERE id={objectid}
+SQL
+);
+
if ( $this->isRoot )
$sql->setNull('parentid');
else $sql->setInt ('parentid',$this->parentid );
- $sql->setInt ('objectid', $this->objectid);
+ $sql->setInt ('time' ,$this->lastchangeDate );
+ $sql->setInt ('userid' ,$this->lastchangeUser->userid );
$sql->setString('filename', $this->filename);
+ $sql->setInt ('objectid', $this->objectid);
$user = Session::getUser();
$this->lastchangeUser = $user;
$this->lastchangeDate = time();
- $sql->setInt ('userid' ,$this->lastchangeUser->userid );
- $sql->setInt ('time' ,$this->lastchangeDate );
$db->query($sql);
@@ -858,10 +862,10 @@ SQL
AND languageid={languageid}
SQL
);
- $sql->setInt( 'objectid' , $this->objectid );
- $sql->setInt( 'languageid', $this->languageid );
$sql->setString('name', $this->name);
$sql->setString('desc', $this->desc);
+ $sql->setInt( 'objectid' , $this->objectid );
+ $sql->setInt( 'languageid', $this->languageid );
$db->query($sql);
}
else
@@ -1029,12 +1033,17 @@ SQL
{
$db = db_connection();
- $sql = new Sql('SELECT COUNT(*) FROM {t_object}'.' WHERE parentid={parentid} AND filename={filename} AND NOT id = {objectid}');
+ $sql = new Sql( <<<SQL
+SELECT COUNT(*) FROM {t_object}
+ WHERE parentid={parentid} AND filename={filename}
+ AND NOT id = {objectid}
+SQL
+);
$sql->setString('parentid', $this->parentid);
+ $sql->setString('filename', $filename );
$sql->setString('objectid', $this->objectid);
- $sql->setString('filename', $filename );
return( intval($db->getOne($sql)) == 0 );
}
@@ -1096,7 +1105,7 @@ SQL
$db = db_connection();
$folder = new Folder( $this->parentid );
- foreach( $folder->parentObjectIds(true,true) as $oid )
+ foreach( $folder->parentObjectFileNames(true,true) as $oid=>$filename )
{
$sql = new Sql( 'SELECT id FROM {t_acl} '.
' WHERE objectid={objectid}'.
@@ -1127,7 +1136,7 @@ SQL
$db = db_connection();
$folder = new Folder( $this->parentid );
- foreach( $folder->parentObjectIds(true,true) as $oid )
+ foreach( $folder->parentObjectFileNames(true,true) as $oid=>$filename )
{
$sql = new Sql( 'SELECT id FROM {t_acl} '.
' WHERE objectid={objectid}'.
diff --git a/objectClasses/Page.class.php b/objectClasses/Page.class.php
@@ -415,8 +415,7 @@ class Page extends Object
$folder = new Folder( $this->parentid );
$folder->load();
- $folder->parentObjectIds(false,true);
- $f = count( $folder->parentfolders );
+ $f = count( $folder->parentObjectFileNames(false,true) );
if ( $f == 0 )
{