Location: PHPKode > projects > Content*Builder > contentbuilder/lib/CB_column.class.php
<?php

/**
* CB_Column
* 
* Mit dieser Klasse können Rubriken verwaltet werden
*
* @package               CB Column 
* @access                public
* @author                Jörg Stöber <hide@address.com>
* @version               0.1 ($Id: CB_column.class.php,v 1.2 2004/05/15 00:49:18 cb_fog Exp $)
*/
class CB_Column {
	function CB_Column() {
		$this->cbOption = new CBOption();
		$this->cbOption->setModule("system");
		$this->cbOption->getOptionList();
	}
	
	/**
	 * Diese Methode sucht alle Skins für das Webfrontend
	 * 
	 * @access public 
	 * @return array $skinTplDirArray Liste aller gefundenen Skins
	 */
	function skinFinder() {
		$BTPL_location = $this->cbOption->getSingleOption("BTPL_location");
		if(is_file($BTPL_location."prepend.php") && is_file($BTPL_location."index.php")) {
			$skinTplDirArray  = array();
			$skinTplCounter   = 0;
			$dir2scan        = $BTPL_location."templates/";
			if(is_dir($dir2scan)) {
				$skinTplDir	     = dir($dir2scan);
				/* Finding Skin */
				while($skinTplDirEntry = $skinTplDir->read()) {
					if(is_dir($dir2scan.$skinTplDirEntry) && ($skinTplDirEntry != ".") && ($skinTplDirEntry != "..")) {
						if(file_exists($dir2scan.$skinTplDirEntry."/contentbuilder.template")) {
							$skinTplDirArray[] = $skinTplDirEntry;
							++$skinTplCounter;
						}
						
						/* Finding subElements */
						if(is_dir($dir2scan.$skinTplDirEntry."/sub/")) {
							$subDir2scan     = $dir2scan.$skinTplDirEntry."/sub/";
							$subElementDir	 = dir($subDir2scan);
							while($subElementDirEntry = $subElementDir->read()) {
								if(is_dir($subDir2scan.$subElementDirEntry) && ($subElementDirEntry != ".") && ($subElementDirEntry != "..")) {
									if(file_exists($subDir2scan.$subElementDirEntry."/modules.php") && file_exists($subDir2scan.$subElementDirEntry."/module_arrayTplRelation.inc.php")) {
										$skinTplDirArray[] = $skinTplDirEntry.":".$subElementDirEntry;
										++$skinTplCounter;
									}
								}
							}
						}
					}
				}
				$skinTplDir->close();
			}
		}
		
		if($skinTplCounter == 0) {
			$skinTplDirArray[] = "default";
		}
		
		return $skinTplDirArray;
	}
	
	/**
	 * Methode sucht aus einer Liste von Templates ($skinArray) das 
	 * ausgewählte heraus und gibt ein Array zurück, welches für jede 
	 * Eintragsstelle von $skinArray entweder "selected" oder "" enthält.
	 * 
	 * @access public 
	 * @param string $selectedSkin Name des gewählten Skins
	 * @param array $skinArray Template Liste
	 * @return array $selected Liste mit "selected" oder "" als mögliche Werte
	 */
	function getSelectedSkin($selectedSkin, $skinArray) {
		if(is_array($skinArray)) {
			foreach($skinArray as $k => $v) {
				if($selectedSkin == $v) {
					$selected[] = "selected";
				} else {
					$selected[] = "";
				}
			}
		} 
		return $selected;
	}
	
	/**
	 * Methode welches einen Sortierstring auf 3 Stellen begrenzt bzw. erweitert
	 * 
	 * @access public 
	 * @param string $sort Ausgangsstring
	 * @return string $sort bearbeiteter String
	 */
	function stringTo3 ($sort) {
		if($sort < 10) {
			$sort = "00".$sort;
		} elseif($sort < 100 && $sort > 9) {
			$sort = "0".$sort;
		} elseif($sort > 999) {
			$sort = 999;
		}
		return $sort;
	}
	
