Menü taglib-modul

Im Entwickler-Forum können Implementierungsdetails sowie Alternativen der Umsetzung diskutiert werden. // Here, developers can discuss implementation details of features of their projects.
Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Menü taglib-modul

Beitrag von Screeze » 14.08.2009, 19:19:07

Ich hab grade festgestellt, dass es nicht unpraktisch wäre eine art taglib-modul für Menüs zu haben.
Dementsprechend werde ich das die Tage mal umsetzen.
ich wollte allerdings vorneweg mal wissen, was für anforderungen das erfüllen sollte eurer Meinung nach, ich werds dann wieder veröffentlichen.

Meine Idee wäre wie folgt:
Die Menüs werden auf einer datenbank basierendend erstellt.
Tabellenstruktur würd ich mir so vorstellen:

Code: Alles auswählen

Id | groupId | sort | url | parameter | text
url und parameter getrennt, damit der Link erst beim aufruf zusammengesetzt wird, um urlrewriting on/off zu unterstützen.

Text wird so ne art platzhalter.
Es wird eine Sprachendatei gefordert sein, in der dann je nach aktueller Sprache anhand des eintrags in text die Beschriftung für die Sprache rausgesucht wird.
also z.b.:

Code: Alles auswählen

[de]
home = "Hauptseite"
impressum = "Impressum"
guestbook = "Gästebuch"

[en]
home = "Home"
impressum = "Impressum"
guestbook = "Guestbook"
einbinden des Menüs in eine Seite funktioniert dann einfach über taglib z.b. so:

Code: Alles auswählen

<html:addtaglib namespace="modules::screezeMenu::pres::taglib" prefix="screeze" class="menu" />
<screeze:menu groupId="2" />
Damit das Menü problemlos an eigene Bedürfnisse angepasst werden kann, wird es per template zusammengesetzt, dann sollte es für jeden Zweck nutzbar sein.


Noch jemand vorschläge/Einwände?
Wird ein management benötigt, oder meint ihr es ist zumutbar die paar zeilen in der datenbank manuell zu verwalten?

Screeze

edit: ne sortierfunktion wär praktisch... habs mal in die datenbankstruktur eingefügt,
in sort können dann zahlen eingegeben werden, über die sortiert wird aufsteigend beim abrufen.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Menü taglib-modul

Beitrag von dr.e. » 14.08.2009, 23:14:20

Hallo Screeze,

unterhalte dich mal mit Megger, er hat so etwas in der Art schon umgesetzt.

Zu deinen Punkten:
url und parameter getrennt, damit der Link erst beim aufruf zusammengesetzt wird, um urlrewriting on/off zu unterstützen.
Das halte ich für keine gute Idee. In der Datenbank sollte weder eine URL, noch Parameter eines Links stehen. Das ist alles Sache der Präsentations-Logik des "Moduls". Die Datenhaltung selbst ist eine eigene Repräsentation des Moduls und um Widerverwendbarkeit und mehrfaches Einsetzen in einer Seite zu ermöglichen, darf das das Datenmodell nicht berühren.
Text wird so ne art platzhalter.
Es wird eine Sprachendatei gefordert sein, in der dann je nach aktueller Sprache anhand des eintrags in text die Beschriftung für die Sprache rausgesucht wird.
Das wiederum sollte besser in der Datenbank abgebildet werden, denn ein Anzeige-Name ist ein Attribut eines Navigations-Knotens. Auch, wenn es sich dabei um ein mehrsprachiges Attribut handelt. Es ist IMHO umständlich, die Datenhaltung in zwei unterschiedliche Medien zu splitten. Zur Abbildung könnte man mit Stellvertreter-Objekten arbeiten, die nur die eigentliche Struktur abbilden und jeweils mit den Sprach-Attribut-Objekten assoziert sind, die den Knoten beschreiben. Ein Sprach-Attribut-Objekt wiederum besitzt eine Assoziation zu einer Sprache und kan damit z.B. als deutsche Beschriftung eines Navigations-Knotens identifiziert werden.
Damit das Menü problemlos an eigene Bedürfnisse angepasst werden kann, wird es per template zusammengesetzt, dann sollte es für jeden Zweck nutzbar sein.
Um das wirklich zu garantieren, sollte der Anwender in deinem Tag noch Templates für markierte und nicht markierte Elemente sowie Ausgabe-Variationen für die unterschiedlichen Ebenen deiner Navigation besitzten. Sonst ist die Taglib darauf beschränkt, den vorgegebenen Stil zu verwenden.
Wird ein management benötigt, oder meint ihr es ist zumutbar die paar zeilen in der datenbank manuell zu verwalten?
Baunstrukturen ohne Backend zu verwalten finde ich nicht gerade spannend, vor allem, wenn mit Nested-Set-Trees gearbeitet wird. Weiterhin müsste man sich bei der Implementierung überlegen, wie der Fall: "Ich möchte nun an den Knoten noch eine Weibseite (oder gar mehrere Inhalte) hängen!" abgebildet werden kann. Hier muss die Schnittstelle möglichst offen sein.

