Seite 1 von 1

Sitemap als Menü -> leere Kat. -> Weiterleitung 1. Startart.

Verfasst: Do 8. Nov 2012, 12:19
von derSteffen
Hallo Community,

ich nutze eine Sitemap als DropDown-Menü. Das klappt auch wunderbar. Allerdings klickt der Benutzer ja oft nur auf den letzten Menüpunkt eines Klap-Auf-Menüs und selten auf ein obergeordneten Punkt, deswegn kann man diese oft leer lassen, aber was ist wenn doch jemand raufklickt! Zur Zeit löse ich das mit einen leeren Artikel mit einer Weiterleitung zur nächsten gewünschten Kategorie.

z.B. So stelle ich mir das vor:
Punkt 1
Punkt 2
Punkt 3
Punkt 4 -------------> Hier ist kein Artikel hinterlegt und somit soll der Startartikel der "Punkt 4.1" aufgerufen werden, da hier der erste Startartikel drin ist von einer der untegordneten Kategorien!
Punkt 4.1
Punkt 4.2
Punkt 4.3
Punkt 5

Ist es möglich das man sagen kann, wenn in dem Menüpunkt kein Artikel angelegt ist (sondern nur eine Kategorie), dann rufe aus der ersten untergordneten Kategorie die ein Startartikel hat, diesen Startartikel auf?

Code: Alles auswählen

<?php 
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname   :     vpSitemap 0.4
* Author      :     Ingo van Peeren
* Copyright   :     Ingo van Peeren (ingo@van-peeren.de)
* Created     :     2005-01-14
* Modified    :     2006-09-07
* Credits     :     Nik Wyss & juergen@sotonic.de
************************************************/

// Includes
cInclude("frontend", "includes/functions.navigation.php");

// CMS_VALUES initialisieren
$anzahlEbenen      = "5";
$startkategorie    = "1";
$ebeneNullAnzeigen = "2";

function vpSitemap($kategorie=0, $level)
{
  global $lang, $client, $cfg, $startkategorie, $anzahlEbenen, $ebeneNullAnzeigen;
  $db  = new DB_Contenido;
  $sql  = "SELECT
             *
           FROM
             ".$cfg["tab"]["cat_tree"]." AS A,
             ".$cfg["tab"]["cat"]." AS B,
             ".$cfg["tab"]["cat_lang"]." AS C
           WHERE
             A.idcat=B.idcat
             AND B.idcat=C.idcat
             AND C.idlang='$lang'
             AND B.idclient='$client'
             AND B.parentid=$kategorie
             AND level <= $anzahlEbenen
             AND C.visible=1
           ORDER by A.idtree";
    $db->query($sql);
    $treffer = $db->num_rows();
    if ($treffer) {
      if ($kategorie == $startkategorie) $result .= "\n" . str_repeat (" ", ($level * 4)) . "<ul class=\"dropdown\">\n";
      else $result .= "\n" . str_repeat (" ", ($level * 4) + 4) . "<ul class=\"roundbordermenue\">\n";
    }
    while ($db->next_record())
    {
       
      $visible = checkCatPermission($db->f("idcatlang"),$db->f("public"));
      if ($visible) {       
            
        $lvl = $db->f("level");
        $result .= str_repeat (" ", ($lvl * 4) + 2);
        if ($lvl == 1) {
          $result .= '<li class="id'.$db->f("idcat").' ebene'.$lvl.'"><a href="front_content.php?idcat='.$db->f("idcat").'&lang='.$lang.'&client='.$client.'">' . $db->f("name") . '</a>' . vpSitemap($db->f("idcat"), $lvl) . "</li>\n";
        }
        else if ($lvl > 1) {
          $result .= '<li><a href="front_content.php?idcat='.$db->f("idcat").'&lang='.$lang.'&client='.$client.'">'. $db->f("name") . '</a>' . vpSitemap($db->f("idcat"), $lvl) . "</li>\n";
        }
        else {
          $result .= "<li>&nbsp;".vpSitemap($db->f("idcat"), $lvl) . "</li>\n";
        }
      }
    } 
    if ($treffer) {
      if ($kategorie == $startkategorie) $result .= str_repeat (" ", ($level * 4));
      else $result .= str_repeat (" ", ($level * 4) + 4);
      $result .= "</ul>\n";
      $result .= str_repeat (" ", ($level * 4) + 2);
    }
    return($result);
  }

$sql = "SELECT
          level
        FROM
          ".$cfg["tab"]["cat_tree"]."
        WHERE
          idcat=$startkategorie";
$db->query($sql);
$db->next_record();
$startEbene = $db->f("level") + 1;
$anzahlEbenen += $startEbene;
if ($startkategorie==0) {
  if ($ebeneNullAnzeigen) $anzahlEbenen--;
  $startEbene--;
}
echo "<div id=\"menue\">";
echo vpSitemap($startkategorie, $startEbene);
echo "</div>";
?>
Für tipps wäre ich sehr dankbar.

Vielen Dank

MfG Steffen

Re: Sitemap als Menü -> leere Kat. -> Weiterleitung 1. Start

Verfasst: Do 8. Nov 2012, 12:43
von derju
Hallo Steffen

Momentan gibt es von Contenido aus die Überprüfung ob der Navigationspunkt leer, wenn ja springt er auf die Fehlerseite.

Man könnte die Abfrage erweitern das man abfrägt ob es eine unter Kategorie gibt die einen Standard-Artikel definiert hat.

LG, derJu

Re: Sitemap als Menü -> leere Kat. -> Weiterleitung 1. Start

Verfasst: Do 8. Nov 2012, 13:40
von Spider IT
Hallo Steffen,

warum umgehst du das Problem nicht, indem du die Verlinkung beim Navigationspunkt der oberen Ebene verhinderst, wenn dieser Unterpunkte hat?

Gruß
René

Re: Sitemap als Menü -> leere Kat. -> Weiterleitung 1. Start

Verfasst: Do 8. Nov 2012, 15:32
von derSteffen
Vielen Dank für die beiden Hinweise!

Der Ansatz von René ist natürlich naheliegend ... dann werde ich mich mal dahinter klemmen.

Danke nochmal!

MfG Steffen

Re: Sitemap als Menü -> leere Kat. -> Weiterleitung 1. Start

Verfasst: Do 8. Nov 2012, 23:40
von derSteffen
Mal ne Frage!

Muss ich mein SQL-Abfrage dafür erweitern?

Ich dachte ich könnte mit so etwas arbeiten:

Code: Alles auswählen

$is_start = '1'
also sowas in etwa:

Code: Alles auswählen

if (($lvl == 1) AND ($is_start = '1'))  
Aber dann werden mir gar keine Links mehr angezeigt.

Wobei komischerweise in meine con_cat_art überall 0 steht in der "is_start".

Vielen Dank

MfG Steffen

Re: Sitemap als Menü -> leere Kat. -> Weiterleitung 1. Start

Verfasst: Fr 9. Nov 2012, 09:34
von derSteffen
AH :-)

Das Gehemnis ist

Code: Alles auswählen

$db->f("startidartlang")
MfG

Re: Sitemap als Menü -> leere Kat. -> Weiterleitung 1. Start

Verfasst: Fr 9. Nov 2012, 09:57
von Spider IT
Die Angabe is_start ist veraltet, seit Contenido 4.8 gibt es die Angabe startidartlang.
Bei Seiten, die aus älteren Versionen upgraded wurden, kann die alte Version noch aktiv sein.

Gruß
René

Re: Sitemap als Menü -> leere Kat. -> Weiterleitung 1. Start

Verfasst: Fr 9. Nov 2012, 11:57
von derSteffen
Hallo René,

dank für den Hinweis:

Anbei der Code der Sitemap die ich für ein Dropdown-Menü benutze. Der Vorteil, mit CSS kann hier eine Menge gemacht werden.

- Bei <UL> die nicht die Startkategorie ist (also alle untergeordneten UL) wird die Ebene (also Level) und die Parent-ID als CSS-Klasse reingeschrieben
- Bei allen <LI> werden Ebene (Level) und die jeweilige IDCAT als CSS-Klasse reingeschrieben
- Hat eine Kategorie keinen Startartikel, wird der Menüpunkt zwar angezeigt aber es wird kein Link dargestellt