	/**
	 * Methode akzeptiert ein Array mit Rubriken ID's und 
	 * übergibt diese an die Methode delBranch();
	 * 
	 * @access public 
	 * @param array $delbox Array mit Rubriken ID's die gelöscht werden sollen
	 */
	function delBranches($delbox) {
		$delbox2 = $delbox;
		unset($delbox);
		
		foreach($delbox2 as $k => $v) {
			if(($v != "") && ($v != null)) {
				$delbox[$k] = $v;
			}
		}
		
		foreach($delbox as $k => $v) {
			$this->delBranch($v);
		}
	}
	
	/**
	 * Methode löscht die Rubrik mit der gegebenen ID und sucht alle Unterrubriken. 
	 * Dann ruft sich die Methode für jeden Unterrubrik Eintrag selber auf.
	 * 
	 * @access public 
	 * @param string $branchID ID der zu löschenden Rubrik
	 */
	function delBranch($branchID) {
		$dquery   = mysql_query("DELETE FROM ".TABLE."_columns WHERE fid = '$branchID'");
		$subQuery = mysql_query("SELECT * FROM ".TABLE."_columns WHERE mfolder = '$branchID'");
		while($subRow = mysql_fetch_object($subQuery)) {
			$this->delBranch($subRow->fid);
		}
	}
	
	/**
	 * Methode überprüft einen string, ob dieser Sonderzeichen enthält.
	 * 
	 * @access public 
	 * @param string $template Verzeichnisname eines Templates
	 * @return string $thisSkin Das zu überprüfende Template Verzeichnis, ansonsten default
	 */
	function getRightSkin($template) {
		$thisSkin = "default";
		if(isset($template)) {
			if(preg_match("/^([:a-zA-Z0-9_-]*)$/i", $template)) {
				$thisSkin = $template;
			} elseif($template == "") {
				$thisSkin = $template;
			}
		}
		return $thisSkin;
	}
	
	/**
	 * Methode überprüft alle groupID's und kombiniert diese zu einem Bitfeld
	 * 
	 * @access public 
	 * @param array $groups ID's der gewählten Gruppen
	 * @return int $newGroupCombination Liste der gewählten Gruppen als BitFeld
	 */
	function getGroupCombination($groups) {
		//d $newGroupCombination = 0;
		//print_r($groups);
		$newGroupCombination = "";
		$tmpArr=array();
		if(is_array($groups)) {	
			foreach($groups as $k => $v) {	
				//d if(ereg("(^[0-9]*$)", $v)) {
				//d	$newGroupCombination |= $v;
				$tmpArr[]=$v;
				//}
			}
		    $newGroupCombination = implode(",",$tmpArr);
        }
		return $newGroupCombination;
	}
	
	/**
	 * Methode liefert das StatusFeld einer hauptrubrik
	 * 
	 * @access private 
	 * @return string $status status Feld der Rubrik
	 */
	function getMainStatus() {
		$getist = 1;
		$catSortQ	= mysql_fetch_object(mysql_query("SELECT fid, mfolder, SUBSTRING(status,5,1) as stat, SUBSTRING(status,2,3) as sort FROM ".TABLE."_columns WHERE mfolder='' OR mfolder='0' OR mfolder='NULL' ORDER BY sort DESC LIMIT 1"));
		$lastSortNr = $catSortQ->sort + 1;
		$lastSortNr = $this->stringTo3($lastSortNr);
		return "1".$lastSortNr.$getist;
	}
	
	/**
	 * Methode liefert das StatusFeld einer Unterrubrik
	 * 
	 * @access private 
	 * @return string $status status Feld der Rubrik
	 */
	function getSubStatus($parentID) {
		$getParentS = mysql_fetch_array(mysql_query("SELECT fid, mfolder, SUBSTRING(status,5,1) as status FROM ".TABLE."_columns WHERE fid = '$parentID'"));
		$getist     = $getParentS["status"] + 1;
		$catSortQ	= mysql_fetch_object(mysql_query("SELECT fid, mfolder, SUBSTRING(status,5,1) as status, SUBSTRING(status,2,3) as sort FROM ".TABLE."_columns WHERE mfolder = '$parentID' ORDER BY sort DESC LIMIT 1"));
		$lastSortNr = $catSortQ->sort + 1;
		$lastSortNr = $this->stringTo3($lastSortNr);
		return "1".$lastSortNr.$getist;
	}
	