Mehr fällt mir im Moment nicht dazu ein. :geek:

Viele Grüße,
Christian
Viele Grüße,
Christian

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Menü taglib-modul

Beitrag von Screeze » 15.08.2009, 10:53:40

hmm
url und parameter getrennt, damit der Link erst beim aufruf zusammengesetzt wird, um urlrewriting on/off zu unterstützen.

Das halte ich für keine gute Idee. In der Datenbank sollte weder eine URL, noch Parameter eines Links stehen. Das ist alles Sache der Präsentations-Logik des "Moduls". Die Datenhaltung selbst ist eine eigene Repräsentation des Moduls und um Widerverwendbarkeit und mehrfaches Einsetzen in einer Seite zu ermöglichen, darf das das Datenmodell nicht berühren.
wenn ich keine url und parameter zum jeweiligen menüeintrag in die datenbank eintrage, was bringt mir dann das ganze menü-modul? genau dafür was eigentlich gedacht.
Das wiederum sollte besser in der Datenbank abgebildet werden, denn ein Anzeige-Name ist ein Attribut eines Navigations-Knotens. Auch, wenn es sich dabei um ein mehrsprachiges Attribut handelt. Es ist IMHO umständlich, die Datenhaltung in zwei unterschiedliche Medien zu splitten. Zur Abbildung könnte man mit Stellvertreter-Objekten arbeiten, die nur die eigentliche Struktur abbilden und jeweils mit den Sprach-Attribut-Objekten assoziert sind, die den Knoten beschreiben. Ein Sprach-Attribut-Objekt wiederum besitzt eine Assoziation zu einer Sprache und kan damit z.B. als deutsche Beschriftung eines Navigations-Knotens identifiziert werden.
Wie jetzt?
Also ich soll die sprache nicht in eine datei packen,sondern in die datenbank, ok.
Welche möglichkeiten hätte ich noch:
1. bei jedem datenbankeintrag in eine spalte z.b. 'de="Hauptseite" en="home"'
2. für jede sprache ein extra eintrag in der datenbenk, und eine zusätzliche spalte in der steht welche sprache es ist.

letzteres halt ich für unsinn..
Um das wirklich zu garantieren, sollte der Anwender in deinem Tag noch Templates für markierte und nicht markierte Elemente sowie Ausgabe-Variationen für die unterschiedlichen Ebenen deiner Navigation besitzten. Sonst ist die Taglib darauf beschränkt, den vorgegebenen Stil zu verwenden.
ich könnte dem taglib noch das attribute template=".." hinzufügen, welches dann einen satz templates mit vorgegebenem namen laden kann. Somit kann das menü in einer seite mehrfach an veschiedenens tellen mit verschiedenen styles benutzt werden.
Eine trennung in markiert/nichtmarkiert/ ect. wird auch eingebaut.
Baunstrukturen ohne Backend zu verwalten finde ich nicht gerade spannend, vor allem, wenn mit Nested-Set-Trees gearbeitet wird.
Ok backend wird erstellt.
Weiterhin müsste man sich bei der Implementierung überlegen, wie der Fall: "Ich möchte nun an den Knoten noch eine Weibseite (oder gar mehrere Inhalte) hängen!" abgebildet werden kann. Hier muss die Schnittstelle möglichst offen sein.
meinst du jetzt einfach AN das menü selber noch einen Punkt hängen? das wär ja kein Problem.
Oder meinst du ein untermenü zu einem Menüpunkt? Dafür würde ich mir sowieso noch was einfallen lassen.

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Menü taglib-modul

