Geteilte Navigation (Split Navigation) 4.8.15

homtata
Beiträge: 1142
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Geteilte Navigation (Split Navigation) 4.8.15

Beitrag von homtata » Mi 20. Jul 2011, 00:38

Hallo Community,

hier MEINE Version einer geteilten Navigation. Diese besteht aus zwei Modulen - Modul 1 gibt nur die erste Ebene der Hauptnavigation aus, Modul 2 gibt den Rest der Navigation in einem eigenen Container aus. In einer frühen Version gab es Probleme, falls man sich in einem anderen Navigationsbaum als der Hauptnavigation befand und diese Untermenüs hatte. Das Splitten und korrekte Ausgeben musste ich auf die Hauptnavigation einschränken. Daher wird im Modul 2 überprüft, ob man sich aktuell überhaupt in der Hauptnavigation befindet und wenn ja, auf welchem Level. Von dort aus wird bestimmt, in welcher Mutterkategorie innerhalb der Hauptkategorie man sich befindet, so dass von dort ausgehend jeweils die richtige Teilnavigation ausgegeben werden kann.

Hier Modul 1 (nur Output-Bereich):

Code: Alles auswählen

<?php
/**
* $RCSfile$
*
* Description: 
* Main Navigation, displays Navigation from a starting idcat down to the max. level set.
* For now (as of 2009-01-12) all subcategories are put inside one <ul> and are assigned css classes 
* to distinguish level depth, first/last and active item property.
* 
* Module requires two client settings: 
* navigation_main_standard | start_idcat
* navigation_main_standard | level_depth
* 
* To modify the behaviour of the module (e.g. style of URL, CSS classes, ...), you need to edit Contenido_NavMain_Util::loopCats
* @see {frontend}/includes/Util/Modules/Contenido_NavMain_Util.class.php
*
* @version 1.0.0
* @author Rudi Bieller
* @copyright four for business AG <www.4fb.de>
*
* {@internal
* created 2009-01-12
* }}
*
* $Id: Navigation_Standard.php 3444 2009-01-19 11:42:59Z rudi.bieller $
*/

$actualid_partofmaintree = false;

if (!isset($db)) {
    $db = new DB_Contenido();
}
if (!isset($tpl)) {
    $tpl = new Template();
}
$tpl->reset();

cInclude('classes', 'Contenido_FrontendNavigation/Contenido_FrontendNavigation.class.php');
cInclude('frontend', 'includes/Util/Modules/Contenido_NavMain_Util.class.php');

$iStartIdcat = getEffectiveSetting('navigation', 'idcat-home', 1);
$iSelectedDepth = getEffectiveSetting('navigation', 'level-depth', 1);

if ($iStartIdcat > 0) {
    $oFeNav = new Contenido_FrontendNavigation($db, $cfg, $client, $lang, $cfgClient);
    $oFeNav->setAuth($auth);
    $oFeNav->setRootCat($iStartIdcat);
    $oSubCategories = $oFeNav->getSubCategories($iStartIdcat, true, true, 1);
    // see if there are any subcategories to display
    if ($oSubCategories->count() > 0) {
        $aLevelInfo = array();
        $aDepthInfo = array();
        $aDepthInfo[0] = 0;
        $aDepthInfo[1] = $iSelectedDepth;
        foreach ($oSubCategories as $oSubCategory) {
            Contenido_NavMain_Util::loopCats($oSubCategory, $oFeNav, $tpl, $cfg, $lang, $aLevelInfo, intval($idcat), $aDepthInfo);
        }
        $tpl->generate('templates/navigation_standard.html');
    }
} else {
    echo '<p>Navigation not configured correctly.</p>';
}
?>
und hier Modul 2 (nur Output-Bereich):

Code: Alles auswählen

<?php
/**
* $RCSfile$
*
* Description: 
* Main Navigation, displays Navigation from a starting idcat down to the max. level set.
* For now (as of 2009-01-12) all subcategories are put inside one <ul> and are assigned css classes 
* to distinguish level depth, first/last and active item property.
* 
* Module requires two client settings: 
* navigation_main_standard | start_idcat
* navigation_main_standard | level_depth
* 
* To modify the behaviour of the module (e.g. style of URL, CSS classes, ...), you need to edit Contenido_NavMain_Util::loopCats
* @see {frontend}/includes/Util/Modules/Contenido_NavMain_Util.class.php
*
* @version 1.0.0
* @author Rudi Bieller
* @copyright four for business AG <www.4fb.de>
*
* {@internal
* created 2009-01-12
* }}
*
* $Id: Navigation_Standard.php 3444 2009-01-19 11:42:59Z rudi.bieller $
*/


if (!isset($db)) {
    $db = new DB_Contenido();
}
if (!isset($tpl)) {
    $tpl = new Template();
}
$tpl->reset();

cInclude('classes', 'Contenido_FrontendNavigation/Contenido_FrontendNavigation.class.php');
cInclude('frontend', 'includes/Util/Modules/Contenido_NavMain_Util.class.php');

$iStartIdcat = getEffectiveSetting('navigation', 'idcat-home', 1);
$iSelectedDepth = getEffectiveSetting('navigation', 'level-depth', 1);

cInclude("classes", "class.category.php");
cInclude("classes", "class.cat.php");

$maincatid  = $idcat;
$maincatid2 = $idcat;

// Vorgehen ist etwas verzwickt. Es gibt ein Problem, wenn die aktuelle Kategorie NICHT Teil des gewählten auszugebenden Navigationsbaumes ist.
// Die untenstehenden while-Schleife führt ins Nirvana und hängt das System auf.
// Daher muss zunächst überprüft werden, ob die aktuell angeklickte Kategorie Teil des auszugebenden Navigationsbaums ist - falls nein, muss die Sub-Schleife umgangen werden.
// Wir ermitteln das Level der aktuellen idcat und rechnen uns entsprechend viele Schritte hoch im Navibaum, um die Rootkategorie zu finden.
// Diese vergleichen wir mit der gewählten Startkategorie der Navigation - ist sie gleich, wird die das Submenü berechnet, sonst nicht.

// Rootkategorie ermitteln über das Level der aktuellen Kategorie
$oFeNav2 = new Contenido_FrontendNavigation($db, $cfg, $client, $lang, $cfgClient);
$idcatlevel = $oFeNav2->getLevel($idcat);

for ( $i=0; $i < $idcatlevel; $i++) {
	$oActualCategory2 = new CategoryItem($maincatid2);
	$maincatid2 = $oActualCategory2->get("parentid");
}

if ( $maincatid2 == $iStartIdcat ) {
while ( $maincatid !=  $iStartIdcat ) {
	$iParentID = $maincatid;	// bewahre den alten Wert, falls der neue die oberste Kategorie ist
	$oActualCategory = new CategoryItem($maincatid);
	$maincatid = $oActualCategory->get("parentid");
}

/* so lange schleifen, bis $maincatid == $iStartIdcat ist, dann war der Wert von $iParentID der korrekte, den also jeweils speichern */

/* Dann die zweite Ausgabe: */

if ($iParentID > 0) {
    $oFeNav = new Contenido_FrontendNavigation($db, $cfg, $client, $lang, $cfgClient);
    $oFeNav->setAuth($auth);
    $oFeNav->setRootCat($iParentID);
    $oSubCategories = $oFeNav->getSubCategories($iParentID, true, true, 1);
    // see if there are any subcategories to display
    if ($oSubCategories->count() > 0) {
        $aLevelInfo = array();
        $aDepthInfo = array();
        $aDepthInfo[0] = 0;
        $aDepthInfo[1] = $iSelectedDepth;
        foreach ($oSubCategories as $oSubCategory) {
            Contenido_NavMain_Util::loopCats($oSubCategory, $oFeNav, $tpl, $cfg, $lang, $aLevelInfo, intval($idcat), $aDepthInfo);
        }
        $tpl->generate('templates/navigation_sub.html');
    }
} else {
    echo '<p>&nbsp;</p>';
}
} // if actualid-ende

?>
LG

Freda
Beiträge: 80
Registriert: Di 13. Sep 2011, 18:21
Kontaktdaten:

Re: Geteilte Navigation (Split Navigation) 4.8.15

Beitrag von Freda » Do 15. Sep 2011, 08:57

hallo homtata!

was genau muss ich damit tun? (und was meinst du mit "nur output-bereich")

muss ich das ins layout "standard" einfügen? wenn ja, wo genau?
oder muss ich ein neues layout anlegen + speichern? wenn ja, ich bekomme die fehlermeldung
Der body-Tag existiert nicht in diesem Layout. Dies ist eine Voraussetzung für das In-Site-Editing.
Der head-Tag existiert nicht in diesem Layout. Dies ist eine Voraussetzung für das In-Site-Editing.
sorry, aber ich arbeite mich gerade erst ein...

danke dir!!
freda

homtata
Beiträge: 1142
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: Geteilte Navigation (Split Navigation) 4.8.15

Beitrag von homtata » Do 15. Sep 2011, 09:52

Hallo Freda,

ich kann dir hier nur Grobanleitung geben, weil das in die absoluten Grundkenntnisse von Contenido gehört...
Also:
Du legst zwei neue Module an. Vergib eigene Namen, Typ ist jeweils "Navigation". Den Eingabebereich lass leer. In den jeweiligen Outputbereich ("Ausgabe") schreibst du den gezeigten Code pro Modul.
Dann musst du ins vorhandene Layout. Den im Standardlayout vorhandenen Container für die Hauptnavigation passt du an auf den Namen des neuen Modul 1. Dann kopierst du den Container (mit neuer Nummer) an die Stelle, wo später die Untermenüs erscheinen sollen, und trägst dort den Namen für das Modul 2 ein.
Den Rest (Optik, Verhalten usw.) musst dann natürlich per CSS steuern.

LG

Freda
Beiträge: 80
Registriert: Di 13. Sep 2011, 18:21
Kontaktdaten:

Re: Geteilte Navigation (Split Navigation) 4.8.15

Beitrag von Freda » Do 15. Sep 2011, 10:01

hi homtata,
danke, müsste ja irgendwie gehen hoffe ich !!
freda

diefl
Beiträge: 34
Registriert: Mi 29. Jun 2005, 16:04
Kontaktdaten:

Re: Geteilte Navigation (Split Navigation) 4.8.15

Beitrag von diefl » Fr 21. Okt 2011, 17:13

Hi,

wie müsste denn dann das template ausehen, welches dein Modul verwendet; also wie heissen die Marker?
(navigation_sub.html)

Danke!

diefl
Beiträge: 34
Registriert: Mi 29. Jun 2005, 16:04
Kontaktdaten:

Re: Geteilte Navigation (Split Navigation) 4.8.15

Beitrag von diefl » Fr 21. Okt 2011, 18:33

Sorry, hat sich erledigt; natürlich die mArker aus dem Standard-Modul

diefl
Beiträge: 34
Registriert: Mi 29. Jun 2005, 16:04
Kontaktdaten:

Re: Geteilte Navigation (Split Navigation) 4.8.15

Beitrag von diefl » Mo 24. Okt 2011, 11:50

Hallo,

wie bekommen ich es hin, das die Unternavigation als verschachtelte liste ausgegeben wird?
Also nicht

Code: Alles auswählen

"
li class="...level1">Navi Level 2</li>
<li class="...level1">Navi Level 2</li>
"<li class="...level2">Navi Level3</li>
...usw..
sondern

Code: Alles auswählen

<ul>
<li>Navi Level 2</li>
<li>Navi Level 2
<ul><li>Navi Level 3</li></ul>
</li>
</ul>
Oder von mir aus auch jeweils in einem eigenen<ul></ul>?

Danke!

heinoD
Beiträge: 3
Registriert: Mo 18. Mär 2013, 21:13
Kontaktdaten:

Re: Geteilte Navigation (Split Navigation) 4.8.15

Beitrag von heinoD » Mi 20. Mär 2013, 17:50

diefl hat geschrieben:Hi,

wie müsste denn dann das template ausehen, welches dein Modul verwendet; also wie heissen die Marker?
(navigation_sub.html)

Danke!
Sry. Welche Variable wird denn in der modul_template.html eingetragen?

homtata
Beiträge: 1142
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: Geteilte Navigation (Split Navigation) 4.8.15

Beitrag von homtata » Mi 20. Mär 2013, 22:57

hallo heinoD,

nun, beide Navigationsmodule produzieren ja die gleichen Variablentypen für die Modul-Templates - daher ist navigation_sub.html im Prinzip nur eine auf deine Bedürfnisse angepasste Variante/Kopie der navigation_standard.html. Alles, was in der navigation_standard.html dynamisch ausgegeben werden kann, ist im Prinzip auch in der navigation_sub.html machbar.
Hilft dir das weiter?

heinoD
Beiträge: 3
Registriert: Mo 18. Mär 2013, 21:13
Kontaktdaten:

Re: Geteilte Navigation (Split Navigation) 4.8.15

Beitrag von heinoD » Mo 25. Mär 2013, 18:26

Danke Dir erstmal für Deine Antwort.
Die navigation_standard.html habe ich nicht. Daher weiss ich auch nicht, was dort wie/ wo stehen muss.
Könntest Du bitte mal den Inhalt als Beispiel posten?

Vielen Dank

homtata
Beiträge: 1142
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: Geteilte Navigation (Split Navigation) 4.8.15

Beitrag von homtata » Mo 25. Mär 2013, 21:19

machen wirs anders.. in meiner navigation_sub.html steht drin:

Code: Alles auswählen

<ul>
	<!-- BEGIN:BLOCK -->
	<li class="navmainStandardLevel_{css_level}{css_first_item}{css_last_item}{css_active_item}">
		<a href="{url}" title="{name}" class="navmainStandardLevel_{css_level}{css_first_item}{css_last_item}{css_active_item}">{name}</a>
	</li>
	<!-- END:BLOCK -->
</ul>
lg

heinoD
Beiträge: 3
Registriert: Mo 18. Mär 2013, 21:13
Kontaktdaten:

Re: Geteilte Navigation (Split Navigation) 4.8.15

Beitrag von heinoD » Mi 27. Mär 2013, 17:59

Hallo homtata

Vielen Dank! Es hat super funktioniert. Vielen Dank nochmal für Deine Mühe.

bigAngel007
Beiträge: 48
Registriert: So 16. Aug 2009, 17:43
Kontaktdaten:

Re: Geteilte Navigation (Split Navigation) 4.8.15

Beitrag von bigAngel007 » Sa 13. Apr 2013, 19:38

Hallo

Habe es auch probiert und es klapppt gut. Habe nun eine Haupt Navi Leiste und links kommt die Sub-Navi.
Allerdings:

Wie kann ich den Level 3 mit einbauen? Das heisst, das sich wenn ich in der Sub Navi noch einen Unterpunkt habe anzeigen lassen?
In der css habe ich die Level vorbereitet. Kategorien sind da, aber werden im Level 3 nicht angezeigt.


Bitte um Hilfe. Danke

bigAngel007
Beiträge: 48
Registriert: So 16. Aug 2009, 17:43
Kontaktdaten:

Re: Geteilte Navigation (Split Navigation) 4.8.15

Beitrag von bigAngel007 » Sa 13. Apr 2013, 20:02

noch eine Frage

Ist es eigentlich generell möglich einen Punkt (Navigationspunkt) in der Haupt-Navi z.b. blau zu machen, den nächsten rot.... und dann in der Sub-Navi ebenfalls die passenden Farben anzupassen?

Also alle Punkte/Bereiche bekommen ihre eigene Farbe.

Für Infos bin ich dankbar

homtata
Beiträge: 1142
Registriert: Mi 14. Jan 2004, 14:41
Kontaktdaten:

Re: Geteilte Navigation (Split Navigation) 4.8.15

Beitrag von homtata » Sa 13. Apr 2013, 21:36

da wirds ein bissel komplizierter. Ich versuchs mal zusammenzustellen, aber kein Anspruch auf Vollständigkeit, eher so eine Art "Bastelanleitung".

Erstmal solltest du beim Erstellen der Navigation jedem Listenelement mitgeben, zu welcher Kategorie (idcat) es gehört.
Dafür musst du den Modulcode der Navigationen (Main/Sub) erweitern, und zwar an folgender Stelle die zweite Zeile ergänzen:

Code: Alles auswählen

        foreach ($oSubCategories as $oSubCategory) {
                $tpl->set( "d", "idcat", $oSubCategory->getIdCat() );
                Contenido_NavMain_Util::loopCats($oSubCategory, $oFeNav, $tpl, $cfg, $lang, $aLevelInfo, intval($idcat), $aDepthInfo);
        }
Du musst dann im HTML-Template eben dem Listenpunkt noch eine Klasse mitgeben (evtl. auch dem a-tag für volle Flexibilität), also sowas wie

Code: Alles auswählen

<li class="cat{idcat}"><a class="cat{idcat}">Naviname</a></li>
Damit kannst du die Hauptnavi schonmal mit den unterschiedlichen class-Infos unterschiedlich formatierten. ".cat1" und ".cat2" sind ja dann über CSS unterschiedlich ansprechbar.

Für die Subnavi klappt das noch nicht, denn diese "weiß" ja noch nicht, zu welcher Hauptnavigation sie gehört.

Ich habe das in einem Projekt so gelöst, dass ich im Subnavi-Modul die zugehörige ParentID berechne, die dann wiederum an das Modul-Template der Subnavi übergeben wird und dort z.B. dem umgebenden <ul>-Tag als class hinzugefügt wird. Der folgende Code muss aber dringend an deine Gegebenheiten angepasst werden, bitte nicht 1:1 übernehmen:

Code: Alles auswählen

<?php
/* Subnavigation berechnen */

if (!isset($db)) {
    $db = new DB_Contenido();
}
if (!isset($tpl)) {
    $tpl = new Template();
}
$tpl->reset();

cInclude('classes', 'Contenido_FrontendNavigation/Contenido_FrontendNavigation.class.php');
cInclude('frontend', 'includes/Util/Modules/Contenido_NavMainSub_Util.class.php');

$iStartIdcat = getEffectiveSetting('navigation', 'idcat-kurse', 1);
$iSelectedDepth = getEffectiveSetting('navigation', 'level-depth', 10);

/* Dann hier die Schleife einbauen, ist noch nicht richtig hier */
cInclude("classes", "class.category.php");
cInclude("classes", "class.cat.php");

$maincatid  = $idcat;
$maincatid2 = $idcat;

// Zunächst Level der aktuellen Kategorie ermitteln
$oFeNav2 = new Contenido_FrontendNavigation($db, $cfg, $client, $lang, $cfgClient);
$idcatlevel = ($oFeNav2->getLevel($idcat));

for ( $i=0; $i < $idcatlevel; $i++) {
    $oActualCategory2 = new CategoryItem($maincatid2);
    $maincatid2 = $oActualCategory2->get("parentid");
}

if ( $maincatid2 == $iStartIdcat ) {
while ( $maincatid !=  $iStartIdcat ) {
    $iParentID = $maincatid;    // bewahre den alten Wert, falls der neue die oberste Kategorie ist
    $oActualCategory = new CategoryItem($maincatid);
    $maincatid = $oActualCategory->get("parentid");
}

/* so lange schleifen, bis $maincatid == $iStartIdcat ist, dann war der Wert von $iParentID der korrekte, den also jeweils speichern */

/* Dann die zweite Ausgabe: */

if ($iParentID > 0 && $maincatid == $iStartIdcat && $idcatlevel >= 1 ) {
    $oFeNav = new Contenido_FrontendNavigation($db, $cfg, $client, $lang, $cfgClient);
    $oFeNav->setAuth($auth);
    $oFeNav->setRootCat($iParentID);
    $oSubCategories = $oFeNav->getSubCategories($iParentID, true, true, 1);
    // see if there are any subcategories to display
    if ($oSubCategories->count() > 0) {
        $aLevelInfo = array();
        $aDepthInfo = array();
        $aDepthInfo[0] = 0;
        $aDepthInfo[1] = $iSelectedDepth;
        foreach ($oSubCategories as $oSubCategory) {
            Contenido_NavMainSub_Util::loopCats($oSubCategory, $oFeNav, $tpl, $cfg, $lang, $aLevelInfo, intval($idcat), $aDepthInfo);
        }
        // jetzt noch eine Kategorie höher gehen, um die Hauptnavigations-catid zu finden:
        $oActualCategory = new CategoryItem($maincatid);
        $rootcatid = $oActualCategory->get("parentid");

        $tpl->set('s', 'coursecatid', $iParentID );
        $tpl->generate('templates/navigation_sub.html');
    }
} else {
    echo '<div id="navigation_sub">&nbsp;</div>';
}
} // if actualid-ende
?>
Im HTML-Template brauchst du dann ungefähr folgendes:

Code: Alles auswählen

<div id="navigation_sub">
<ul class="cat{coursecatid}">
    <!-- BEGIN:BLOCK -->
    <li class="navmainStandardLevel_{css_level}{css_first_item}{css_last_item}{css_active_item}">
        <a href="{url}" title="{titlename}" class="navmainStandardLevel_{css_level}{css_first_item}{css_last_item}{css_active_item}">{showname}</a>
    </li>
    <!-- END:BLOCK -->
</ul>
</div>
Jetzt kannst du wiederum über die class-Info ".cat1" usw. die diversen Subnavis unterschiedlich formatieren.

Ok?

Gesperrt