Doppelter Startartikel in Breadcrumb bei Redaxo 4.2.1

Wie verwendet man Templates oder erstellt Navigationen und passt diese an.

Doppelter Startartikel in Breadcrumb bei Redaxo 4.2.1

Beitragvon decpoint » 5. Jun 2009, 10:32

Hallo zusammen,

habe das Problem schon in einem anderen Forumthema dazugeschrieben, aber ich glaube ein neues Thema aufzumachen, bringt mehr Antworten ;-)

Ich habe das Problem, dass bei der Breadcrumb-Navigation der Startartikel doppelt angezeit wird. Beispiel könnt Ihr Euch unter http://www.heilpraktiker-vorbereitung.com anschauen. Ich habe das Breadcrumb-Navi-Template ein bisschen verändert, aber ich denke, dass es nichts mit dem Problem zu tun hat:
Code: Alles auswählen
<?php

// ---------- BREADCRUMB

// Beginne in der Wurzelkategorie
// 1 Ebene Tief
// Nicht aufklappen (hier egal da nur 1 Ebene)
// Offline ausblenden

$category_id = 0;
$includeCurrent = TRUE;

// navigation generator erstellen
$nav = rex_navigation::factory();

echo '<div id="breadcrumb">';
if ($REX['CUR_CLANG'] == 1)
{
  echo '<p>You are here:</p>'. $nav->getBreadcrumb('heilpraktiker-vorbereitung.com', $includeCurrent, $category_id);
}
else
{
  echo '<p>Sie befinden sich hier:</p>'. $nav->getBreadcrumb('heilpraktiker-vorbereitung.com', $includeCurrent, $category_id);
}
echo '</div>';
?>


Dann habe ich in der class.rex_navigation.inc.php gesehen, dass der Startartikel ja ausgeblendet werden sollte:
Code: Alles auswählen
<?php

/**
* Klasse zum Erstellen von Navigationen, v0.1
*
* @package redaxo4
* @version svn:$Id$
*/

/*
* Beispiel:
*
* UL, LI Navigation von der Rootebene aus,
* 2 Ebenen durchgehen, Alle unternavis offen
* und offline categorien nicht beachten
*
* Navigation:
*
* $nav = rex_navigation::factory();
* $nav->setClasses(array('lev1', 'lev2', 'lev3'));
* echo $nav->get(0,2,TRUE,TRUE);
*
* Sitemap:
*
* $nav = rex_navigation::factory();
* $nav->show(0,-1,TRUE,TRUE);
*
* Breadcrump:
*
* $nav = rex_navigation::factory();
* $nav->showBreadcrump(true);
*/

class rex_navigation
{
   var $depth; // Wieviele Ebene tief, ab der Startebene
   var $open; // alles aufgeklappt, z.b. Sitemap
   var $ignore_offlines;
   var $path = array();
   var $classes = array();

   var $current_article_id = -1; // Aktueller Artikel
   var $current_category_id = -1; // Aktuelle Katgorie

   /*private*/ function rex_navigation()
   {
   }

  /*public*/ function factory()
  {
    static $class = null;

    if(!$class)
    {
      // ----- EXTENSION POINT
      $class = rex_register_extension_point('REX_NAVI_CLASSNAME', 'rex_navigation');
    }

    return new $class();
  }

  /**
   * Generiert eine Navigation
   *
   * @param $category_id Id der Wurzelkategorie
   * @param $depth Anzahl der Ebenen die angezeigt werden sollen
   * @param $open True, wenn nur Elemente der aktiven Kategorie angezeigt werden sollen, sonst FALSE
   * @param $ignore_offlines FALSE, wenn offline Elemente angezeigt werden, sonst TRUE
   */
   /*public*/ function get($category_id = 0,$depth = 3,$open = FALSE, $ignore_offlines = FALSE)
   {
    if(!$this->_setActivePath()) return FALSE;
   
     $this->depth = $depth;
    $this->open = $open;
    $this->ignore_offlines = $ignore_offlines;
   
      return $this->_getNavigation($category_id,$this->ignore_offlines);
   }

  /**
   * @see get()
   */
   /*public*/ function show($category_id = 0,$depth = 3,$open = FALSE, $ignore_offlines = FALSE)
   {
      echo $this->get($category_id, $depth, $open, $ignore_offlines);
   }
   