Beitrag von dr.e. » 17.08.2009, 08:26:18

Hi,
wenn ich keine url und parameter zum jeweiligen menüeintrag in die datenbank eintrage, was bringt mir dann das ganze menü-modul? genau dafür was eigentlich gedacht.
Das bringt dir eine ganze Menge: du hast Menü-Bäume komplett abstrahiert und kannst diese sogar mehrmals und in mehreren Applikationen mit unterschiedlichen URL-Strukturen einsetzen. Genau letzteres ist nicht möglich, wenn du feste URLs in der Datenbank speicherst, denn dann bist du Projekt-abhängig! Eine Ausnahme bildet hier ein CMS, hier macht es sehr wohl Sinn, URL-Identifier pro Navigations-Knoten in der Datenbank zu speichern, die Generierung der kompletten URL wird hier jedoch trotzdem dynamisch passieren.
Wie jetzt?
Also ich soll die sprache nicht in eine datei packen,sondern in die datenbank, ok.
Welche möglichkeiten hätte ich noch:
1. bei jedem datenbankeintrag in eine spalte z.b. 'de="Hauptseite" en="home"'
2. für jede sprache ein extra eintrag in der datenbenk, und eine zusätzliche spalte in der steht welche sprache es ist.
letzteres halt ich für unsinn..
Da du nicht weißt, welche Sprachen du haben wirst, würde ich wie beschrieben vorgehen. Gestaltest du das vollständig generisch, könntest du auch wie im folgend gezeigten Datenbank-Diagramm arbeiten. Mit Unsinn hat das nichts zu tun. Im Gegenteil: das ist sogar clever! Mit einer Ausnahme: die Sprache sollte über eine zusätzliche Beziehung gekennzeichnet sein und nicht in einer Spalte hart verdrahtet sein.

Bild
ich könnte dem taglib noch das attribute template=".." hinzufügen, welches dann einen satz templates mit vorgegebenem namen laden kann. Somit kann das menü in einer seite mehrfach an veschiedenens tellen mit verschiedenen styles benutzt werden.
Eine trennung in markiert/nichtmarkiert/ ect. wird auch eingebaut.
Klingt besser. :)
meinst du jetzt einfach AN das menü selber noch einen Punkt hängen? das wär ja kein Problem.
Oder meinst du ein untermenü zu einem Menüpunkt? Dafür würde ich mir sowieso noch was einfallen lassen.
Hiermit meinte ich eine komplette Struktur aufbauen, sprich an einen Menü-Punkt noch einen weiteren Unterpunkt anhängen.
Zuletzt geändert von dr.e. am 17.08.2009, 22:29:51, insgesamt 1-mal geändert.
Grund: Größeres Bild verlinkt
Viele Grüße,
Christian

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Menü taglib-modul

Beitrag von Screeze » 17.08.2009, 12:34:43

dr.e. hat geschrieben:Hi,


Das bringt dir eine ganze Menge: du hast Menü-Bäume komplett abstrahiert und kannst diese sogar mehrmals und in mehreren Applikationen mit unterschiedlichen URL-Strukturen einsetzen. Genau letzteres ist nicht möglich, wenn du feste URLs in der Datenbank speicherst, denn dann bist du Projekt-abhängig! Eine Ausnahme bildet hier ein CMS, hier macht es sehr wohl Sinn, URL-Identifier pro Navigations-Knoten in der Datenbank zu speichern, die Generierung der kompletten URL wird hier jedoch trotzdem dynamisch passieren.
hmm und wie sollte deiner meinung nach dann ein setzen eienes menüpunktes im template funktionieren?
so etwa?

Code: Alles auswählen

<abc:menue lang="de">
     <menue:link url="abc.php" param="....">
</abc:mnue>
Auf diese Weise könnte ich es auch ganz ohne datenbank lösen...



könntest du auch wie im folgend gezeigten Datenbank-Diagramm arbeiten. [...]
Bild
Das diagramm ist leider so gut wie nicht zu lesen, auch mit zoom ;)

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Menü taglib-modul

