Seite 1 von 1

Navigationspfad

Verfasst: Mi 25. Apr 2007, 18:57
von speedmaster
Hallo Forum,

ich habe leider trotz sorgfältiger Suche nichts passendes gefunden. Ich verwende das Modul Navigationspfad des Beispielmandanten aus 4.6.15.

Jetzt meine Frage:

Gibt es eine Möglichkeit nur die ersten 2 Kategorien zu verlinken, so das der Navigationspfad so ausgegeben wird?

Katergorie 1 > Katergorie 2 > Kategorie 3

Also ab der 3 Kategorie soll nicht mehr verlinkt werden.

Geht das?

Verfasst: Do 26. Apr 2007, 09:29
von silicone
Hab das Modul jetzt nicht zur Hand, aber generell sollte das ganz einfach über eine for-Schleife machbar sein.

Ungefähr so:

Code: Alles auswählen

for ($i=0; $i<2; $i++){
  machwas;
}
Gruß,
Thomas

Verfasst: Do 26. Apr 2007, 10:01
von speedmaster
Hallo und danke für die flotte Antwort.

Das Modul sieht so aus:

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", 1);

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;
?>
Wo muß ich da die Änderung vornehmen?

Verfasst: Do 26. Apr 2007, 13:56
von kashban
Wenn ich das richtig blicke, stehen die einzelnen Elemente in $matches. Statt des foreach ($matches as $value) könntest Du die Schleife von Thomas verwenden. Dann sollten nicht mehr als zwei Einträge im Navigationspfad erscheinen.

Z.B. so:

Code: Alles auswählen

for ($i=0; $i<2; $i++){
  $value = $matches[i];
  ... weiter wie gehabt.
}
 
Damit es bei keinem oder nur einem Eintrag in $matches nicht knallt, besser

Code: Alles auswählen

$numentries = count($matches);
if ($numentries > 2)
{
   $numentries = 2;
}
for ($i=0; $i<$numentries; $i++){
  $value = $matches[i];
  ... weiter wie gehabt.
}
 
Ich hoffe, das passt so, bin in php nicht so fit.
Grüße,
Jürgen

Verfasst: Do 26. Apr 2007, 15:01
von speedmaster
Hallo, jetzt peile ich gar nicht mehr durch. Was muss ich den nun gegen was ersetzen? Sorry aber ich habe erst vor kurzem damit angefangen mich mit php zu beschäftigen.

Verfasst: Do 26. Apr 2007, 17:30
von kashban
Also, meiner Ansicht nach musst Du folgende Dinge ersetzen:

Code: Alles auswählen

foreach ($matches as $value) {
      $length += strlen($value) - 2;
}
durch

Code: Alles auswählen

$numentries = count($matches);
if ($numentries > 2)
{
   $numentries = 2;
}
for ($i=0; $i<$numentries; $i++){
      $value = $matches[i];
      $length += strlen($value) - 2;
} 
und

Code: Alles auswählen


   #Shorten items
   if ($length > $max_length) {
      foreach ($matches as $value) { 
durch

Code: Alles auswählen

   #Shorten items
   if ($length > $max_length) {
      for ($i=0; $i<$numentries; $i++){
          $value = $matches[i];

wobei die 2. Schleife wohl nur noch sehr selten ausgeführt wird. Sie sorgt nämlich dafür, dass die einzelnen Items eingekürzt werden, sollte der Gesamtpfad mehr als 65 Zeichen haben. Bei nur zwei Items im Pfad ist das wohl kaum mehr der Fall.

Probier's mal aus, würde mich interessieren, ob es funktioniert.

Viele Grüße,
Jürgen

Verfasst: Do 26. Apr 2007, 18:30
von speedmaster
Hallo,
nee, hat sich nix verändert. Es werden weiterhin alle Ebenen verlinkt. :cry:

Verfasst: Do 26. Apr 2007, 18:58
von kashban
Hm, dann kann man nur noch an der Query basteln:

Code: Alles auswählen

$pattern = "'>.*?<'";
   
   preg_match_all($pattern, $retval, $matches);
   $matches = $matches[0]; 
Da bin ich allerdings überfragt und die Zeit, die zu analysieren habe ich im Moment nicht. Kann jemand anders aushelfen?

Grüße,
Jürgen

Verfasst: Sa 28. Apr 2007, 08:20
von speedmaster
Hat vieleicht sonst noch jemand ne Idee. :?: :?