	/**
	 * Methode fügt einen Zweig in die Rubriken Tabelle ein
	 * 
	 * @access public
	 * @param array $info Informationen für eine neue Rubrik
	 * @param string $type Hauptrubrik oder Unterrubrik?  
	 * @return string $error aufgetretene Fehler
	 */
	function addBranch($info, $type = "main") {
		if(empty($info[folderName])) $error = 1;
		foreach($info as $k => $v) {
			${$k} = $v;
		}
		
		$fid = md5($folderName . date("Ymd H:i:s"));
		if(empty($restrict)) {
			$userAccess = "";
		}
		
		$newGroupCombination = $this->getGroupCombination($groups);
		$thisSkin = $this->getRightSkin($template);
		
		if($type == "main") {
			$thisStatus = $this->getMainStatus();	
			
			if(!$error) {
				$newFolderQuery = mysql_query("INSERT INTO ".TABLE."_columns (fname, fid, writestatus, describt, loadurl, status, usersallowed, groupsAllowed, skin) VALUES ('$folderName','$fid','$writestatus','$description','$loadURL', '$thisStatus', '$userAccess', '$newGroupCombination', '$thisSkin')");
			}
		}
		
		if($type == "sub") {
			if(empty($info[parentID])) {
				$error = 1;
			}
			
			$parentID = trim($info[parentID]);
			$thisStatus = $this->getSubStatus($parentID);
			
			if(!$error) {
				$newFolderQuery = mysql_query("INSERT INTO ".TABLE."_columns (fname, fid, mfolder, writestatus, describt, loadurl, status, usersallowed, groupsAllowed, skin) VALUES ('$folderName','$fid', '$parentID', '$writestatus','$description','$loadURL', '$thisStatus', '$userAccess', '$newGroupCombination', '$thisSkin')");
			}
		}
		return $error;
	}
	
	/**
	 * Methode modifiziert bestehende Rubriken und erneuert die Informationen
	 * 
	 * @access public
	 * @param array $info Informationen für eine neue Rubrik
	 * @return string $error aufgetretene Fehler
	 */
	function updateBranch($info) {
		if(empty($info[folderName])) {
			$error = 1;
		}
		if(empty($info[fid])) {
			$error = 1;
		}
		
		$newGroupCombination = $this->getGroupCombination($info[groups]);
		$thisSkin = $this->getRightSkin($info[template]);
		
		if(empty($info[restrict])) {
			$info[useraccess] = "";
		}
		
		if(!$error) {
			$nfqq = mysql_query("UPDATE ".TABLE."_columns SET fname = '$info[folderName]', writestatus = '$info[writestatus]', describt = '$info[description]', loadurl = '$info[loadURL]', usersallowed = '$info[userAccess]', groupsAllowed = '$newGroupCombination', skin = '$thisSkin' WHERE fid='$info[fid]'");
		}
		return $error;
	}
	
