Dynamische Navigation in CPO4 erklaert:

Allgemeine Diskussionen zu ConPresso 4. Handhabung, Möglichkeiten, Verständnisfragen.
Achtung: Bitte benutzt wenn möglich die themenspezifischen Foren!
Benutzeravatar
balu
ConPresso-Entwickler
Beiträge: 1748
Registriert: 01.01.1970 01:00
Hat sich bedankt: 81 Mal
Danksagung erhalten: 133 Mal

Dynamische Navigation in CPO4 erklaert:

Beitrag von balu »

Also gut, dann wollen wir mal auf die schnelle ein bischen zaubern:

Die dynamische Navigation laesst sich in ConPresso4 ueber ein einziges Wunderwerk an rekursiver Funktion ausgeben . Ich selber verstehe die Funktion nicht mehr, sie muss also technisch ein Meisterwerk sein ;).

Alles was ich jetzt schreibe ist zur Geisterstunde aus meinem Kopf gefallen und wurde nicht getestet. Sollte bei den Beispielen ein Problem auftauchen, haben die Geister mir einen Streich gespielt :).

Diese Funktion befindet sich in der Datei _include/printnavigation.inc.php, die Ihr z.B. am Anfang im globalen Header einbinden muesst - in den folgenden Versionen von ConPresso wird das vermutlich automatisch passieren:

Code: Alles auswählen

include_once(CPO_BASEDIR.'_include/printnavigation.inc.php');
Dann hat man zwei Funktionen zur Verfuegung:

Code: Alles auswählen

array getActiveElements(array $navi, int $activeRubric)
Die Funktion liefert ein Array mit der Zuordnung Ebenen => RubrikIDs des gerade aktuellen Navigationspfades. Das funktioniert natuerlich nur, wenn eine Rubrik nicht in verschiedenen Ebenen vorkommt.

Parameter:

$navi
Hier kann man das Navigationsarray übergeben, das man mit getNavigation() bekommen kann. Wird der Defaultwert '' uebergeben, lädt sich diese Funktion diese Daten alleine.

$activeRubric
Die aktuell aktive Rubrik. Wird der Defaultwert 0 übergeben, so wird automatisch die aktive Rubrik genommen ($GLOBALS['cpoRubric']['id'];)

Hiermit kann man z.B. ein Breadcrumb-Menue ausgeben:

Code: Alles auswählen

$aE = getActiveElements();
foreach ($aE as $k=>$v) {
    if ($k=='X') continue; // dieses Element ist "Ebene 0", die es natuerlich nicht gibt.
    echo "Ebene $k: Rubrik: $v >> ";
}
Natuerlich sollte man aus der Rubrik-ID noch den richtigen Namen machen ;).

Code: Alles auswählen

boolean printNavigation(array $navi, int $activeRubric, int $levels, int $parent, boolean $activeOnly)
Das eigentlicher Herzstueck der Datei gibt die Navigation in Form einer HTML-Liste aus.

Parameter:
$navi
Hier kann man das Navigationsarray übergeben, das man mit getNavigation() bekommen kann. Wird der Defaultwert '' uebergeben, lädt sich diese Funktion diese Daten alleine.

$activeRubric
Die aktuell aktive Rubrik. Wird der Defaultwert 0 übergeben, so wird automatisch die aktive Rubrik genommen ($GLOBALS['cpoRubric']['id'];)

$levels
Wie viele Ebenen sollen angezeigt werden. Der Standardwert ist 99 - wer mehr Ebenen hat, hat ein Problem mit seiner Navigation ;)

$parent
Welches ist das Elternelement der auszugebenden Navigation? Der Defaultwert von "0" faengt in der Wurzel der Navigation an. Wird hier z.B. eine andere Navigations-Id angegeben, gibt ConPresso den Inhalt erst ab diesem Punkt aus. Das kann man z.B. nutzen, wenn man ganz oben zwei Ebenen "Deutsch" und "Englisch" hat und je nach Sprache eine andere Navigation ausgeben moechte.

$activeOnly
Wird dieser Wert auf "true" gesetzt, werden nur die aktuell "aufgeklappten" Ebenen ausgegeben. wenn andere Ebenen auch Unterpunte haben, werden diese nicht angezeigt. Der Standardwert hier ist "false".

$target
Dieser Wert erlaubt es, die Ziele der Navigationslinks in einen anderen Frame zu verlinken.

Beispiele:
Ausgabe der kompletten Navigationsstruktur:

Code: Alles auswählen

printNavigation();
Ausgabe nur der ersten Ebene (Hauptmenue einer Website):