Die angelegten CSS-Klassen:
ul.ulebene für Level
ul.ulparentid für ParentID
li.id für IDCAT
li.ebene für Ebene

- Was ich nicht geschaft habe, ist das man auch bei der <UL> die Idcat ausgibt.

Code: Alles auswählen

<?php 
/***********************************************
* CONTENIDO MODUL - OUTPUT
*
* Modulname   :     vpSitemap 0.4
* Author      :     Ingo van Peeren
* Copyright   :     Ingo van Peeren (ingo@van-peeren.de)
* Created     :     2005-01-14
* Modified    :     2006-09-07
* Credits     :     Nik Wyss & juergen@sotonic.de
************************************************/

// Includes
cInclude("frontend", "includes/functions.navigation.php");

// CMS_VALUES initialisieren
$anzahlEbenen      = "5";
$startkategorie    = "1";
$ebeneNullAnzeigen = "2";

function vpSitemap($kategorie=0, $level)
{
  global $lang, $client, $cfg, $startidartlang, $idcatlang, $startkategorie, $anzahlEbenen, $ebeneNullAnzeigen;
  $db  = new DB_Contenido;
  $sql  = "SELECT
             *
           FROM
             ".$cfg["tab"]["cat_tree"]." AS A,
             ".$cfg["tab"]["cat"]." AS B,
             ".$cfg["tab"]["cat_lang"]." AS C
           WHERE
             A.idcat=B.idcat
             AND B.idcat=C.idcat
             AND C.idlang='$lang'
             AND B.idclient='$client'
             AND B.parentid=$kategorie
             AND level <= $anzahlEbenen
             AND C.visible=1
           ORDER by A.idtree";
    $db->query($sql);
    $treffer = $db->num_rows();	
	
    if ($treffer) {	
      if ($kategorie == $startkategorie) $result .= "\n" . str_repeat (" ", ($level * 4)) . "<ul class=\"dropdown\">\n";
      else $result .= "\n" . str_repeat (" ", ($level * 4) + 4) . "<ul class=\"untermenuepunkte ulebene$level ulparentid$kategorie\">\n";
    }
    while ($db->next_record())
    {
       
      $visible = checkCatPermission($db->f("idcatlang"),$db->f("public"));
      if ($visible) {       
            
        $lvl = $db->f("level");
		$hatstartartikel = $db->f("startidartlang");
        $result .= str_repeat (" ", ($lvl * 4) + 2);
		// Hat Startartikel und wenn Ebene = 1 ist
        if (($lvl == 1) AND ($hatstartartikel != 0))  {
          $result .= '<li class="id'.$db->f("idcat").' ebene'.$lvl.'"><a href="front_content.php?idcat='.$db->f("idcat").'&lang='.$lang.'&client='.$client.'">' . $db->f("name") . '</a>' . vpSitemap($db->f("idcat"), $lvl) . "</li>\n";
        }
		// Hat keinen Startartikel und Ebene = 1 ist
		else if (($lvl == 1) AND ($hatstartartikel == 0))  {
          $result .= '<li class="id'.$db->f("idcat").' ebene'.$lvl.'"><span class="keinlink">' . $db->f("name") . '</span>' . vpSitemap($db->f("idcat"), $lvl) . "</li>\n";
        }
		// Hat Startartikel und wenn generell Ebene groesser als 1 (kann man also auch fuer jede Ebene individuell gestalten)
        else if (($lvl > 1) AND ($hatstartartikel != 0)) {
          $result .= '<li class="id'.$db->f("idcat").' ebene'.$lvl.'"><a href="front_content.php?idcat='.$db->f("idcat").'&lang='.$lang.'&client='.$client.'">'. $db->f("name") . '</a>' . vpSitemap($db->f("idcat"), $lvl) . "</li>\n";
        }
		// Hat keinen Startartikel UND Wenn generell Ebene groesser als 1 (kann man also auch fuer jede Ebene individuell gestalten)
		else if (($lvl > 1) AND ($hatstartartikel == 0)) {
          $result .= '<li class="id'.$db->f("idcat").' ebene'.$lvl.'"><span class="keinlink">'. $db->f("name") . '</span>' . vpSitemap($db->f("idcat"), $lvl) . "</li>\n";
        }
        else {
          $result .= '<li class="id'.$db->f("idcat").' ebene'.$lvl.'">&nbsp; '.vpSitemap($db->f("idcat"), $lvl) . "</li>\n";
        }
      }
    } 
    if ($treffer) {
      if ($kategorie == $startkategorie) $result .= str_repeat (" ", ($level * 4));
      else $result .= str_repeat (" ", ($level * 4) + 4);
      $result .= "</ul>\n";
      $result .= str_repeat (" ", ($level * 4) + 2);
    }
    return($result);
  }

