Navigationspfad

Gesperrt
speedmaster
Beiträge: 59
Registriert: Mi 18. Apr 2007, 18:43
Kontaktdaten:

Navigationspfad

Beitrag 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?
silicone
Beiträge: 299
Registriert: Di 15. Mär 2005, 10:33
Kontaktdaten:

Beitrag 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
speedmaster
Beiträge: 59
Registriert: Mi 18. Apr 2007, 18:43
Kontaktdaten:

Beitrag 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?
kashban
Beiträge: 44
Registriert: Fr 7. Mai 2004, 10:29
Kontaktdaten:

Beitrag 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
speedmaster
Beiträge: 59
Registriert: Mi 18. Apr 2007, 18:43
Kontaktdaten:

Beitrag 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.
kashban
Beiträge: 44
Registriert: Fr 7. Mai 2004, 10:29
Kontaktdaten:

Beitrag 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
speedmaster
Beiträge: 59
Registriert: Mi 18. Apr 2007, 18:43
Kontaktdaten:

Beitrag von speedmaster »

Hallo,
nee, hat sich nix verändert. Es werden weiterhin alle Ebenen verlinkt. :cry:
kashban
Beiträge: 44
Registriert: Fr 7. Mai 2004, 10:29
Kontaktdaten:

Beitrag 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
speedmaster
Beiträge: 59
Registriert: Mi 18. Apr 2007, 18:43
Kontaktdaten:

Beitrag von speedmaster »

Hat vieleicht sonst noch jemand ne Idee. :?: :?
Gesperrt