Code: Alles auswählen

printNavigation('', 0, 1, 0, false);
Ausgabe nur des aktuell aufgeklappten Verzeichnisbaumes:

Code: Alles auswählen

printNavigation('', 0, 99, 0, true);
Die Navigation wird als verschachtelte <ul>-Liste ausgegeben. Diese laesst sich mit den passenden CSS-Definitionen in jeder erdenklichen Form formatieren.

Hierzu werden natuerlich spaeter noch einige Beispiele folgen. Aber fuers erste hoffe ich Euch reicht dieses kleine Sammelsurium als Start fuer die Ausgabe eigener Navigationen.

Balu
Zuletzt geändert von balu am 01.02.2006 09:22, insgesamt 1-mal geändert.
dnimtsch

Beitrag von dnimtsch »

balu hat geschrieben:

> $parent
> Welches ist das Elternelement der auszugebenden Navigation?
> Der Defaultwert von "0" faengt in der Wurzel der Navigation an.
> Wird hier z.B. eine andere Navigations-Id angegeben, gibt
> ConPresso den Inhalt erst ab diesem Punkt aus. Das kann man
> z.B. nutzen, wenn man ganz oben zwei Ebenen "Deutsch" und
> "Englisch" hat und je nach Sprache eine andere Navigation
> ausgeben moechte.


Hier muss noch ein Bug im Code sein! Ich habe drei root Ebenen (de, en, pl), darunter jeweils die Hauptrubriken. Ich lasse mir das Menu mit "printNavigation('', 0, 2, 0, false);" ausgeben. Alles roger, ich sehe die zwei Ebenen.

Nicht so bei "printNavigation('', 0, 2, 1, false);". Hier wird keine Ebene ausgegeben, sollte die zweite Ebene unter den Sprachenebene sein. :((

Mit freundlichen Grüssen,

Daniel Nimtsch
dnimtsch

Beitrag von dnimtsch »

Achso, verwende natürlich ConPresso 4.0.1
Marko

Beitrag von Marko »

balu hat geschrieben:

> Natuerlich sollte man aus der Rubrik-ID noch den richtigen
> Namen machen ;).

Das Breadcrumb-Skript funktioniert wie erwartet. Als php & conPresso Neuling fällt mir allerdings keine elegante Lösung ein, wie man an die Rubriknamen rankommt. Hat da jemand eine Idee?

Marko
dnimtsch

Beitrag von dnimtsch »

Wegen meinem Problem oben nochmal einen Link für die Testdomain:

http://www.nady.de/

Viele Grüsse,

Daniel Nimtsch
Benutzeravatar
Matthias Baum
ConPresso-User
Beiträge: 26
Registriert: 01.01.1970 01:00
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Beitrag von Matthias Baum »

Gibt es eine Möglichkeit in CPO4.0.1 auszulesen, was die aktuelle $cpoRubric['id'] für Eltern hat?
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7338
Registriert: 01.01.1970 01:00
Hat sich bedankt: 109 Mal
Danksagung erhalten: 930 Mal
Kontaktdaten:

Beitrag von MarkusR »

so zum Beispiel:

Code: Alles auswählen

function getParent($actRubric) {
$navArray = getNavigation();
// erstmal die Rubrik selbst suchen
$rubrik_left = '';
$rubrik_right = '';
$rubrik_level = '';
for ($ip;$ip<count($navArray);$ip++) {
if ($actRubric == $navArray[$ip]['rubric']['id'] OR $actRubric == $navArray[$ip]['rubric']['name']) {
$rubrik_left = $navArray[$ip]['l'];
$rubrik_right = $navArray[$ip]['r'];
$rubrik_level = $navArray[$ip]['level'];
}
}
// Übergeordneten Eintrag suchen
foreach ($navArray as $key=>$value) {
if (($value['level'] == $rubrik_level-1) AND ($value['l'] < $rubrik_left) AND ($value['r'] > $rubrik_right)) {
$parentID = $value['rubric']['id'];
}
}
return $parentID;
}
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
dnimtsch

Beitrag von dnimtsch »

balu hat geschrieben:

> $parent
> Welches ist das Elternelement der auszugebenden Navigation?
> Der Defaultwert von "0" faengt in der Wurzel der Navigation an.
> Wird hier z.B. eine andere Navigations-Id angegeben, gibt
> ConPresso den Inhalt erst ab diesem Punkt aus. Das kann man
> z.B. nutzen, wenn man ganz oben zwei Ebenen "Deutsch" und
> "Englisch" hat und je nach Sprache eine andere Navigation
> ausgeben moechte.

Nehme alles zurück!! Kein Bug im Code! Ich habe nur die Erklärung missverstanden. Man muss die Navigations-Id (z. B. 12) angeben, nicht die Ebene, ab der man die dynamische Navigation angezeigt haben will.

Da die Navigations-Id nun mit der Landessprache wechselt muss man die dynamisch angeben.

Hier ein rudimentäres Beispiel für eine dynamische Navigation mit übergeordneten Landessprachen, die aber nur im Backend angezeigt werden. Die dynamische Navigation zeigt nur die Rubriken der jeweiligen Landessprache an, in der man sich gerade befindet.

z.B. eingebunden in _cfg/global_header.php

Code: Alles auswählen

<?php
include_once(CPO_BASEDIR.'_include/printnavigation.inc.php');

$aE = getActiveElements();
foreach ($aE as $k=>$v) {
if ($k=='1') printNavigation('', 0, 99, $v, false); // wenn "Ebene 1" im Array erreicht, Navigations-Id
// der Landessprache als $parent uebergeben.
}
?>

Nochmal Entschuldigung, Meister Balu!!
Claus

Rubrik-ID

Beitrag von Claus »

Hallo!

Könntet ihr mir mitteilen, ob ich die Einträge in der Tabelle navtree nachträglich ändern kann ohne dass ich irgendetwas durcheinander bringe? ich hätte gerne eine 'neue und logische" Reihenfolge der Rubriken ...


Viele Grüße
Claus
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7338
Registriert: 01.01.1970 01:00
Hat sich bedankt: 109 Mal
Danksagung erhalten: 930 Mal
Kontaktdaten:

Beitrag von MarkusR »

In der Tabelle navtree sollte GAR NICHTS gemacht werden, sondern ausschließlich im Backend über "Navigation bearbeiten".

Dort können die Einträge nach Belieben umgeordnet werden, wenn man zuerst auf Bild klickt, dann hat man die Möglichkeit des Einsortierens mittels Bild, Bild und Bild
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Gast

Beitrag von Gast »

Ja, verstanden. Es ging mir nur um die navigations-id. da komme ich über das backend nich' dran, oder?
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7338
Registriert: 01.01.1970 01:00
Hat sich bedankt: 109 Mal
Danksagung erhalten: 930 Mal
Kontaktdaten:

Beitrag von MarkusR »

Nein.

Und da diese ID nichts mit der Anordnung zu tun hat kannst Du damit lediglich das System zerstören, aber nichts an der Reihenfolge ändern.

Vermutlich möchtest Du gerne, daß Deine Links auf die Rubriken so aussehen:

http://www.deinedomain.tld/_rubric/index.php?rubric=1
dann
http://www.deinedomain.tld/_rubric/index.php?rubric=2
dann
http://www.deinedomain.tld/_rubric/index.php?rubric=3
dann
http://www.deinedomain.tld/_rubric/index.php?rubric=4
dann
http://www.deinedomain.tld/_rubric/index.php?rubric=5
etc.

weils eben schöner aussieht.

Da hilft nur strukturiertes vorausplanendes Arbeiten oder einfach das Verwenden des Rubriknamens statt der Nummer, das macht es noch "logischer"

P.S. Für die Reihenfolge ist nicht die id sondern die Einträge l und r zuständig. Dieses "nested"-System wurde hier von Balu ja schon erklärt.
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Claus

Beitrag von Claus »

... die Seiten können nicht angezeigt werden. Und mit dem Namen? Dat jeht nich'!

printNavigation('', 0, 99, 1.1 Profil, true);

Macht aber nix, dann schreibe ich eben doch die Navigations-id aus der Tabelle ab und verzichte auf die Logik. Vielen Dank! :D
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7338
Registriert: 01.01.1970 01:00
Hat sich bedankt: 109 Mal
Danksagung erhalten: 930 Mal
Kontaktdaten:

Beitrag von MarkusR »

Siehste! :mrgreen:

Kaum zwei mal gefragt und zwei ausführliche Antworten bekommen, schon erhält man den Grund für die Frage, nämlich die Benutzung der Funktion printNavigation().

Die ID selbst sieht man im Backend, wenn man die Maus über die Symbole hält (Statuszeile &id=x).

Würde mich aber dennoch interessieren, wie es für Dich "logisch" wäre...?
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
Gast

Beitrag von Gast »

logisch wäre für mich: sitemap = inhaltsverzeichnis mit durchnummerierung => nummern = navigations-id.

darum zeigt sich mal wieder:
VORHER NACHDENKEN TUT GUT! :wink:


Claus
Antworten