$sql = "SELECT
          level
        FROM
          ".$cfg["tab"]["cat_tree"]."
        WHERE
          idcat=$startkategorie";
$db->query($sql);
$db->next_record();
$startEbene = $db->f("level") + 1;
$anzahlEbenen += $startEbene;
if ($startkategorie==0) {
  if ($ebeneNullAnzeigen) $anzahlEbenen--;
  $startEbene--;
}
echo vpSitemap($startkategorie, $startEbene);

?>
MfG Steffen

Re: Sitemap als Menü -> leere Kat. -> Weiterleitung 1. Start

Verfasst: Fr 9. Nov 2012, 13:25
von Spider IT
Hallo Steffen,

wofür brauchen denn die UL die idcat, und vor allem welche idcat?
UL ist die gesamte Liste, nicht der einzelne Eintrag, und ist für sich auch nicht anklickbar.

Gruß
René

Re: Sitemap als Menü -> leere Kat. -> Weiterleitung 1. Start

Verfasst: Fr 9. Nov 2012, 14:12
von derSteffen
Hallo René,

diese ganzen Angaben würde ich auch vorwiegend nur für CSS-Anpassungen nutzen. Somit hat man viel Spielraum und kann komplexe Darstellungen "designen". Zur Zeit wird ja schon die ParentID und das Level in der UL (also aus untergeordneten ULs) angegeben, dass ist zum CSSen ja schon gut, nur wenn die Kategorie verschoben wird, ändert sich das ja, nicht aber die IDCAT.

Zur Zeit sieht das so aus:
<li class="id5 ebene1"><span class="keinlink">Menüpunkt</span>
<ul class="ulebene1 ulparentid5">
<li class="id137 ebene2"><a href="link.html">Menüpunkt</a></li>
<li class="id35 ebene2"><span class="keinlink">Jugendbildung
<ul class="ulebene2 ulparentid35">
<li class="id138 ebene3"><a href="link.html">Menüpunkt</a></li>
</ul>
</li>
<li class="id36 ebene2"><span class="keinlink">Menüpunkt
<ul class="ulebene2 ulparentid36">
....
MfG Steffen

Re: Sitemap als Menü -> leere Kat. -> Weiterleitung 1. Start

Verfasst: Fr 9. Nov 2012, 14:31
von Spider IT
Hallo Steffen,

2 Dinge:
  1. beim UL steht schon die Angabe "ulparentidX" (X = idcat des übergeordneten Eintrags).
    In dem UL kommen dann aber mehrere LIs vor, mit unterschiedlichen idcats.
    Welches idcat möchtest du denn noch beim UL mit rein haben?
  2. Bei nicht verlinkten Einträge umschließt das SPAN auch die Unterebenen.
    Das SPAN Ende sollte wahrscheinlich vor den vpSitemap() Aufruf kommen (Zeilen 62 und 70)
Gruß
René

Re: Sitemap als Menü -> leere Kat. -> Weiterleitung 1. Start

Verfasst: Fr 9. Nov 2012, 15:58
von derSteffen
Hallo René,

danke für den Span-Hinweis, habe ich geändert (natürlich auch oben im Code) ...

und Danke für Deine Hartnäckigkeit :-) jetzt habe ich es gerafft!

Eigentlich habe ich ja schon das was ich will. Da die ParentID der UL ja die gleiche ist, wie die IDCAT der LI wo sich die UL drin befindet!
<li class="id5 ebene1"><span class="keinlink">Menüpunkt</span>
<ul class="ulebene1 ulparentid5">
<li class="id137 ebene2"><a href="link.html">Menüpunkt</a></li>
Danke René :-)

Vielleicht sollte man das unter Module auch ablegen :-)

MfG Steffen