Standard Hauptmenü mit Level-Startpunkt
Standard Hauptmenü mit Level-Startpunkt
Das standard Hauptmenü-Modul von Contenido, Navigation Main, hat keine Subkultur, will sagen, ich kann keinen Level als Startpunkt des Menüs angeben.
idcat geht einzutragen aber nicht z.B. "zeig mir nur Kategorien ab Level 1 bis Tiefe 3 an".
In der Klasse cCategoryHelper fehlt auch jegliche Unterstützung dafür.
Kann das einer nachrüsten?
Oder andere Idee?
idcat geht einzutragen aber nicht z.B. "zeig mir nur Kategorien ab Level 1 bis Tiefe 3 an".
In der Klasse cCategoryHelper fehlt auch jegliche Unterstützung dafür.
Kann das einer nachrüsten?
Oder andere Idee?
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
Re: Standard Hauptmenü mit Level-Startpunkt
Hallo Faar,
hast du es schon mal mit den Einstellungen probiert?
In der cms/data/modules/navigation_main/php/navigation_main_output.php verwendet das Modul folgende Einstellungen:
Die könnte man z. B. unter Mandanteneinstllungen ändern oder hinzufügen, also "überschreiben". Würde das dir reichen?
Gruß
xmurrix
hast du es schon mal mit den Einstellungen probiert?
In der cms/data/modules/navigation_main/php/navigation_main_output.php verwendet das Modul folgende Einstellungen:
Code: Alles auswählen
$rootIdcat = getEffectiveSetting('navigation_main', 'idcat', 1);
$depth = getEffectiveSetting('navigation_main', 'depth', 3);
Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
Re: Standard Hauptmenü mit Level-Startpunkt
Guten Morgen Xmurrix,
nein, das würde nicht reichen, denn ich meine eine dynamische Version.
$rootIdcat ist ok, das sollte so bleiben.
$depth ist auch ok.
Aber eine Art $startLevel fehlt!
z.B.
Der Level beginnt ja bei dem Zähler 0 und damit wäre Level 1 eine Ebene tiefer.
Die Klasse categoryhelper (nicht das Modul) sollte eine Methode bekommen, die dynamisch als erstes ermittelt, welche SubcatIDs vorhanden sind.
Diese Subcats entsprächen dann Level 1.
Und genau davon soll dann der Menübaum erst aufgebaut und angezeigt werden.
Die internen StartIdcats wären dann eben alle diese Subcats die durch $rootIdcat ermittelt wurden.
Und das muss halt dynamisch gehen, weil sonst kann ich gleich ein Menü mit HTML von Hand aufbauen.
Der $tree und alles weitere für die Ausgabe enthielten dann nicht die Menüpunkte der Ebene 0.
Kurzum: Das Menü soll auch erst ab einem bestimmten Level anzeigen können.
So dass man ein horizontales Hauptmenü für den Level 0 machen kann ($rootIdcat=1,$startLevel=0,$depth=1) ,
und ein vertikales Menü mit den restlichen Leveln 1 und 2 ($rootIdcat=1,$startLevel=1,$depth=3) .
Aber halt immer ausgehend von der rootIdcat.
Bei dem Menümodul Navigation Universell ging das wunderbar, da habe ich drei Modul-Teile daraus gemacht und konnte die im Layout setzen wie ich wollte.
Es hatte sogar Ähnlichkeit mit den Möglichkeiten vom Typo3 Menü, auch mit $before und $after Attribute (was Wordpress inzwischen auch ausgebaut hat).
Aber die Navigation Universell läuft ja nur auf 4.8.x und der Entwickler lässt sich hier scheints nicht mehr blicken und solche Möglichkeiten vermisse ich beim neuen Contenido Modul.
Viele Grüße,
Frank
nein, das würde nicht reichen, denn ich meine eine dynamische Version.
$rootIdcat ist ok, das sollte so bleiben.
$depth ist auch ok.
Aber eine Art $startLevel fehlt!
z.B.
Code: Alles auswählen
$rootIdcat = getEffectiveSetting('navigation_main', 'idcat', 1);
$startLevel = getEffectiveSetting('navigation_main', 'level', 1);
$depth = getEffectiveSetting('navigation_main', 'depth', 3);
Die Klasse categoryhelper (nicht das Modul) sollte eine Methode bekommen, die dynamisch als erstes ermittelt, welche SubcatIDs vorhanden sind.
Diese Subcats entsprächen dann Level 1.
Und genau davon soll dann der Menübaum erst aufgebaut und angezeigt werden.
Die internen StartIdcats wären dann eben alle diese Subcats die durch $rootIdcat ermittelt wurden.
Und das muss halt dynamisch gehen, weil sonst kann ich gleich ein Menü mit HTML von Hand aufbauen.
Der $tree und alles weitere für die Ausgabe enthielten dann nicht die Menüpunkte der Ebene 0.
Kurzum: Das Menü soll auch erst ab einem bestimmten Level anzeigen können.
So dass man ein horizontales Hauptmenü für den Level 0 machen kann ($rootIdcat=1,$startLevel=0,$depth=1) ,
und ein vertikales Menü mit den restlichen Leveln 1 und 2 ($rootIdcat=1,$startLevel=1,$depth=3) .
Aber halt immer ausgehend von der rootIdcat.
Bei dem Menümodul Navigation Universell ging das wunderbar, da habe ich drei Modul-Teile daraus gemacht und konnte die im Layout setzen wie ich wollte.
Es hatte sogar Ähnlichkeit mit den Möglichkeiten vom Typo3 Menü, auch mit $before und $after Attribute (was Wordpress inzwischen auch ausgebaut hat).
Aber die Navigation Universell läuft ja nur auf 4.8.x und der Entwickler lässt sich hier scheints nicht mehr blicken und solche Möglichkeiten vermisse ich beim neuen Contenido Modul.
Viele Grüße,
Frank
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
Re: Standard Hauptmenü mit Level-Startpunkt
*ping*
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
-
- Beiträge: 86
- Registriert: Do 28. Jun 2012, 15:30
- Wohnort: Darmstadt
- Kontaktdaten:
Re: Standard Hauptmenü mit Level-Startpunkt
- wurzel
- kind1
- kindkind1
- kindkind2
- kind2
- mehrkind1
- mehrkind2
- kind1
In dem Beispiel dann also
- kindkind1
- kindkind2
- mehrkind1
- mehrkind2
Falls ich das so richtig verstanden habe, sollte es sehr einfach sein einen neuen Parameter in cCategoryHelper::getSubCategories hinzuzufügen und das einzubauen.
Ansonsten kannst du auch das Modul so verändern, dass alles mit einem zu kleinen Level herausgefiltert wird.
Code: Alles auswählen
$filteredTree = array();
foreach($tree as $cat) {
if($cat['level'] < $targetLevel) {
continue;
}
$filteredTree[] = $cat;
}
...
$smarty->assign('tree', $filteredTree);
Re: Standard Hauptmenü mit Level-Startpunkt
Moin,
also damit wir uns richtig verstehen, habe ich es mal leicht geändert:
Wobei level mit $level = $categoryHelper->getCategoryLevel($rootIdcat); ermittelt wurde.
Die RootIdcat ist dann idcat = 1 ( $rootIdcat = getEffectiveSetting('navigation_level', 'idcat', 1); )
Tiefe auch so wie üblich $depth = getEffectiveSetting('navigation_level', 'depth', 3);
Das Menü sollte dann z.B. erst ab Level 1 anzeigen können, also ich klicke kind1 (idcat=2 level=0) an, und bekomme das:
Wenn nichts angeklickt ist oder keine Subcategorien hat, soll auch kein Menü zu sehen sein.
Den Startlevel kann man mit $startLevel = getEffectiveSetting('navigation_level', 'startlevel', 1); ermöglichen, so dass es in den Mandanteneinstellungen eingetragen werden kann.
Wenn ich deinen Code richtig verstehen, wäre $startLevel = $targetLevel.
Aber funktioniert das auch bei verschiedenen Level-Vorgaben, also "zeige mir nur Menü ab Level 2" ?
also damit wir uns richtig verstehen, habe ich es mal leicht geändert:
Code: Alles auswählen
Hauptmenü (idcat=1 level=?)
kind1 (idcat=2 level=0)
kindkind1 (idcat=5 level=1)
kindkindkind1 (idcat=5 level=2)
kindkind2 (idcat=6 level=1)
kind2 (idcat=3 level=0)
mehrkind1 (idcat=7 level=1)
mehrkind2 (idcat=8 level=1)
Topmenü (idcat=4 level=?)
Impressum (idcat=9 level=0)
Datendingens (idcat=10 level=0)
Die RootIdcat ist dann idcat = 1 ( $rootIdcat = getEffectiveSetting('navigation_level', 'idcat', 1); )
Tiefe auch so wie üblich $depth = getEffectiveSetting('navigation_level', 'depth', 3);
Das Menü sollte dann z.B. erst ab Level 1 anzeigen können, also ich klicke kind1 (idcat=2 level=0) an, und bekomme das:
Code: Alles auswählen
kindkind1 (idcat=5 level=1)
kindkindkind1 (idcat=5 level=2)
kindkind2 (idcat=6 level=1)
Den Startlevel kann man mit $startLevel = getEffectiveSetting('navigation_level', 'startlevel', 1); ermöglichen, so dass es in den Mandanteneinstellungen eingetragen werden kann.
Wenn ich deinen Code richtig verstehen, wäre $startLevel = $targetLevel.
Aber funktioniert das auch bei verschiedenen Level-Vorgaben, also "zeige mir nur Menü ab Level 2" ?
Zuletzt geändert von Faar am Mi 28. Mai 2014, 11:07, insgesamt 1-mal geändert.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
Re: Standard Hauptmenü mit Level-Startpunkt
Ich krieg die Formatierung des Menüs als Liste hier im Text nicht hin
Und der Code funktioniert auch nicht, es gibt nur ein leeres Array aus.
Und der Code funktioniert auch nicht, es gibt nur ein leeres Array aus.
Zuletzt geändert von Faar am Mi 28. Mai 2014, 11:29, insgesamt 1-mal geändert.
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
-
- Beiträge: 86
- Registriert: Do 28. Jun 2012, 15:30
- Wohnort: Darmstadt
- Kontaktdaten:
Re: Standard Hauptmenü mit Level-Startpunkt
Warum gibts du dann aber nicht einfach als rootIdCat 2 an, nachdem auf eine Kategorie geklickt wurde? Das sollte genau die gleichen Werte liefern...
$targetLevel kann natürlich einen beliebigen Wert haben. Zu beachten ist aber, dass die Tiefe immer von der rootIdCat aus zählt.Faar hat geschrieben:Aber funktioniert das auch bei verschiedenen Level-Vorgaben, also "zeige mir nur Menü ab Level 2" ?
Re: Standard Hauptmenü mit Level-Startpunkt
Die RootIdcat soll so bleiben wie es ist, denn der Baum soll sich von dieser Root aus (im Beispiel idcat=1) erstrecken.
Wie würde denn z.B. das Menü aussehen, wenn ich mich in der Seite mit idcat = 7 befinde und $rootidcat = 2 angeben würde?
Oder angenommen man könnte das über eine ParentID steuern, würde dann in dem Menü auch der Bereich Topmenü angezeigt werden?
Es soll schon so sein, dass man mit der RootIdcat den Menübereich (Hauptkategorie) an gibt, von da aus soll alles starten.
Nur angezeigt sollen halt im Falle nur z.B. Die Subkategorien von kind1 (idcat2 levl0), wenn ich mich in oder auf einer Seite diesem Bereich befinde.
Befinde ich mich in Seite kind2 (idcat=3 level=0) oder mehrkind1 (idcat=7 level=1) oder mehrkind2 (idcat=8 level=1) soll dann eben nur das Menü für diesen Kategorie-Bereich gezeigt werden.
Die Idee mit dem Filtern ist schon richtig, glaube ich.
Ich hatte gedacht, dass man vielleicht zuerst die Subkategorien ermittelt und dann mit if(in_array()==$subcat)$tree = ... weiter macht.
Vielleicht geht es auch über den Level, also dass man if($level >=$startlevel)... als Filter nimmt.
Nur, was weist man da zu?
Ergibt bei mir schon mal ein leeres Array, also nix.
$cat kann es also nicht sein.
Und habt ihr schon einmal in eurem Beispielmandanten print_r($tree) gemacht?
...das ergibt bei mir gefühlt 100.000 Zeilen Array-Code.
Wer soll da noch durchblicken und die Struktur erkennen?
Wie würde denn z.B. das Menü aussehen, wenn ich mich in der Seite mit idcat = 7 befinde und $rootidcat = 2 angeben würde?
Oder angenommen man könnte das über eine ParentID steuern, würde dann in dem Menü auch der Bereich Topmenü angezeigt werden?
Es soll schon so sein, dass man mit der RootIdcat den Menübereich (Hauptkategorie) an gibt, von da aus soll alles starten.
Nur angezeigt sollen halt im Falle nur z.B. Die Subkategorien von kind1 (idcat2 levl0), wenn ich mich in oder auf einer Seite diesem Bereich befinde.
Befinde ich mich in Seite kind2 (idcat=3 level=0) oder mehrkind1 (idcat=7 level=1) oder mehrkind2 (idcat=8 level=1) soll dann eben nur das Menü für diesen Kategorie-Bereich gezeigt werden.
Die Idee mit dem Filtern ist schon richtig, glaube ich.
Ich hatte gedacht, dass man vielleicht zuerst die Subkategorien ermittelt und dann mit if(in_array()==$subcat)$tree = ... weiter macht.
Vielleicht geht es auch über den Level, also dass man if($level >=$startlevel)... als Filter nimmt.
Nur, was weist man da zu?
Code: Alles auswählen
$filteredTree = array();
foreach($tree as $cat) {
if($cat['level'] < $targetLevel) {
continue;
}
$filteredTree[] = $cat;
}
...
$smarty->assign('tree', $filteredTree);
$cat kann es also nicht sein.
Und habt ihr schon einmal in eurem Beispielmandanten print_r($tree) gemacht?
...das ergibt bei mir gefühlt 100.000 Zeilen Array-Code.
Wer soll da noch durchblicken und die Struktur erkennen?
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
Re: Standard Hauptmenü mit Level-Startpunkt
@mischa.holz
Das $tree enthält scheints Objekte und ist kein Array, das wird mit foreach() kaum so einfach funktionieren (daher war mein Array wohl leer).
Vielleicht wäre es an dieser Stelle mal ganz gut, wenn man diese category.helper Klasse und Dinge wie den $tree in der Doku genauer (mit Beispielen) beschreiben würde, damit man weiß, was man damit alles auslesen und machen kann.
Wahrscheinlich ist schon alles da damit es funktioniert wie ich meine, aber man muss die Daten irgendwie richtig aufgereiht bekommen.
Oder es fehlt noch eine Methode namens startlevel
Das $tree enthält scheints Objekte und ist kein Array, das wird mit foreach() kaum so einfach funktionieren (daher war mein Array wohl leer).
Vielleicht wäre es an dieser Stelle mal ganz gut, wenn man diese category.helper Klasse und Dinge wie den $tree in der Doku genauer (mit Beispielen) beschreiben würde, damit man weiß, was man damit alles auslesen und machen kann.
Wahrscheinlich ist schon alles da damit es funktioniert wie ich meine, aber man muss die Daten irgendwie richtig aufgereiht bekommen.
Oder es fehlt noch eine Methode namens startlevel
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
-
- Beiträge: 86
- Registriert: Do 28. Jun 2012, 15:30
- Wohnort: Darmstadt
- Kontaktdaten:
Re: Standard Hauptmenü mit Level-Startpunkt
$tree ist natürlich ein Baum deswegen wird foreach nix... ^.^;
Der Grund für die lange Ausgabe, ist, dass es viele Kategorien gibt und jede Kategorie mit ihrem cApiCategory Objekt in diesem Baum steckt, welche wiederum die Datenbank als property haben usw.. Viele Objekte, die da irgendwie drinhängen.
Um das gleiche Ergebnis aus deinem Beispiel zu erhalten könntest du aber auch einfach getSubCategories(2); benutzen. Damit wird das Level von der Kategorie 2 ja zum Startlevel. Anstatt die rootIdCat von Mandanteneinstellungen zu bestimmen kannst du dann einfach cRegistry::getCategoryId() nehmen z.B.
Mit der Filterfunktion würdest du alle Kategorien, die auf dem gleichen Level sind und einen beliebigen gleichen Parent haben, erhalten. Ich glaube nicht, dass das ist was du willst...
Der Grund für die lange Ausgabe, ist, dass es viele Kategorien gibt und jede Kategorie mit ihrem cApiCategory Objekt in diesem Baum steckt, welche wiederum die Datenbank als property haben usw.. Viele Objekte, die da irgendwie drinhängen.
Um das gleiche Ergebnis aus deinem Beispiel zu erhalten könntest du aber auch einfach getSubCategories(2); benutzen. Damit wird das Level von der Kategorie 2 ja zum Startlevel. Anstatt die rootIdCat von Mandanteneinstellungen zu bestimmen kannst du dann einfach cRegistry::getCategoryId() nehmen z.B.
Mit der Filterfunktion würdest du alle Kategorien, die auf dem gleichen Level sind und einen beliebigen gleichen Parent haben, erhalten. Ich glaube nicht, dass das ist was du willst...
Re: Standard Hauptmenü mit Level-Startpunkt
Ist das nötig für einen Menübaum?mischa.holz_4fb hat geschrieben:Der Grund für die lange Ausgabe, ist, dass es viele Kategorien gibt und jede Kategorie mit ihrem cApiCategory Objekt in diesem Baum steckt, welche wiederum die Datenbank als property haben usw.. Viele Objekte, die da irgendwie drinhängen.
Könntet ihr nicht einfach z.B. eine VIEW in der Datenbank erzeugen, die nur das Menü betreffende Daten enthält und die dann mit einer einfachen Abfrage das Menü liefert?
Mit dem $tree schießt ihr mit einer Phalanx an Kanonen auf einen einzigen Spatzen, hab ich das Gefühl.
Genau das geht ja so nicht, denn dann hätte ich für das Modul genau eine einzige Subcategorie (idcat = 2) als Startpunkt.Um das gleiche Ergebnis aus deinem Beispiel zu erhalten könntest du aber auch einfach getSubCategories(2); benutzen. Damit wird das Level von der Kategorie 2 ja zum Startlevel. Anstatt die rootIdCat von Mandanteneinstellungen zu bestimmen kannst du dann einfach cRegistry::getCategoryId() nehmen z.B.
Es soll aber auch automatisch für die Subcats von Kategorie mit idcat = 3 gelten, da diese Kategorie auch zum Baum der Hauptkategorie mit idcat = 1 gehört.
Und eventuell weiteren Kind-Kategorien der Hauptkategorie 1.
Wichtig ist, dass der Baum von nur dieser Hauptkategorie aus geht, aber die Anzeige nur ab einem bestimmten Level beginnt.
Code: Alles auswählen
startlevel = 2;
if(startlevel){
if(level <= startlevel){
zeige nix;
}else{
zeige;
}
}
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.
-
- Beiträge: 86
- Registriert: Do 28. Jun 2012, 15:30
- Wohnort: Darmstadt
- Kontaktdaten:
Re: Standard Hauptmenü mit Level-Startpunkt
hmm.. Ich glaube ich verstehe irgendwas falsch hier xD
Aber egal, zu deiner letzten Frage: Ja das sollte definitiv gehen. Ich hab mich noch etwas länger damit beschäftigt und es wäre etwas schwierig die Lösung in cCategoryHelper zu integrieren.
Was du aber stattdessen machen kannst ist das Smarty Template bearbeiten und da eine if Abfrage einbauen. Das Template ist bereits rekursiv von daher solltest du alle Kategorien, die du haben willst bekommen können. Wie genau kann ich aber auch nicht so auf Anhieb sagen, da ich mich mit Smarty nicht so besonders gut auskenne ^.^:
Aber egal, zu deiner letzten Frage: Ja das sollte definitiv gehen. Ich hab mich noch etwas länger damit beschäftigt und es wäre etwas schwierig die Lösung in cCategoryHelper zu integrieren.
Was du aber stattdessen machen kannst ist das Smarty Template bearbeiten und da eine if Abfrage einbauen. Das Template ist bereits rekursiv von daher solltest du alle Kategorien, die du haben willst bekommen können. Wie genau kann ich aber auch nicht so auf Anhieb sagen, da ich mich mit Smarty nicht so besonders gut auskenne ^.^:
Re: Standard Hauptmenü mit Level-Startpunkt
Hallo,
mal ganz blöd gefragt, wenn du schon Navigation Universell erwähnst: Es klingt so, als suchst du das, was wir hier immer wieder "geteilte Hauptnavigation" oder "Split Navigation" nennen.
Also eine Art Hauptnavi plus eine davon abhängige Subnavi, die man aber an einer anderen Stelle einfügen können soll und örtlich von der Hauptnavi nicht abhängt.
Dies würde zwei Module erfordern, und dieses Thema haben wir schonmal erfolgreich durchgekaspert:
http://forum.contenido.org/viewtopic.php?f=89&t=34020
Da gehts für die Subnavi genau um das Thema: erkenne, ob du Teil eines Hauptzweiges bist, auf welchem Level du hängst, und wenn du IRGENDWAS anderes als das obere Level bist, dann blende die zugehörige Subnavi ein.
LG
Viktor
mal ganz blöd gefragt, wenn du schon Navigation Universell erwähnst: Es klingt so, als suchst du das, was wir hier immer wieder "geteilte Hauptnavigation" oder "Split Navigation" nennen.
Also eine Art Hauptnavi plus eine davon abhängige Subnavi, die man aber an einer anderen Stelle einfügen können soll und örtlich von der Hauptnavi nicht abhängt.
Dies würde zwei Module erfordern, und dieses Thema haben wir schonmal erfolgreich durchgekaspert:
http://forum.contenido.org/viewtopic.php?f=89&t=34020
Da gehts für die Subnavi genau um das Thema: erkenne, ob du Teil eines Hauptzweiges bist, auf welchem Level du hängst, und wenn du IRGENDWAS anderes als das obere Level bist, dann blende die zugehörige Subnavi ein.
LG
Viktor
Re: Standard Hauptmenü mit Level-Startpunkt
Genau.homtata hat geschrieben:Hallo,
mal ganz blöd gefragt, wenn du schon Navigation Universell erwähnst: Es klingt so, als suchst du das, was wir hier immer wieder "geteilte Hauptnavigation" oder "Split Navigation" nennen.
So ist es.Also eine Art Hauptnavi plus eine davon abhängige Subnavi, die man aber an einer anderen Stelle einfügen können soll und örtlich von der Hauptnavi nicht abhängt.
mindestens zwei, im Zweifel auch mal drei (alles schon vorgekommen).Dies würde zwei Module erfordern
, und dieses Thema haben wir schonmal erfolgreich durchgekaspert:
http://forum.contenido.org/viewtopic.php?f=89&t=34020
Das hatte ich versucht, Mischa Holz irgendwie zu erklären ...erkenne, ob du Teil eines Hauptzweiges bist, auf welchem Level du hängst, und wenn du IRGENDWAS anderes als das obere Level bist, dann blende die zugehörige Subnavi ein.
Und eigentlich sollte das Standardmenü sowas können, finde ich.
Ich will ja nicht
sondern lieber
Danke Viktor!
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.