Seite 1 von 2

Breadcrump mit Artikel-Link anzeigen

Verfasst: So 5. Nov 2006, 15:06
von abenda
Hallo zusammen.

Um auch die Artikel mit in die Breadcrump-Navigation aufzunehmen habe ich die functions.con.php wir folgt erweitert:

Code: Alles auswählen

function conCreateLocationString($idcat, $seperator, &$cat_str, $makeLink = false, $linkClass = "", $firstTreeElementToUse = 0, $uselang = 0, $final = true, $usecache = false, $idartlang = "")
Den Aufruf der Funktion conCreateLocationString habe ich um den Parameter $idartlang erweitert, damit die Funktion den aktuellen Artikel kennt.


Nun lasse ich die Funktion wie gewohnt ihr Werk verrichten. Wenn der Pfad für die Kategorien vollständig zusammengebaut ist füge ich den Artikel-Aufruf hinzu:

Code: Alles auswählen

    if ($final == true)
    {

	    $sql = "SELECT
    				startidartlang AS startidartlang
            	FROM
	                ".$cfg["tab"]["cat_lang"]."
            	WHERE
	            	idcat		= '".$idcat."'";
    
	    $db->query($sql);
	    $db->next_record();
	    
		if ($db->f("startidartlang") != $idartlang)
		{
			$sql = "SELECT
    					idart AS idart,
                		title AS title
            		FROM
						".$cfg["tab"]["art_lang"]."
            		WHERE
		            	idartlang	= '".$idartlang."'";
    
		    $db->query($sql);
		    $db->next_record();

			$title = $db->f("title");
			$idart = $db->f("idart");
			if ($makeLink == true)
			{
				$linkUrl = $sess->url("front_content.php?idart=$idart&idcat=$idcat");
				$title = '<a href="'.$linkUrl.'" class="'.$linkClass.'">'.$title.'</a>';	
			}
		
			$tmp_cat_str = $cat_str . $seperator . $title;
			$cat_str = $tmp_cat_str;
		}
    
    }
Diesen Block habe ich vor folgendem aus dem Original eingefügt:

Code: Alles auswählen

if ($final == true && $usecache == true)
...
Jetzt muss man nur noch beim Aufruf aus dem Modul den Parameter $idartlang des aktuellen Artikels hinzufügen, schon kann es losgehen.

Viel Spaß damit.

Karsten

Verfasst: Mo 6. Nov 2006, 13:05
von emergence
läßt sich eventuell ja ergänzen...
ich verschieb das mal...

Re: Breadcrump mit Artikel-Link anzeigen

Verfasst: Sa 27. Jan 2007, 10:58
von Christiane
Hallo Karsten, vielleicht hast du ja genau das gebaut, was ich suche. Daher noch mal eine kurze Rückfrage:
abenda hat geschrieben:Jetzt muss man nur noch beim Aufruf aus dem Modul den Parameter $idartlang des aktuellen Artikels hinzufügen, schon kann es losgehen.
Wo bzw. wie genau mach ich das denn in dem Navigationspfad-Modul?

Verfasst: Mo 29. Jan 2007, 14:17
von abenda
Hallo Christiane,

der Beginn des Moduls "Navigationspfad" sieht bei mir so aus:

Code: Alles auswählen

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

#Get path to root
$dummy = conCreateLocationString($idcat, ' '.$separator.' ', $retval, false, "navipath", 1, 0, true, false, $idartlang);
Das Ganze nutze ich z.B. für die Übergabe des Seitennamens incl. Pfad an meine etracker-Statistik. Dazu steht dann am Ende des Moduls noch folgender Teil:

Code: Alles auswählen

if ($contenido) {
	echo "etracker-Pfad: ".$retval;
}
else {
	echo getetrackerCode ( "Statistik-ID", false, false, $retval );
}
Damit gebe ich beim Editieren nur den Pfad aus, um ihn prüfen zu können; in der Live-Umgebung wird der Pfad in den etracker-Code eingebunden. Das erledigt bei mir die Funktion "getetrackerCode".