  /**
   * Generiert eine Breadcrumb-Navigation
   *
   * @param $startPageLabel Label der Startseite, falls FALSE keine Start-Page anzeigen
   * @param $includeCurrent True wenn der aktuelle Artikel enthalten sein soll, sonst FALSE
   * @param $category_id Id der Wurzelkategorie
   */
   /*public*/ function getBreadcrumb($startPageLabel, $includeCurrent = FALSE, $category_id = 0)
   {
     if(!$this->_setActivePath()) return FALSE;
   
     global $REX;
   
     $path = $this->path;
           
    $i = 1;
    $lis = '';
   
    if($startPageLabel)
    {
      $lis .= '<li class="rex-lvl'. $i .'"><a href="'. rex_getUrl($REX['START_ARTICLE_ID']) .'">'. htmlspecialchars($startPageLabel) .'</a></li>';
      $i++;

      // StartArticle nicht doppelt anzeigen
      if(isset($path[0]) && $path[0] == $REX['START_ARTICLE_ID'])
      {
        unset($path[0]);
      }
    }
   
    foreach($path as $pathItem)
    {
      $cat = OOCategory::getCategoryById($pathItem);
      $lis .= '<li class="rex-lvl'. $i .'"><a href="'. $cat->getUrl() .'">'. htmlspecialchars($cat->getName()) .'</a></li>';
      $i++;
    }
   
    if($includeCurrent)
    {
      if($art = OOArticle::getArticleById($this->current_article_id))
        if(!$art->isStartpage())
        {
          $lis .= '<li class="rex-lvl'. $i .'"><p>>> </p><a href="'. $art->getUrl() .'">'. htmlspecialchars($art->getName()) .'</a></li>';
        }else
        {
           $cat = OOCategory::getCategoryById($this->current_article_id);
          $lis .= '<li class="rex-lvl'. $i .'"><p>>> </p><a href="'. $cat->getUrl() .'">'. htmlspecialchars($cat->getName()) .'</a></li>';
        }
    }
   
    return '<ul class="rex-breadcrumb">'. $lis .'</ul>';
   }
   
   /**
    * @see getBreadcrumb()
    */
  /*public*/ function showBreadcrumb($includeCurrent = FALSE, $category_id = 0)
  {
    echo $this->getBreadcrumb($includeCurrent, $category_id);
  }

   /*public*/ function setClasses($classes)
   {
     $this->classes = $classes;
   }

   /*private*/ function _setActivePath()
   {
      global $REX;

      $article_id = $REX["ARTICLE_ID"];
      if($OOArt = OOArticle::getArticleById($article_id))
      {
        $path = trim($OOArt->getValue("path"), '|');
       
        $this->path = array();
        if($path != "")
          $this->path = explode("|",$path);
         
      $this->current_article_id = $article_id;
         $this->current_category_id = $OOArt->getCategoryId();
         return TRUE;
      }
     
      return FALSE;
   }

   /*protected*/ function _getNavigation($category_id,$ignore_offlines = TRUE)
   {
     static $depth = 0;
   
    if($category_id < 1)
        $nav_obj = OOCategory::getRootCategories($ignore_offlines);
      else
        $nav_obj = OOCategory::getChildrenById($category_id, $ignore_offlines);

     $return = "";

      if(count($nav_obj)>0)
        $return .= '<ul class="rex-navi'. ($depth+1) .'">';

      foreach($nav_obj as $nav)
      {
        $liClass = '';
        $linkClass = '';
       
        // classes abhaengig vom pfad
         if($nav->getId() == $this->current_category_id)
         {
           $liClass .= ' rex-current';
           $linkClass .= ' rex-current';
         }
         elseif (in_array($nav->getId(),$this->path))
         {
        $liClass .= ' rex-active';
           $linkClass .= ' rex-active';
         }
         else
         {
        $liClass .= ' rex-normal';
         }
         
      // classes abhaengig vom level
      if(isset($this->classes[$depth]))
        $liClass .= ' '. $this->classes[$depth];
     
         $liClass   = $liClass   == '' ? '' : ' class="'. ltrim($liClass) .'"';
         $linkClass = $linkClass == '' ? '' : ' class="'. ltrim($linkClass) .'"';
         
      $return .= '<li id="rex-article-'. $nav->getId() .'"'. $liClass .'>';
         $return .= '<a'. $linkClass .' href="'.$nav->getUrl().'">'.htmlspecialchars($nav->getName()).'</a>';

         $depth++;
         if(($this->open ||
             $nav->getId() == $this->current_category_id ||
             in_array($nav->getId(),$this->path))
         && ($this->depth > $depth || $this->depth < 0))
         {
            $return .= $this->_getNavigation($nav->getId(),$ignore_offlines);
         }
         $depth--;

         $return .= '</li>';
      }

      if(count($nav_obj)>0)
        $return .= '</ul>';

      return $return;
   }
}


