Seite 1 von 1

oberste Ebene eines Kategoriebaumes auslesen

Verfasst: So 13. Nov 2005, 15:41
von mvf
hallo community

die suche hier im board hat ergeben, dass das auslesen der obersten ebene eines kategoriebaumes für die navigation anscheinend nicht geht. ich möchte jedoch die oberste ebene als überschrift der hauptnavigation nutzen.

beispiel: HIER

wenn man auf Studio, InfoCenter oder News in der headernavi klickt, dann soll in der linken hauptnavi-box im boxheader auch studio, infocenter oder news stehen.

ich habe auch schon versucht das modul 'Navigationspfad' zu missbrauchen. dort habe ich

Code: Alles auswählen

#Get path to root
$dummy = conCreateLocationString($idcat,' '.$separator.' ', $retval, true, "navipath", 1);
auf

Code: Alles auswählen

#Get path to root
$dummy = conCreateLocationString($idcat,' '.$separator.' ', $retval, true, "navipath", 0);
gesetzt um in den breadcrumbs die erste ebene mit anzuzeigen. nun wollte ich das modul kopieren und darauf beschränken nur die oberste ebene anzuzeigen, sprich die foreach schleife am ende auf einen durchgang zu beschränken, ohne erfolg :( [und mit sicherheit auch nur ein miserabler workaround]

bitte helft mir weiter, vielen lieben dank

Verfasst: So 13. Nov 2005, 15:57
von mvf
missverständins,

für die seiten in den kategoriebäumen

Studio
InfoCenter
News

sieht der navigationspfad wie folgt aus und funktioniert:

Code: Alles auswählen

<?php
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname  :      Navigationpath
* Author(s)   :     Andreas Lindner
* Copyright   :     Contenido - four for business, Andreas Lindner
* Created     :     05-08-2005
************************************************/

#Settings
$separator = '::';
$max_length = 65;

#Get path to root
$dummy = conCreateLocationString($idcat,' '.$separator.' ', $retval, true, "navipath", 0);

if ($retval=='') {
	$retval='&nbsp;';	
} else {
	$pattern = "'>.*?<'";
	
	preg_match_all($pattern, $retval, $matches);
	$matches = $matches[0];
	
	#Get effective text length
	$length = 0;
	foreach ($matches as $value) {
		$length += strlen($value) - 2;
	}
	
	#Get shorten factor
	if ($length > $max_length * 4) {
		$shorten = 5;
	}
	elseif ($length > $max_length * 3) {
		$shorten = 4;
	}
	elseif ($length > $max_length * 2) {
		$shorten = 3;
	}
	elseif ($length > $max_length) {
		$shorten = 2;
	} else {
		$shorten = 1;
	}
	
	#Shorten items
	if ($length > $max_length) {
		foreach ($matches as $value) {
			if (strpos($value, $separator) === FALSE) {
				$text = substr($value, 1, strlen($value) - 2);
				$len = strlen($text);
				if (strpos($text, ' ') === FALSE) {
					$text_new = $text;
				} else {
					$text_new = capiStrTrimAfterWord($text, intval($len / $shorten));
				}
	
				if (strlen($text) != strlen($text_new)) {
					$text_new .= '...';
				}
	
				$text_new = '>'.$text_new.'<';
				$retval = str_replace('>'.$text.'<', $text_new, $retval);
			}
		}
	}
	$retval = str_replace('"/index.html"', '"Home/index.html"', $retval);
}
    
echo $retval;
?>
das liefert immer den ganzen string, also z.b.
Studio :: Portfolio :: Anwendungen :: Classics

Infocenter :: Impressum

News :: 2005 November
das modul möchte ich nun so modifizieren, dass es immer nur die erste eben auswirft, also
Studio

Infocenter

News
egal wie tief ich mich im baum befinde, dann könnte ich das in einem container als headline für die kategoriebox hernehmen.

aber wie gesagt, dass ist nur eine idee um die headline der navigation zu füllen.

Verfasst: So 13. Nov 2005, 16:08
von emergence
du kriegst ja einen kompletten string retour geliefert der immer :: enthält

man könnte es zb über die php funktion explode machen...

$retval = explode($retval, "::");
$retval = trim($retval[0]);

nicht getestet, sollte aber gehen...

Verfasst: So 13. Nov 2005, 16:10
von mvf
probiere ich gleich und gebe rückmeldung

Verfasst: So 13. Nov 2005, 16:19
von mvf

Code: Alles auswählen

<?php
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname  :      Navigationpath
* Author(s)   :     Andreas Lindner
* Copyright   :     Contenido - four for business, Andreas Lindner
* Created     :     05-08-2005
************************************************/

#Settings
$separator = '::';
$max_length = 65;

#Get path to root
$dummy = conCreateLocationString($idcat,' '.$separator.' ', $retval2, true, "navipath", 0);

if ($retval2=='') {
	$retval2='&nbsp;';	
} else {
	$pattern = "'>.*?<'";
	
	preg_match_all($pattern, $retval2, $matches);
	$matches = $matches[0];
	
	#Get effective text length
	$length = 0;
	foreach ($matches as $value) {
		$length += strlen($value) - 2;
	}
	
	#Get shorten factor
	if ($length > $max_length * 4) {
		$shorten = 5;
	}
	elseif ($length > $max_length * 3) {
		$shorten = 4;
	}
	elseif ($length > $max_length * 2) {
		$shorten = 3;
	}
	elseif ($length > $max_length) {
		$shorten = 2;
	} else {
		$shorten = 1;
	}
	
	#Shorten items
	if ($length > $max_length) {
		foreach ($matches as $value) {
			if (strpos($value, $separator) === FALSE) {
				$text = substr($value, 1, strlen($value) - 2);
				$len = strlen($text);
				if (strpos($text, ' ') === FALSE) {
					$text_new = $text;
				} else {
					$text_new = capiStrTrimAfterWord($text, intval($len / $shorten));
				}
	
				if (strlen($text) != strlen($text_new)) {
					$text_new .= '...';
				}
	
				$text_new = '>'.$text_new.'<';
				$retval2 = str_replace('>'.$text.'<', $text_new, $retval2);
			}
		}
	}
	$retval2 = str_replace('"/index.html"', '"Home/index.html"', $retval2);
}

$retval2 = explode($retval2, "::");
$retval2 = trim($retval2[0]);
    
echo $retval2;
?>
liefert nun als ergebnis lediglich :: siehe HIER
implmentiert in studio und allen subkats zum testen

Verfasst: So 13. Nov 2005, 16:27
von mvf
jetzt habe ich es hurrah !!! :)

danke dir vielmal, mit

Code: Alles auswählen

$retval2 = explode("::", $retval2);
$retval2 = trim($retval2[0]);
   
echo $retval2;
?>
geht es!!!


merci danke grazie thx ;)