Das ist schon alles, bei mir funktioniert es dann.

Beste Grüße,

Karsten

Verfasst: Mo 29. Jan 2007, 14:38
von HerrB
Sie meinte vermutlich mehr die Angabe, woher idartlang kommt...

Gruß
HerrB

Verfasst: Mo 29. Jan 2007, 14:44
von abenda
Contenido kennt an der Stelle die idartlang des aufgerufenen Artikels, so dass man die Variable direkt in den Aufruf mit aufnehmen kann.

Bei mir gibt es mit der Implementierung so auf allen meinen Seiten korrekte Einträge in der Statistik, scheint also alles okay zu sein?!

Verfasst: Mo 29. Jan 2007, 14:58
von Christiane
abenda hat geschrieben:Das ist schon alles, bei mir funktioniert es dann.
Bei mir leider nicht. Da steht jetzt "Sie sind hier: id="nav-path-last" Kategorie 1 > Kategorie 2 > Kategorie 3". Und die 2 ersten Kategorien sind leider keine Links mehr. Irgendwas hab ich bei dem Modul verrissen, ich weiß nur leider nicht, was.

Verfasst: Mo 29. Jan 2007, 15:13
von abenda
Poste doch mal Deinen Code.

Verfasst: Mo 29. Jan 2007, 15:19
von Christiane
abenda hat geschrieben:Poste doch mal Deinen Code.
Das Navigationspfad-Modul:

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, false, "navipath", 1, 0, true, false, $idartlang); 

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);
    $tmp = explode('<a ', $retval);
    $tmp[count($tmp)-1] = 'id="nav-path-last" '.$tmp[count($tmp)-1];
    $retval = implode('<a ', $tmp);
}
echo $retval;
?>
Und hier noch der functions.con.php-Ausschnitt:

Code: Alles auswählen

function conCreateLocationString($idcat, $seperator, &$cat_str, $makeLink = false, $linkClass = "", $firstTreeElementToUse = 0, $uselang = 0, $final = true, $usecache = false, $idartlang = "")
{
    global $cfg, $client, $cfgClient, $lang, $sess, $_locationStringCache;

    if ($idcat == 0)
    {
        $cat_str = "Lost and Found";
        return;
    }

    if ($uselang == 0)
    {
      $uselang = $lang;
    }

  if ($final == true && $usecache == true)
  {
    if (!is_array($_locationStringCache))
    {
        if (file_exists($cfgClient[$client]["path"]["frontend"]."cache/locationstring-cache-$uselang.txt"))
        {
          $_locationStringCache = unserialize(file_get_contents($cfgClient[$client]["path"]["frontend"]."cache/locationstring-cache-$uselang.txt"));
        } else {
          $_locationStringCache = array();
        }
    }

    if (array_key_exists($idcat, $_locationStringCache))
    {
        if ($_locationStringCache[$idcat]["expires"] > time())
        {
            $cat_str = $_locationStringCache[$idcat]["name"];
            return;
        }
    }
  }

    $db = new DB_Contenido;

    $sql = "SELECT
                a.name AS name,
                a.idcat AS idcat,
                b.parentid AS parentid,
        c.level as level
            FROM
                ".$cfg["tab"]["cat_lang"]." AS a,
                ".$cfg["tab"]["cat"]." AS b,
        ".$cfg["tab"]["cat_tree"]." AS c
            WHERE
                a.idlang    = '".$uselang."' AND
                b.idclient  = '".$client."' AND
                b.idcat     = '".$idcat."' AND
                a.idcat     = b.idcat AND
        c.idcat = b.idcat";

    $db->query($sql);
    $db->next_record();

  if ($db->f("level") >= $firstTreeElementToUse)
  {

    $name       = $db->f("name");
    $parentid   = $db->f("parentid");

    //create link
    if ($makeLink == true)
    {
      $linkUrl = $sess->url("front_content.php?idcat=$idcat");
      $name = '<a href="'.$linkUrl.'" class="'.$linkClass.'">'.$name.'</a>';
    }

    $tmp_cat_str = $name . $seperator . $cat_str;
    $cat_str = $tmp_cat_str;

  }

    if ( $parentid != 0 ) {
        conCreateLocationString($parentid, $seperator, $cat_str, $makeLink, $linkClass, $firstTreeElementToUse ,$uselang, false, $idartlang);

    } else {
        $sep_length = strlen($seperator);
        $str_length = strlen($cat_str);
        $tmp_length = $str_length - $sep_length;
        $cat_str = substr($cat_str, 0, $tmp_length);
    }

    if ($final == true)
    {
       $sql = "SELECT
                startidartlang AS startidartlang
               FROM
                   ".$cfg["tab"]["cat_lang"]."
               WHERE
                  idcat      = '".$idcat."'";

       $db->query($sql);
       $db->next_record();

      if ($db->f("startidartlang") != $idartlang)
      {
         $sql = "SELECT
                   idart AS idart,
                      title AS title
                  FROM
                  ".$cfg["tab"]["art_lang"]."
                  WHERE
                     idartlang   = '".$idartlang."'";

          $db->query($sql);
          $db->next_record();
         $title = $db->f("title");
         $idart = $db->f("idart");
         if ($makeLink == true)
         {
            $linkUrl = $sess->url("front_content.php?idart=$idart&idcat=$idcat");
            $title = '<a href="'.$linkUrl.'" class="'.$linkClass.'">'.$title.'</a>';
         }

         $tmp_cat_str = $cat_str . $seperator . $title;
         $cat_str = $tmp_cat_str;
      }

    }

    if ($final == true && $usecache == true)
    {
       $_locationStringCache[$idcat]["name"] = $cat_str;
       $_locationStringCache[$idcat]["expires"] = time() + 3600;

       if (is_writable($cfgClient[$client]["path"]["frontend"]."cache/"))
       {
         file_put_contents($cfgClient[$client]["path"]["frontend"]."cache/locationstring-cache-$uselang.txt", serialize($_locationStringCache));
       }
    }
}

Verfasst: Mo 29. Jan 2007, 18:17
von abenda
Christiane hat geschrieben:

Code: Alles auswählen

   $retval = str_replace('"/index.html"', '"Home/index.html"', $retval);
    $tmp = explode('<a ', $retval);
    $tmp[count($tmp)-1] = 'id="nav-path-last" '.$tmp[count($tmp)-1];
    $retval = implode('<a ', $tmp);
Wo kommen denn die drei letzten Zeilen hier her? Die gibt es bei mir nicht! Ich habe nur die erste dieser vier Zeilen mit drin.


Dass das mit den Links nicht klappt, mag daran liegen, dass Du oben beim Aufruf der Funktion conCreateLocationString als vierten Parameter ein "false" übergibst. Damit schaltest Du die Verlinkung aus. Bei mir ist die aus, weil ich keine Links haben will sondern nur die Benennung des Pfades. Wenn Du das hier aktivierst, hast Du vermutlich die Links, die Du haben willst?

Gruß,

Karsten

Verfasst: Mo 29. Jan 2007, 19:00
von Christiane
abenda hat geschrieben:Wo kommen denn die drei letzten Zeilen hier her? Die gibt es bei mir nicht! Ich habe nur die erste dieser vier Zeilen mit drin.
Hallo Karsten, ja du hast recht. Diese Zeilen sind ein Überbleibsel aus einer anderen Anpassungsvariante, die leider auch nicht so recht zum gewünschten Ergebnis geführt hatte.

Wenn ich die wieder rausnehme, sind's alles Links.

Mein Anliegen ist jetzt jedoch noch, dass der Link für die jeweils aktive Seite nicht ausgegeben wird - sondern statt dessen reiner Text. Naja, irgendwie bekomme ich diese Funktionalität nicht hin.

Verfasst: Di 30. Jan 2007, 18:37
von abenda
Ja, da ist mir ein Fehler unterlaufen! So geht es bei mir:

Code: Alles auswählen

		if ($makeLink == true)
			{
				$linkUrl = $sess->url("front_content.php?idart=$idart");
				$title = '<a href="'.$linkUrl.'" class="'.$linkClass.'">'.$title.'</a>';	
			}
Beim Erstellen des Links darf nur der Parameter idart=$idart aufgenommen werden, vorher hatte ich auch "idcat" mit drin.

Die Funktion lautet bei mir dann in Gänze:

Code: Alles auswählen

function conCreateLocationString($idcat, $seperator, &$cat_str, $makeLink = false, $linkClass = "", $firstTreeElementToUse = 0, $uselang = 0, $final = true, $usecache = false, $idartlang = "")
{
    global $cfg, $client, $cfgClient, $lang, $sess, $_locationStringCache;
	
    if ($idcat == 0)
    {
        $cat_str = "Lost and Found";
        return;
    }
    
    if ($uselang == 0)
    {
    	$uselang = $lang;
    }

	if ($final == true && $usecache == true)
	{
		if (!is_array($_locationStringCache))
		{
		    if (file_exists($cfgClient[$client]["path"]["frontend"]."cache/locationstring-cache-$uselang.txt"))
		    {
		    	$_locationStringCache = unserialize(file_get_contents($cfgClient[$client]["path"]["frontend"]."cache/locationstring-cache-$uselang.txt"));
		    } else {
		    	$_locationStringCache = array();	
		    }
		}
			
		if (array_key_exists($idcat, $_locationStringCache))
		{
	    	if ($_locationStringCache[$idcat]["expires"] > time())
	    	{
	    			$cat_str = $_locationStringCache[$idcat]["name"];
	    			return;
    		}    			
		}		       		
	}    
    
    $db = new DB_Contenido;
    
    $sql = "SELECT
                a.name AS name,
                a.idcat AS idcat,
                b.parentid AS parentid,
				c.level as level
            FROM
                ".$cfg["tab"]["cat_lang"]." AS a,
                ".$cfg["tab"]["cat"]." AS b,
				".$cfg["tab"]["cat_tree"]." AS c
            WHERE
                a.idlang    = '".$uselang."' AND
                b.idclient  = '".$client."' AND
                b.idcat     = '".$idcat."' AND
                a.idcat     = b.idcat AND
				c.idcat = b.idcat";
    
    $db->query($sql);
    $db->next_record();
	
	if ($db->f("level") >= $firstTreeElementToUse)
	{
		
		$name       = $db->f("name");
		$parentid   = $db->f("parentid");
	
		//create link
		if ($makeLink == true)
		{
			$linkUrl = $sess->url("front_content.php?idcat=$idcat");
			$name = '<a href="'.$linkUrl.'" class="'.$linkClass.'">'.$name.'</a>';	
		}
	
		$tmp_cat_str = $name . $seperator . $cat_str;
		$cat_str = $tmp_cat_str;

	}

    if ( $parentid != 0 ) {
        conCreateLocationString($parentid, $seperator, $cat_str, $makeLink, $linkClass, $firstTreeElementToUse ,$uselang, false);
        
    } else {
        $sep_length = strlen($seperator);
        $str_length = strlen($cat_str);
        $tmp_length = $str_length - $sep_length;
        $cat_str = substr($cat_str, 0, $tmp_length);
    }

    if ($final == true)
    {

	    $sql = "SELECT
    				startidartlang AS startidartlang
            	FROM
	                ".$cfg["tab"]["cat_lang"]."
            	WHERE
	            	idcat		= '".$idcat."'";
    
	    $db->query($sql);
	    $db->next_record();
	    
		if ($db->f("startidartlang") != $idartlang)
		{
			$sql = "SELECT
    					idart AS idart,
                		title AS title
            		FROM
						".$cfg["tab"]["art_lang"]."
            		WHERE
		            	idartlang	= '".$idartlang."'";
    
		    $db->query($sql);
		    $db->next_record();

			$title = $db->f("title");
			$idart = $db->f("idart");
			if ($makeLink == true)
			{
				$linkUrl = $sess->url("front_content.php?idart=$idart");
				$title = '<a href="'.$linkUrl.'" class="'.$linkClass.'">'.$title.'</a>';	
			}
		
			$tmp_cat_str = $cat_str . $seperator . $title;
			$cat_str = $tmp_cat_str;
		}
    
    }
        
    if ($final == true && $usecache == true)
    {
   		$_locationStringCache[$idcat]["name"] = $cat_str;
   		$_locationStringCache[$idcat]["expires"] = time() + 3600;
   		
   		if (is_writable($cfgClient[$client]["path"]["frontend"]."cache/"))
   		{
   			file_put_contents($cfgClient[$client]["path"]["frontend"]."cache/locationstring-cache-$uselang.txt", serialize($_locationStringCache));
   		}
    }
}

Verfasst: Do 1. Feb 2007, 12:04
von Marxer
Irgendwie funktioniert die Erweiterung um den Artikellink bei mir nicht. Was läuft da verkehrt ?

Bei mir werden nur die Links der Kategorien angezeigt, die Artikel werden nach wie vor nicht angezeigt.

Hier mal mein Code:

Modul-Navigationspfad:

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, 1, true, false, $idartlang); 

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); 
    #$tmp = explode('<a ', $retval); 
    #$tmp[count($tmp)-1] = 'id="nav-path-last" '.$tmp[count($tmp)-1]; 
    #$retval = implode('<a ', $tmp); 
} 
echo $retval; 
?> 
functions.con.php:

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, 1, true, false, $idartlang); 

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); 
    #$tmp = explode('<a ', $retval); 
    #$tmp[count($tmp)-1] = 'id="nav-path-last" '.$tmp[count($tmp)-1]; 
    #$retval = implode('<a ', $tmp); 
} 
echo $retval; 
?> 
Demo: http://reifen-palacek.de/cms/front_content.php?idart=11

Wenn ich das richtig verstanden habe sollte ja hinter der Kategorie dann der Artikellink mit den Angaben die ich im Backend unter den Artikeleigenschaften als Titel angegeben habe erscheinen.

Oder bin ich da falsch ? Danke im Voraus.


Gruß Marxer

Verfasst: Do 1. Feb 2007, 12:30
von abenda
Hallo Marxer,

leider hast Du zweimal den gleichen Code gepostet. Schick doch bitte nochmal den richtigen Code der functions.con.php.

Grundsätzlich wird der Titel der Artikel nur dann mit genutzt, wenn es sich nicht um den Startartikel der jeweiligen Kategorie handelt, weil sonst ja der Link zur Kategorie und zum Artikel zum gleichen Ziel führen würden. Man sieht es also ohnehin nur bei Kategorien, an denen mehrere Artikel hängen. - Sowas finde ich auf Deiner Website gar nicht ...

Gruß,

Karsten

Verfasst: Mo 5. Feb 2007, 10:51
von Marxer
Hallo Karsten,

dann hat es sich um ein Verständnisproblem meinerseits gehandelt. Ich habe mal einen Ordner mit mehreren Artikeln angelegt und jetzt funktioniert es reibungslos.

Obwohl es vieleicht auch interessant sein könnte in manchen Fällen den Startartikel optional mit ausgeben zu lassen z.B. für Suchmaschinen.

Gruß Frank