Beitrag von dr.e. » 17.08.2009, 22:33:30

Hi,

habe eine Grafik mit besserer Auflösung verlinkt, nun solltest du das Konzept erkennen können.
hmm und wie sollte deiner meinung nach dann ein setzen eienes menüpunktes im template funktionieren?
so etwa?
Das ist schon mal ein guter Anfang. Wichtig ist jedoch, dass du noch eine Unterscheidung für jeden Typ von Knoten treffen kannst und pro Knotentyp nochmals aktiv und nicht aktiv kennzeichnen kannst. Das könnte in etwa so funktionieren:

Code: Alles auswählen

<my:menu>
  <menu:item nodetype="...">
    <item:selected .../>
    <item:default .../>
  </menu:item>
  ...
</my:menu>
Viele Grüße,
Christian

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Menü taglib-modul

Beitrag von Screeze » 17.08.2009, 23:19:41

welche knotentypen meinst du?

was mir einfiele:
pro menüebene darf nur 1 Punkt selected sein.
Mit aktiv/inaktiv meinst du denke ich dass man bestimmte menüpunkte (inaktiv) nicht anklicken kann?

Code: Alles auswählen

<my:menu>
  <menu:item nodetype="...">
    <item:selected url="sla.php" param="array(...)" .../>
    <item:default url="bla.php" param="array(...)".../>
  </menu:item>
  <item:default  url="blll.php" param="array(...)" .../>
  <item:default .../>
 <menu:item nodetyoe="..">
  <item:default .../>
</menu:item>
</my:menu>
Hab ich dein schema so richtig verstanden? die <menu:item> enthalten weitere unterpunkte/untergruppen, und die item können aber auch direkt im menü angezeigt werden?

Wobei.. was ist nodetype bei dir? ich glaub ich habs doch nicht verstanden ;)

und ne datenbank brauch ich nach dem schema nichtmal...

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Menü taglib-modul

Beitrag von dr.e. » 17.08.2009, 23:41:21

Hallo Screeze,
Mit aktiv/inaktiv meinst du denke ich dass man bestimmte menüpunkte (inaktiv) nicht anklicken kann?
Nein, ich meine: aktiver vs. nicht aktiver Navi-Punkt. In einem Pfad aus 3 Ebenen gibt es beim Anklicken eines Punktes der dritten Ebene auch drei aktive Knoten, die entsprechend markiert werden können sollten.
Wobei.. was ist nodetype bei dir? ich glaub ich habs doch nicht verstanden ;)
Eine Navigation kann ja aus unterschiedlichen Domänen-Objekt-Typen bestehen, die u.U. eine andere Behandlung benötigen. Aus dem CMS-Bereich kenne ich hier einige Anwendungsfälle.
und ne datenbank brauch ich nach dem schema nichtmal...
Warum denn nicht? Was ich hier definiere, ist ausschließlich die Präsentation. Mit Datenhaltung hat das nichts zu tun. ;)
Hab ich dein schema so richtig verstanden? die <menu:item> enthalten weitere unterpunkte/untergruppen, und die item können aber auch direkt im menü angezeigt werden?
Das <menu:item /> beschreibt das Aussehen eines Navigations-Knotens vom Typ XYZ. Innerhalb dieses Tags beschreibe ich dann im Detail, wie ein aktiver/selektierter und ein inaktiver/nicht-selektierter Navigationsknoten dargestellt werden soll.
Viele Grüße,
Christian

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Menü taglib-modul

Beitrag von Screeze » 17.08.2009, 23:47:22

achsooo du meintest das als template FÜR ein Menü?

Ich dachte du willst dir so ein Menü zusammenschustern, welches aufgrund anderer templates dann zusammengebaut wird.

Jetzt haben wir 2 verschiedene Ansätze, und ich komm immer mehr durcheinander...

Ich versteh immernoch nicht, was es mir bringen soll so ein menüaufzubauen, die punkte in einer datenbank zu sammeln, aber ihnen keine url zu geben? das is doch das wichtigste von einem Menü, und dafür hatte ich eigentlich die idee...
Der Anwendungsfall "deines Menüs" erschließt sich mir da nicht richtig. Kannst du villeicht ein Beispiel dazu geben?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Menü taglib-modul