Nur leider funktioniert es trotzdem nicht :-(
Liegt es vielleicht an realurl? Was ich mir auch nicht vorstellen kann.
In den älteren Redaxo Versionen, hat dies einwandfrei funktioniert.
Siehe z.B. http://www.restaurant-leonardo.eu

Habe schon einen Tipp bekommen, dass Breadcrumb-Template vom Redaxo 3.1 zu verwenden. Gibt es da nicht auch eine andere Möglichkeit?

Bin für jeden Tipp dankbar um den Bug zu beheben, da die Seiten die ich mit dem neusten Redaxo gemacht habe ansonsten perfekt sind!
Also auch an dieser Stelle großes Lob an die Entwickler!!!

Greetz, Karl
Das Licht am Ende des Tunnels, ist immer das, des entgegen kommenden Zuges :-O
decpoint
 
Beiträge: 67
Registriert: 4. Jan 2007, 03:25
Wohnort: Bad Bellingen

Beitragvon Xong » 5. Jun 2009, 11:47

Du hast zwei Möglichkeiten:
1. Setze $includeCurrent = FALSE;, wenn die Seite die Startseite ist.
→ Kompatibel mit späteren Lösungen

2. Ändere die Funktion getBreadcrumb folgendermaßen ab:
/*public*/ function getBreadcrumb($startPageLabel, $includeCurrent = FALSE, $category_id = 0)
{
if(!$this->_setActivePath()) return FALSE;

global $REX;

$path = $this->path;

$i = 1;
$lis = '';

if($startPageLabel)
{
$lis .= '<li class="rex-lvl'. $i .'"><a href="'. rex_getUrl($REX['START_ARTICLE_ID']) .'">'. htmlspecialchars($startPageLabel) .'</a></li>';
$i++;

// StartArticle nicht doppelt anzeigen
if(isset($path[0]) && $path[0] == $REX['START_ARTICLE_ID'])
{
unset($path[0]);
}
}

foreach($path as $pathItem)
{
$cat = OOCategory::getCategoryById($pathItem);
$lis .= '<li class="rex-lvl'. $i .'"><a href="'. $cat->getUrl() .'">'. htmlspecialchars($cat->getName()) .'</a></li>';
$i++;
}

if($includeCurrent)
{
if($art = OOArticle::getArticleById($this->current_article_id))
if(!$art->isStartpage())
{
if($startPageLabel===false)
$lis .= '<li class="rex-lvl'. $i .'">'. htmlspecialchars($art->getName()) .'</li>';
}else
{
$cat = OOCategory::getCategoryById($this->current_article_id);
$lis .= '<li class="rex-lvl'. $i .'">'. htmlspecialchars($cat->getName()) .'</li>';
}
}

return '<ul class="rex-breadcrumb">'. $lis .'</ul>';
}

→ Wird in späteren Versionen eventuell eingebunden. =)
Zuletzt geändert von Xong am 22. Jul 2009, 14:39, insgesamt 1-mal geändert.
LG,
Xong

Bild Määääääääääääääääääääääääh!
Benutzeravatar
Xong
 
Beiträge: 1560
Registriert: 5. Jun 2008, 07:30
Wohnort: Hohndorf in Sachsen

Beitragvon decpoint » 6. Jun 2009, 15:24

Hi Xong,

Danke für Deine Antwort.

Habe die 2. Möglichkeit probiert, klappt aber irgendwie garnicht :-(
Die 1. wäre am einfachsten und funktioniert auch.
Habe es im Breadcrumb-Template umgestellt, nur wirkt sich das jetzt auf jede Seite aus. Kann ich es per PHP irgendwie so steuern, dass er das nur bei der Startseite anwendet sonst nicht?
Sorry, hab sogut wie keine Ahnung von PHP, aber irgendwie... if Startpage, dann weglassen..... else, anzeigen *griiiinz*

Wäre doch am einfachsten, weil sonst alles OK ist und die Breadcrumb so angepasst wurde, wie ich sie brauche.

Wünsche ein schööönes Wochenende.
Das Licht am Ende des Tunnels, ist immer das, des entgegen kommenden Zuges :-O
decpoint
 
Beiträge: 67
Registriert: 4. Jan 2007, 03:25
Wohnort: Bad Bellingen

Beitragvon Xong » 6. Jun 2009, 23:42

decpoint hat geschrieben:Habe die 2. Möglichkeit probiert, klappt aber irgendwie garnicht :-(

Da scheine ich Mist gebaut zu haben. Ich schaue nochmal am Sonntag oder am Montag drauf.

decpoint hat geschrieben:Die 1. wäre am einfachsten und funktioniert auch.
Habe es im Breadcrumb-Template umgestellt, nur wirkt sich das jetzt auf jede Seite aus. Kann ich es per PHP irgendwie so steuern, dass er das nur bei der Startseite anwendet sonst nicht?

Es gibt eine Methode der Klasse OOArticle die isSiteStartArticle() lautet (oder ähnlich). Dazu schaust du am besten mal im Cheatsheet nach.

Wenn der Artikel die Startseite deiner Homepage ist, setzt du $includeCurrent auf FALSE, ansonsten halt auf TRUE.
Zuletzt geändert von Xong am 22. Jul 2009, 14:39, insgesamt 1-mal geändert.
LG,
Xong

Bild Määääääääääääääääääääääääh!
Benutzeravatar
Xong
 
Beiträge: 1560
Registriert: 5. Jun 2008, 07:30
Wohnort: Hohndorf in Sachsen

Beitragvon decpoint » 7. Jun 2009, 12:49

Hi Xong,

ich habe es jetzt in meinem leihenhaften PHP-Wissen geschafft so zu lösen!
Habe in das Navi-Template folgendes geschrieben:
Code: Alles auswählen
if ($REX['ARTICLE_ID'] == 1)
{
  $includeCurrent = FALSE;
}
else
{
  $includeCurrent = TRUE;
}


Jetzt klappt's :)
Siehe http://www.heilpraktiker-vorbereitung.com


Greetz, Karl
Das Licht am Ende des Tunnels, ist immer das, des entgegen kommenden Zuges :-O
decpoint
 
Beiträge: 67
Registriert: 4. Jan 2007, 03:25
Wohnort: Bad Bellingen

Beitragvon Xong » 8. Jun 2009, 07:56

Wie versprochen noch die Funktion mit korrekter Unterbindung der Ausgabe des Seitenstartartikels in der Breadcrumb-Navigation:
Code: Alles auswählen
  /**
   * Generiert eine Breadcrumb-Navigation
   *
   * @param $startPageLabel Label der Startseite, falls FALSE keine Start-Page anzeigen
   * @param $includeCurrent True wenn der aktuelle Artikel enthalten sein soll, sonst FALSE
   * @param $category_id Id der Wurzelkategorie
   */
   /*public*/ function getBreadcrumb($startPageLabel, $includeCurrent = FALSE, $category_id = 0)
   {
     if(!$this->_setActivePath()) return FALSE;
    
     global $REX;
   
     $path = $this->path;
           
    $i = 1;
    $lis = '';
   
    if($startPageLabel)
    {
      $lis .= '<li class="rex-lvl'. $i .'"><a href="'. rex_getUrl($REX['START_ARTICLE_ID']) .'">'. htmlspecialchars($startPageLabel) .'</a></li>';
      $i++;

      // StartArticle nicht doppelt anzeigen
      if(isset($path[0]) && $path[0] == $REX['START_ARTICLE_ID'])
      {
        unset($path[0]);
      }
    }
   
    foreach($path as $pathItem)
    {
      $cat = OOCategory::getCategoryById($pathItem);
      $lis .= '<li class="rex-lvl'. $i .'"><a href="'. $cat->getUrl() .'">'. htmlspecialchars($cat->getName()) .'</a></li>';
      $i++;
    }
   
    if($art = OOArticle::getArticleById($this->current_article_id))
    {
      if($includeCurrent AND !$art->isSiteStartArticle())
      {
        if(!$art->isStartpage())
        {
          $lis .= '<li class="rex-lvl'. $i .'">'. htmlspecialchars($art->getName()) .'</li>';
        }else
        {
          $cat = OOCategory::getCategoryById($this->current_article_id);
          $lis .= '<li class="rex-lvl'. $i .'">'. htmlspecialchars($cat->getName()) .'</li>';
        }
      }
    }
   
    return '<ul class="rex-breadcrumb">'. $lis .'</ul>';
   }
Zuletzt geändert von Xong am 22. Jul 2009, 14:39, insgesamt 1-mal geändert.
LG,
Xong

Bild Määääääääääääääääääääääääh!
Benutzeravatar
Xong
 
Beiträge: 1560
Registriert: 5. Jun 2008, 07:30
Wohnort: Hohndorf in Sachsen

Beitragvon ralf.schlott » 9. Jun 2009, 18:10

Vielen Dank für den Code. Hast du das in der class.navigation geändert? Ich probier das dann mal.

Noch eine Frage: Wie hast du das mit den Trennern '>>' hinbekommen?

Freu mich über eine Antwort.

Gruss
Ralf
Benutzeravatar
ralf.schlott
 
Beiträge: 426
Registriert: 5. Dez 2007, 20:22
Wohnort: Hamburch

Beitragvon Xong » 9. Jun 2009, 21:49

Hallo Ralf!

rsi hat geschrieben:Vielen Dank für den Code. Hast du das in der class.navigation geändert? Ich probier das dann mal.

Ja, in der class.rex_navigation.inc.php.

rsi hat geschrieben:Noch eine Frage: Wie hast du das mit den Trennern '>>' hinbekommen?

Ich nehme an, es wurde im Code der Funktion geändert.

Ich würde es per CSS-Hintergrundbild lösen.
Zuletzt geändert von Xong am 22. Jul 2009, 14:40, insgesamt 1-mal geändert.
LG,
Xong

Bild Määääääääääääääääääääääääh!
Benutzeravatar
Xong
 
Beiträge: 1560
Registriert: 5. Jun 2008, 07:30
Wohnort: Hohndorf in Sachsen

Beitragvon ralf.schlott » 10. Jun 2009, 07:47

Xong hat geschrieben: Hallo Ralf!

rsi hat geschrieben:Vielen Dank für den Code. Hast du das in der class.navigation geändert? Ich probier das dann mal.

Ja, in der class.rex_navigation.inc.php.

Der Code wird nun bereits erfolgreich eingesetzt. Ich denke das wäre sogar eine Lösung für eine Änderung seitens redaxo...

Xong hat geschrieben:
rsi hat geschrieben:Noch eine Frage: Wie hast du das mit den Trennern '>>' hinbekommen?

Ich nehme an, es wurde im Code der Funktion geändert.

Ich würde es per CSS-Hintergrundbild lösen.

LG,
Xong

Das habe ich bereits probiert, aber display:inline verträgt sich nicht... Wieso erscheint das dann bei dir?

Gruss
Ralf[/quote]
Benutzeravatar
ralf.schlott
 
Beiträge: 426
Registriert: 5. Dez 2007, 20:22
Wohnort: Hamburch

Beitragvon Xong » 10. Jun 2009, 07:53

rsi hat geschrieben:
Xong hat geschrieben:Ich würde es per CSS-Hintergrundbild lösen.

Das habe ich bereits probiert, aber display:inline verträgt sich nicht... Wieso erscheint das dann bei dir?

Wieso bei mir? Die Seite ist doch von decpoint... =)

Arbeite mit float, padding und einem sich nicht wiederholenden Hintergrundbild.

LG,
Xong

PS: Wenn du noch ein konkretes Problem hast, kann du ja ein Onlinebeispiel zur Verfügung stellen. Da hilft´s sich dann viel einfacher.
LG,
Xong

Bild Määääääääääääääääääääääääh!
Benutzeravatar
Xong
 
Beiträge: 1560
Registriert: 5. Jun 2008, 07:30
Wohnort: Hohndorf in Sachsen

Beitragvon ralf.schlott » 11. Jun 2009, 09:51

Hallo Xong,
da hast du recht mit CSS, ich dachte nur, da gäbe es eine Möglichkeit, dieses in den Code einzubauen. Man kann ja dann unterschiedliche Zeichen je nach Webpräsenz nehmen: ; oder > oder >> oder | usw...

Die Entwickler haben sich ja sicher schon was gedacht mit der neuen Navigation.

Gruss
Ralf
Benutzeravatar
ralf.schlott
 
Beiträge: 426
Registriert: 5. Dez 2007, 20:22
Wohnort: Hamburch

Beitragvon ralf.schlott » 19. Jun 2009, 14:09

Kann man den Breadcrumb eigentlich ohne Liste aufstellen? Das wäre doch an sich ein bisschen einfacher, weil ein Breadcrumb ja meist sowieso horizontal verläuft.
Sonst muss ich das mal probieren.

Gibt es schon eine Lösung für ">" oder ähnliches?

Gruss
Ralf
Benutzeravatar
ralf.schlott
 
Beiträge: 426
Registriert: 5. Dez 2007, 20:22
Wohnort: Hamburch

Beitragvon Xong » 19. Jun 2009, 14:20

rsi hat geschrieben:Kann man den Breadcrumb eigentlich ohne Liste aufstellen? Das wäre doch an sich ein bisschen einfacher, weil ein Breadcrumb ja meist sowieso horizontal verläuft.

Du solltest dich von der Vorstellung lösen, HTML könnte irgendwas mit dem Aussehen zu tun haben. Über CSS kannst du alles bequem anpassen, zumal die Browserunterstützung immer besser wird und alte Browser langsam aber sicher aussterben.

rsi hat geschrieben:Gibt es schon eine Lösung für ">" oder ähnliches?

Ja, entweder als Hintergrundbild per CSS oder eben einfach dieses Zeichen (maskiert, also &gt;) in jeden Punkt außer dem letzten einfügen.
Zuletzt geändert von Xong am 22. Jul 2009, 14:40, insgesamt 1-mal geändert.
LG,
Xong

Bild Määääääääääääääääääääääääh!
Benutzeravatar
Xong
 
Beiträge: 1560
Registriert: 5. Jun 2008, 07:30
Wohnort: Hohndorf in Sachsen

Beitragvon ralf.schlott » 19. Jun 2009, 14:40

Xong hat geschrieben: Du solltest dich von der Vorstellung lösen, HTML könnte irgendwas mit dem Aussehen zu tun haben. Über CSS kannst du alles bequem anpassen, zumal die Browserunterstützung immer besser wird und alte Browser langsam aber sicher aussterben.

Davon habe ich mich schon lange gelöst. In dem Fall aber sicher Streitfrage... Ohne Liste fänd ich es trotzdem flexibel.

Xong hat geschrieben:Ja, entweder als Hintergrundbild per CSS oder eben einfach dieses Zeichen (maskiert, also &gt;) in jeden Punkt außer dem letzten einfügen.

Wenn du mir bei display:inline zeigst, wie ich da einen flexiblen Listenpunkt (Bild oder '>') einbaue, dann gehe ich d'accord. Aber so werde ich mal '&gt;' nehmen.
Gute Idee und danke für den Rat!

Gruss
Ralf
Benutzeravatar
ralf.schlott
 
Beiträge: 426
Registriert: 5. Dez 2007, 20:22
Wohnort: Hamburch

Beitragvon Xong » 19. Jun 2009, 15:08

rsi hat geschrieben:Wenn du mir bei display:inline zeigst, wie ich da einen flexiblen Listenpunkt (Bild oder '>') einbaue, dann gehe ich d'accord.

Und du gibst mir ´n Bier aus, ja!? :D

http://www.fuhrpark-software.de/spielwiese/breadcrumb.php
Zuletzt geändert von Xong am 22. Jul 2009, 14:40, insgesamt 1-mal geändert.
LG,
Xong

Bild Määääääääääääääääääääääääh!
Benutzeravatar
Xong
 
Beiträge: 1560
Registriert: 5. Jun 2008, 07:30
Wohnort: Hohndorf in Sachsen

Nächste

Zurück zu Templates/Navigationen [R4]

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste