Standard Hauptmenü mit Level-Startpunkt

Alles rund um Module und Plugins in CONTENIDO 4.9.
Antworten
Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Standard Hauptmenü mit Level-Startpunkt

Beitrag von Faar » Di 20. Mai 2014, 08:26

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?
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: Standard Hauptmenü mit Level-Startpunkt

Beitrag von xmurrix » Mi 21. Mai 2014, 05:52

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:

Code: Alles auswählen

$rootIdcat = getEffectiveSetting('navigation_main', 'idcat', 1);
$depth = getEffectiveSetting('navigation_main', 'depth', 3);
Die könnte man z. B. unter Mandanteneinstllungen ändern oder hinzufügen, also "überschreiben". Würde das dir reichen?

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.

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Standard Hauptmenü mit Level-Startpunkt

Beitrag von Faar » Mi 21. Mai 2014, 09:56

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.

Code: Alles auswählen

$rootIdcat = getEffectiveSetting('navigation_main', 'idcat', 1);
$startLevel = getEffectiveSetting('navigation_main', 'level', 1);
$depth = getEffectiveSetting('navigation_main', 'depth', 3);
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
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Standard Hauptmenü mit Level-Startpunkt

Beitrag von Faar » Mi 28. Mai 2014, 10:19

*ping* :roll:
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

mischa.holz
Beiträge: 86
Registriert: Do 28. Jun 2012, 15:30
Wohnort: Darmstadt
Kontaktdaten:

Re: Standard Hauptmenü mit Level-Startpunkt

Beitrag von mischa.holz » Mi 28. Mai 2014, 10:37

  • wurzel
    • kind1
      • kindkind1
      • kindkind2
    • kind2
      • mehrkind1
      • mehrkind2
Du willst also irgendwie alle Kategorien haben, die Kinder von "wurzel" sind und gleichzeitg ein level >= 2 haben?
In dem Beispiel dann also
  • kindkind1
  • kindkind2
  • mehrkind1
  • mehrkind2
Nur damit ich das richtig verstehe... ^.^

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);
Das ist nicht getestet, aber sollte funktionieren... ^.^
CONTENIDO Doku - API Doku - Git Repo - Bug Tracker - CONTENIDO 4.9.4!!
Arbeitet nicht mehr bei 4fb

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Standard Hauptmenü mit Level-Startpunkt

Beitrag von Faar » Mi 28. Mai 2014, 10:59

Moin,
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)
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:

Code: Alles auswählen

        kindkind1 (idcat=5 level=1)
            kindkindkind1 (idcat=5 level=2)
        kindkind2 (idcat=6 level=1)
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" ?
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.

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Standard Hauptmenü mit Level-Startpunkt

Beitrag von Faar » Mi 28. Mai 2014, 11:06

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.
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.

mischa.holz
Beiträge: 86
Registriert: Do 28. Jun 2012, 15:30
Wohnort: Darmstadt
Kontaktdaten:

Re: Standard Hauptmenü mit Level-Startpunkt

Beitrag von mischa.holz » Mi 28. Mai 2014, 11:24

Warum gibts du dann aber nicht einfach als rootIdCat 2 an, nachdem auf eine Kategorie geklickt wurde? Das sollte genau die gleichen Werte liefern...
Faar hat geschrieben:Aber funktioniert das auch bei verschiedenen Level-Vorgaben, also "zeige mir nur Menü ab Level 2" ?
$targetLevel kann natürlich einen beliebigen Wert haben. Zu beachten ist aber, dass die Tiefe immer von der rootIdCat aus zählt.
CONTENIDO Doku - API Doku - Git Repo - Bug Tracker - CONTENIDO 4.9.4!!
Arbeitet nicht mehr bei 4fb

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Standard Hauptmenü mit Level-Startpunkt

Beitrag von Faar » Mi 28. Mai 2014, 11:44

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?

Code: Alles auswählen

$filteredTree = array();
foreach($tree as $cat) {
    if($cat['level'] < $targetLevel) {
        continue;
    }
    $filteredTree[] = $cat;
}
...
$smarty->assign('tree', $filteredTree);
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. :shock:
Wer soll da noch durchblicken und die Struktur erkennen? :motz:
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Standard Hauptmenü mit Level-Startpunkt

Beitrag von Faar » Mi 28. Mai 2014, 11:58

@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 :roll:
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

mischa.holz
Beiträge: 86
Registriert: Do 28. Jun 2012, 15:30
Wohnort: Darmstadt
Kontaktdaten:

Re: Standard Hauptmenü mit Level-Startpunkt

Beitrag von mischa.holz » Mi 28. Mai 2014, 12:29

$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...
CONTENIDO Doku - API Doku - Git Repo - Bug Tracker - CONTENIDO 4.9.4!!
Arbeitet nicht mehr bei 4fb

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Standard Hauptmenü mit Level-Startpunkt

Beitrag von Faar » Mi 28. Mai 2014, 13:59

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.
Ist das nötig für einen Menübaum?
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.
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.
Genau das geht ja so nicht, denn dann hätte ich für das Modul genau eine einzige Subcategorie (idcat = 2) als Startpunkt.
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;
   }
}
Geht sowas?
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

mischa.holz
Beiträge: 86
Registriert: Do 28. Jun 2012, 15:30
Wohnort: Darmstadt
Kontaktdaten:

Re: Standard Hauptmenü mit Level-Startpunkt

Beitrag von mischa.holz » Mi 28. Mai 2014, 14:23

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 ^.^:
CONTENIDO Doku - API Doku - Git Repo - Bug Tracker - CONTENIDO 4.9.4!!
Arbeitet nicht mehr bei 4fb

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

Re: Standard Hauptmenü mit Level-Startpunkt

Beitrag von homtata » Fr 30. Mai 2014, 08:10

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

Faar
Beiträge: 1915
Registriert: Sa 8. Sep 2007, 16:23
Wohnort: Brandenburg
Kontaktdaten:

Re: Standard Hauptmenü mit Level-Startpunkt

Beitrag von Faar » Fr 30. Mai 2014, 08:59

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.
Genau. :)
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.
So ist es. :o
Dies würde zwei Module erfordern
mindestens zwei, im Zweifel auch mal drei (alles schon vorgekommen). 8)
, und dieses Thema haben wir schonmal erfolgreich durchgekaspert:
:shock:

http://forum.contenido.org/viewtopic.php?f=89&t=34020
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.
Das hatte ich versucht, Mischa Holz irgendwie zu erklären ... :?
Und eigentlich sollte das Standardmenü sowas können, finde ich.
Ich will ja nicht :motz:
sondern lieber :mrgreen:

Danke Viktor!
Fliegt der Bauer übers Dach, ist der Wind weißgott nicht schwach.

Antworten