Location: PHPKode > projects > Content*Builder > modules/menu2/menu_nestedSet.php
<?php
	$tpl->assign("MODULE_IMG_DIR", $location."templates/images/");
	
	/* alles ausgeben 
	if(empty($COLUMN_restriction)) {
		$nav->getMenu();
	} else {
		$base = $COLUMN_select->fid;
		$restrictStatus = $COLUMN_select->status;
		$nav->setStartLevel($COLUMN_select->status);
		$children = $nav->folder[$restrictStatus][$base]['children'];
		$nav->getChildren($children, ($restrictStatus + 1), $base);
	}
	*/
	
	/**
	 * markNodes()
	 * Funktion markiert jeden Zweig mit einem zusätzlichen Attribt visibility = 1, 
	 * wenn sie zu sehen ist. Ausgehend von der $openfolder wird rekursiv 
	 * jedes Level durchlaufen und alle Eltern und deren Geschwister zur
	 * Anzeige gebracht
	 * 
	 * @param array $nodeArray Array mit allen zur Anzeige in Frage kommenden Nodes
	 * @param array $childrenStruct Array welches zu jeder Parent ID alle Kinder liefert
	 * @param int $actualID aktuelle ID
	 * @return array $nodeArray Am Ende wird das markierte Array zurück geliefert
	 **/
	function markNodes(&$nodeArray, &$childrenStruct, $actualID) {
		// Alle Kinder der aktuellen ID werden markiert
		if(is_array($childrenStruct[$actualID])) {
			foreach($childrenStruct[$actualID] as $k => $v) {
				$nodeArray[$v]['visibility'] = 1;
			}
		}
		
		// Abbruchbedingung
		if($nodeArray[$actualID]['level'] > 0) {
			// Reskursives Parsen des Baumes
			markNodes($nodeArray, $childrenStruct, $nodeArray[$actualID]['parent']);
		}
		
		// fertig markiertes Array ausliefern
		return $nodeArray;
	}
	
	/*
	* Ermittlung der Default Sprache ... wird leider noch als article Option gesetzt
	*/
	$dlQuery = mysql_fetch_array(mysql_query("SELECT * FROM ".TABLE."_options WHERE name = 'default_lang' AND module = 'art'"));
	$defaultLanguage = $dlQuery[value];
	
	/*
	* Wenn im Cookie ne andere Sprache steht, diese nehmen
	*/
	if(!empty($_COOKIE['main_language'])) {
		if(ereg("^[0-9]*$", $_COOKIE['main_language'])) {
			$defaultLanguage = $_COOKIE['main_language'];
		}
	}
	
	/* 
	* Initialisierung der NeSet Array's für das 
	* Folder Nested Set Objekt 
	*/
	$folderParams = array (
		'table'  => TABLE.'_columns',
		'id'     => 'fid',
		'parent' => 'mfolder',
		'root'   => 'rootID',
		'l'      => 'leftID',
		'r'      => 'rightID',
		'level'  => 'level',
		'norder' => 'order_num'
	);
	
	$folderAdditional = array (
		'name'          => 'fname',
		'status'        => 'status',
		'writestatus'   => 'writestatus',
		'description'   => 'describt',
		'loadurl'       => 'loadurl',
		'usersallowed'  => 'usersallowed',
		'groupsAllowed' => 'groupsAllowed',
		'skin'          => 'skin'
	);
	
	$nestedSet = CB_NestedSet::factory($folderParams, $folderAdditional);
	
	// Zusatz SQL für die Mehrsprachigkeit der Rubriken 
	$additionalSQL = array (
		"field" => ", lang.text, lang.languageID",
		"join"  => "LEFT JOIN ".TABLE."_language AS lang ON lang.typeID = n.fid AND lang.type = 'column' AND lang.languageID = '$defaultLanguage'"
	);
	
	// wird benötigt, um an die RootID zu kommen (kann eingespart werden)
	// [*OPTIMIERUNG*]
	$actualOpenfolder = $nestedSet->getNode($openfolder, true);
	// getAllNodes kann rootNodes nicht ordnen, also separates auslesen der Roots
	$rootFolder       = $nestedSet->getRootNodes(true, $additionalSQL);
	// ganzen Zweig in der $openfolder steckt abfragen
	$openfolderBranch = $nestedSet->getBranch($actualOpenfolder[root], true, $additionalSQL);
	
	// let's go
	if($openfolderBranch != false) {
		// Kinder Array aufbauen, in dem zu jeder ElternID alle Kinder gelistet sind
		foreach($openfolderBranch as $v) {
			$childrenStruct[$v['parent']][] = $v[id];
		}
		
		// Aufbau des korrekt sortierten Menus
		$folderMenu = array();
		foreach($rootFolder as $k => $v) {
			// alle Wurzeln abgehen, bis zur der Wurzel der $openfolder
			$_merge = 0;
			if($actualOpenfolder != false) {
				if($k == $actualOpenfolder[root]) {
					// wenn diese Wurzel mit der der openfolder übereinstimmt
					// dann zusammenführen der openfolderBranch mit den Wurzeln
					foreach($openfolderBranch as $key => $value) {
						$folderMenu[$key] = $value;
					}
					$_merge = 1;
				}
			}
			// ansonsten Wurzel einfügen
			if ($_merge == 0) {
			    $v[visibility] = 1;
				$folderMenu[$k] = $v;
			}
		}
		
		// getBranch liefert alle Nachkommen der Wurzel der openfolder. Es müssen
		// noch die markiert werden, die zu sehen sind
		$folderMenu = markNodes($folderMenu, $childrenStruct, $openfolder);
		
		// Aubereitung des korrekt sortierten Menus für die Darstellung
		foreach($folderMenu as $v) {
			// wenn Sichtbarkeitstag angegeben wurde, gehts weiter
			if($v[visibility] == 1) {
				// Ist dieser Zweig ein aktuell gewählter? Konkret: gehört dieser Zweig 
				// zu den direkten Vorfahren der openfolder bzw. ist die openfolder?
				$_fStatus = 0;
		        if($v[root] == $GLOBALS[openfolderData][root] && $v[l] <= $GLOBALS[openfolderData][l] && $v[r] >= $GLOBALS[openfolderData][r]) {
				   $_fStatus = 1;
				}
				
				// es gibt verschiedene Möglichkeiten das loadurl Feld zu interpretieren:
				if($v['loadurl'] != "") {
					if(!ereg("^http://", $v['loadurl'])) {
						// fängt es nicht mit http an, ist es ein Modulaufruf
						$fURL[] = $v[id]."&load=".$v['loadurl'];
						$fFidSet[] = "1";
					} else {
						// ansonsten isses ein externer Link
						$fURL[] = $v['loadurl'];
						$fFidSet[] = "0";
					}
				} else {
					// steht nichts drin wird nur die Rubrik geladen (und das Standardmodul)
					$fURL[] = $v[id];
					$fFidSet[] = "1";
				}
				
				// Markierung ob es openfolder ist oder nicht, für die Artikelausgabe
				if($v[id] == $openfolder) {
					$fArtPrint[] = "1";
					$fOpenfolderName = $v[name];
					$fMatchSpace     = ($v[level] * 20) + 4;
				} else {
					$fArtPrint[]= "0";
				}
					
				// wenn ein anderssprachiger Rubrikname gefunden wurde, dann den nehmen
				$_fName = $v[name];
				if($v[text] != "") {
					$_fName = $v[text];
				}
					
				// Aufbau der Array's
				$fStatus[]  = $_fStatus;
		        $fID[]     = $v[id];
				$fName[]   = $_fName;
				$fLevel[]  = $v[level];
				$fSpace[]  = ($v[level] - 1) * 20;
			}
		}
	}
	
	// senden ans Template
	$tpl->assign("navFolderData", 
		array ( 
			"DEEPNESS"	  => $fSpace,
			"NAV_FOLDER"  => $fName,
			"NAV_URL"	  => $fURL,
			"NAV_FID"     => $fID,
			"NAV_FID_SET" => $fFidSet,
			"FOLDER_ART"  => $fArtPrint,
			"LEVEL"		  => $fLevel,
			"STATUS"      => $fStatus
		)
	);
	
	// Article Liste laden
	if($archive == 1) { 
		$artAmount = 10000; 
	} else { 
		if(!$cbOption->getSingleOption("artAmount")) {
			$artAmount = 10;
		} else {
			$artAmount = $cbOption->getSingleOption("artAmount");
		}
	}
	
	if(!is_object($artOption)) {
		//Ableitung des Article Option Objektes
		$artOption = new CBOption();
		$artOption->setModule("art");
		$artOption->getOptionList();
	}
	
	if($load == "article2") {
		/* Implementation of stage rules in module article2 */
		$today = date( "Ymd", time() );
		if($cbOption->getSingleOption("timepost")) {
			if(!$preview) {
				$stageStatement = "AND general.stage = '3' AND general.publishfrom <= '".$today."' AND (general.publishto >= '".$today."' OR general.publishto = '00000000')";
			} else {
				$stageStatement = "";
			}
		} else {
			$stageStatement = "AND general.stage = '3'";
		}
		
		/*
		* Sortier Methode
		*/
		$sortMethod = $artOption->getSingleOption("sortMethod");
		switch($sortMethod){
			case ART_SORT_NUMERIC: 
				 $sortMethodString = "ORDER BY general.order_num ASC";
				 break;
			default:
				 $sortMethodString = "ORDER BY general.datetime DESC";
		} // switch
		
		$dlQuery = mysql_fetch_array(mysql_query("SELECT * FROM ".TABLE."_options WHERE name = 'default_lang' AND module = 'art'"));
		$defaultLanguage = $dlQuery[value];
		
		if(!empty($_COOKIE['main_language'])) {
			if(ereg("^[0-9]*$", $_COOKIE['main_language'])) {
				$defaultLanguage = $_COOKIE['main_language'];
			}
		}
		
		$contentWhere = "WHERE content.ide = general.ide AND ((relFolder.folderID = '$openfolder' AND relFolder.articleID = general.ide) OR general.folderID = '$openfolder') $stageStatement AND content.language = '$defaultLanguage'";
		
		$query = "SELECT content.ide, content.language, content.title, general.datetime FROM ".TABLE."_art_content AS content, ".TABLE."_art_general AS general LEFT JOIN ".TABLE."_art_folder AS relFolder ON general.ide = relFolder.articleID $contentWhere GROUP BY general.ide $sortMethodString LIMIT 0,$artAmount";
		$result = mysql_query($query);
		
		$noArticles = true;
		while($artData = mysql_fetch_object($result)) {
			$title = substr($artData->title, 0, 20);
			if(strlen($artData->title > 20)) {
				$title .= "...";
			}
			$artTitle[]		= $title;
			$artIde[]		= $artData->ide;
			$artFolderId[]	= $openfolder;
			$noArticles = false;
		}
		
		$artType        = "article2";		
	} else {
		$query = mysql_query("SELECT title, ide, folder FROM ".TABLE."_article WHERE folder = '$openfolder' AND stage = '3' ORDER BY datum DESC LIMIT 0,$artAmount");
		$artTitle = array();
		$artIde = array();
		$artFolderId = array();
		
		$noArticles = true;
		while($articles = mysql_fetch_array($query)) {
			$title = substr($articles[title], 0, 20);
			if(strlen($articles[title]) > 20) {
				$title .= "...";
			}
			$artTitle[]		= $title;
			$artIde[]		= $articles[ide];
			$artFolderId[]	= $articles[folder];
			$noArticles = false;
		}
		unset($articles);
		$artType        = "article";
			
	}
		
	if(!$noArticles) {
		$tpl->assign("navigationArticleSet", "1");
		$navArticleData = array(
			"NAV_FOLDER"    => $artFolderId,
			"ARTICLE_TITLE" => $artTitle,
			"IDE"			=> $artIde
		);
		$tpl->assign("navArticleData", $navArticleData);
		$tpl->assign("navArticleType", $artType);
		$tpl->assign("navArticleDeepness", $fMatchSpace);
	}
	
	// Template ausgeben
	$tpl->display("menu.template");
?>
Return current item: Content*Builder