	/**
	 * Methode verschiebt Äste
	 * 
	 * @access public
	 * @param string $folderID der zu verschiebende Ast
	 * @param string $destID Ast, an dem der Ast angehängt werden soll
	 * @return string $error aufgetretene Fehler
	 */
	function moveBranch($folderID, $destID = null) {
		$error = 0;
		$folderRow = mysql_fetch_object(mysql_query("SELECT fid, mfolder, SUBSTRING(status,1,1) as status, SUBSTRING(status,5,1) as level, SUBSTRING(status,2,3) as sort FROM ".TABLE."_columns WHERE fid = '$folderID'"));
		$destRow   = mysql_fetch_object(mysql_query("SELECT fid, mfolder, SUBSTRING(status,1,1) as status, SUBSTRING(status,5,1) as level, SUBSTRING(status,2,3) as sort FROM ".TABLE."_columns WHERE fid = '$destID'"));
		
		if(($folderRow->fid != "") && ($destRow->fid != "")) {
			$difference = $destRow->level - intval($folderRow->level) + 1;
			$newLevel   = $destRow->level + 1;
			$newStatus  = $folderRow->status.$folderRow->sort.$newLevel;
			
			if(!$this->isSubBranch($destID, $folderID)) {
				$result = mysql_query("UPDATE ".TABLE."_columns SET status = '$newStatus', mfolder = '$destID' WHERE fid = '$folderID'");
				$this->pullBranch($folderID, $difference);
			} else {
				/* 
				* Ziel Zweig ist Tochter des zu verschiebenden Zweiges. 
				* Logisch unmöglich da diesen Zweig anzuhängen
				*/
				$error = 2;
			}
		} elseif(($folderRow->fid != "") && !is_object($destRow)) {
			$difference = 0 - $folderRow->level + 1;
			$newLevel   = $destRow->level + 1;
			$newStatus  = $folderRow->status.$folderRow->sort.$newLevel;
			
			if(!$this->isSubBranch($destID, $folderID)) {
				$result = mysql_query("UPDATE ".TABLE."_columns SET status = '$newStatus', mfolder = '' WHERE fid = '$folderID'");
				$this->pullBranch($folderID, $difference);
			} else {
				/* 
				* Ziel Zweig ist Tochter des zu verschiebenden Zweiges. 
				* Logisch unmöglich da diesen Zweig anzuhängen
				*/
				$error = 2;
			}
		} else {
			/* 
			* Einer der Zweige existiert nicht
			*/
			$error = 1;
		}
		return $error;
	}
	
	/**
	 * Methode prüft ob eine Rubrik das Kind einer anderen ist
	 * 
	 * @access public
	 * @param string $checkID ID der zu prüfenden Rubrik
	 * @param string $folderID Rubrik ID des aktuellen Kinddurchlaufs
	 * @return boolean $mainResult Ist Rubrik Kind? ja / nein
	 */
	function isSubBranch($checkID, $folderID) {
		$mainResult = 0;
		if($checkID != $folderID) {
			$checkQuery = mysql_query("SELECT fid, mfolder FROM ".TABLE."_columns WHERE mfolder = '$folderID'");
			while($checkRow = mysql_fetch_object($checkQuery)) {
				if($checkID == $checkRow->fid) {
					$mainResult = 1;
				}
				$result = $this->isSubBranch($checkID, $checkRow->fid);
				if($result == 1) {
					$mainResult = 1;
				}
			} // while
		} else {
			$mainResult = 1;
		}
		return $mainResult;
	}
	
	/**
	 * Methode zieht die Rubriken einer verschobenen hinterher 
	 * (Level Tiefe aller Kinder verändern)
	 * 
	 * @access public
	 * @param string $folderID ID der zu bewegenden Rubrik
	 * @param int $difference LevelUnterschied der korrigiert werden muss
	 */
	function pullBranch($folderID, $difference) {
		$pullQuery = mysql_query("SELECT fid, mfolder, SUBSTRING(status,1,1) as status, SUBSTRING(status,5,1) as level, SUBSTRING(status,2,3) as sort FROM ".TABLE."_columns WHERE mfolder = '$folderID'");
		while($pullRow = mysql_fetch_object($pullQuery)) {
			$newLevel  = $pullRow->level + $difference;
			$newStatus = $pullRow->status.$pullRow->sort.$newLevel;
			
			$changeQuery = mysql_query("UPDATE ".TABLE."_columns SET status = '$newStatus' WHERE fid = '".$pullRow->fid."'");
			$this->pullBranch($pullRow->fid, $difference);
		}
	}
	
	/**
	 * Methode bewegt einen Zweig entweder hoch oder runter
	 * Reihenfolge der Rubriken wird hiermit geändert
	 * 
	 * @access public
	 * @param string $fid ID der zu bewegenden Rubrik
	 * @param string $action Aufwärts oder abwärts?
	 */
	function updateSortation($fid, $action) {
		// Sortierung ändern
		if(!empty($fid)) {
			$thisColumn   = mysql_fetch_object(mysql_query("SELECT mfolder, fid FROM ".TABLE."_columns WHERE fid='$fid'"));
			$thisParentID = $thisColumn->mfolder;
			if($thisParentID == "") {
				unset($thisParentID);
			}
			
			if($action == "sortdown") {
				// wenn man nach untent sortiert, dann ist der Nachfolger, die bei 
				// aufsteigender Sortierung nach der $fid kommende Zeile
				$subColQ = mysql_query("SELECT fid, mfolder, SUBSTRING(status,1,1) as nosense, SUBSTRING(status,5) as status, SUBSTRING(status,2,3) as sort FROM ".TABLE."_columns WHERE mfolder = '$thisParentID' ORDER BY sort ASC");
			} else {
				// wenn man eins nach oben soritert, brauch man den Vorgänger, welcher 
				// der Nachfolger bei absteigender Sortierung ist
				$subColQ = mysql_query("SELECT fid, mfolder, SUBSTRING(status,1,1) as nosense, SUBSTRING(status,5) as status, SUBSTRING(status,2,3) as sort FROM ".TABLE."_columns WHERE mfolder = '$thisParentID' ORDER BY sort DESC");
			}
			
			// Sortierung nach oben
			if($action == "sortdown" || $action == "sortup") {
				//
				$changeWithNext = false;
				while($subCol = mysql_fetch_object($subColQ)) {
					if($subCol->fid == $fid) {
						// wenn subCol->fid == fid dann, ist das der zu sortierende Eintrag.
						// der Nachfolger ist demzufolge, der mit dem getauscht werden soll
						$changeWithNext = true;
						$toSortUp['sort']      = $subCol->sort;
						// herausrechnen der führenden Nullen
						$toSortUp['sort']      = eregi_replace("(^0{1,2})", "", $toSortUp['sort']);
						$toSortUp['id']        = $subCol->fid;
						$toSortUp['status']    = $subCol->status;
						$toSortUp['nosense']   = $subCol->nosense;
						continue;
					}
					if($changeWithNext == true) {
						// das muss wieder auf false gesetzt werden, da sonst der nächste Schleifen
						// durchlauf denkt, er wäre der Nachfolger ;)
						$changeWithNext = false;
						$toSortDown['sort']    = $subCol->sort;
						$toSortDown['sort']    = eregi_replace("(^0{1,2})", "", $toSortDown['sort']);
						$toSortDown['id']      = $subCol->fid;
						$toSortDown['status']  = $subCol->status;
						$toSortDown['nosense'] = $subCol->nosense;
					}					
				}
				
				// wenn changeWithNext == true, dann ist Region schon an erster Stelle
				// wenn false, dann gab es einen Nachfolger
				if($changeWithNext == false) {
					if($toSortUp['sort'] == $toSortDown['sort']) {
						++$toSortDown['sort'];
					} else {
						$tempSort           = $toSortUp['sort'];
						$toSortUp['sort']   = $toSortDown['sort'];
						$toSortDown['sort'] = $tempSort;
					}
					$toSortUp['sort'] = $this->stringTo3($toSortUp['sort']);
					$toSortDown['sort'] = $this->stringTo3($toSortDown['sort']);			
					$downID = $toSortDown['id'];
					// Zusammendsetzung von Status
					$newUpStatus = $toSortUp['nosense'].$toSortUp['sort'].$toSortUp['status'];
					$newDownStatus = $toSortDown['nosense'].$toSortDown['sort'].$toSortDown['status'];
					mysql_query("UPDATE ".TABLE."_columns SET status = '$newUpStatus' WHERE fid = '$fid'");
					mysql_query("UPDATE ".TABLE."_columns SET status = '$newDownStatus' WHERE fid = '$downID'");
				}		
			}
		}
	}
}
			
?>
Return current item: Content*Builder