Beitrag von dr.e. » 18.08.2009, 07:52:28

Hallo Screeze,

der Grund, warum du keine URL in der Datenbank speichern sollst ist der, dass du das Menü dann nicht mehr wiederverwenden/weiterverwenden kannst. Nehmen wir an, du speicherst

Code: Alles auswählen

http://my.domain.de/path/to/my/page
als URL für den Navi-Punkt und möchtest die Domain umziehen, dann musst du die komplette Datenbank umziehen. Selbst wenn du nur
/path/to/my/page
speichern würdest, ist das problematisch, wenn du die Seite innerhalb der Webseite umziehst oder die Struktur überarbeitest. Trennst du dagegen Datenhaltung und Präsentation (siehe MVC, 2-Schicht-Architektur), dann hast du dieses Problem nicht. Die URLs zu generieren ist - nebenbei gesprochen - das wenigste am Modul. Die meiste Arbeit steckt im Aufbau des Baumes in der Datenbank und der Pflege-Maske. ;)

Die Punkte in einer Datenbank zu speichern bringt dir die Möglichkeit einen Baum performant abfragen zu können und einem Redakteur die Chance zu geben, diesen pflegen zu können. Alles andere ist eine Zumutung und wird niemand benutzen. :)
Kannst du villeicht ein Beispiel dazu geben?
Ich persönlich würde die Navigation mit ihren Inhalten wie folgt in der Datenbank speichern:

Code: Alles auswählen

id | parentid | displayname | tooltip | bookmark | type
Anschließend implementiere ich eine FC-Action oder einen Input-Filter um die URL zu analysieren und das Model der Seite bzw. das des Navigations-Moduls zu füllen. Diese Informationen (insbesondere: was muss highlightet dargestellt werden und was nicht) nutzt nun die Taglib, die wiederum durch die oben genannte Definition weiß, wie welcher Knoten dargestellt werden soll, um den Baum darzustellen. Der Komponente kann man zusätzlich noch eine Bookmark für die Identifizierung des darzustellenden Root-Knotens mitgeben. So kannst du ganz einfach Teil-Bereiche darstellen.
Viele Grüße,
Christian

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: Menü taglib-modul

Beitrag von Screeze » 18.08.2009, 10:12:27

und woher weiß dein menüpunkt jetzt wohin er zeigen muss?

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: Menü taglib-modul

Beitrag von Megger » 18.08.2009, 10:52:30

Das habe ich bei mir so gelöst, dass der Menüpunkt zwei Einträge in der Datenbank hat (Value und Display) Der value wird dazu verwendet, denn Link zu generieren und der Display ist dann die Anzeige.

Hier könnte man sicher damit arbeiten, dass man anhand des Value einen sprachabhängigen Display aus einer Datei holt.
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
Tom
Beiträge: 25
Registriert: 06.08.2009, 15:54:29
Kontaktdaten:

Re: Menü taglib-modul

Beitrag von Tom » 19.08.2009, 16:14:29

Bin gerade zufällig auf diesen Thread gestossen. Im Prinzip wollte ich das selbe machen.

Christian: Für was hast du die Spalte bookmark vorgesehen?
Gruß,
Tom

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Menü taglib-modul

Beitrag von dr.e. » 19.08.2009, 17:15:14

Hallo Tom,

das habe ich dafür vorgesehen, dass du im Darstellungs-Tag definieren kannst, welchen Ausschnitt der Navigation gezeigt werden soll und bis zu welchem Level. Möchtest du z.B. in einem Template nur die Ebene 4 anzeigen (auf Grund der Anforderungen), kannst du das wie folgt realisieren:

Code: Alles auswählen

<my:menu bookmark="foo" levels="1">...</my:menu>
Weiterhin bietet dir diese Vorgehensweise eine schicke Möglichkeit, die Daten zwischen unterschiedlichen Systemen portieren zu können.
Viele Grüße,
Christian

Benutzeravatar
Tom
Beiträge: 25
Registriert: 06.08.2009, 15:54:29
Kontaktdaten:

Re: Menü taglib-modul

Beitrag von Tom » 19.08.2009, 17:43:31

Verstehe, durchwegs eine gute Idee
Gruß,
Tom

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast