<?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'");
}
}
}
}
}
?>