[3.0] Navigation mit Stylesheet versehen

Das Forum soll der Ablage von Lösungen für immer wieder auftauchende Problemstellungen dienen. // This forum contains solutions to problems that frequently occur.
Antworten
Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

[3.0] Navigation mit Stylesheet versehen

Beitrag von dave » 04.03.2015, 13:05:36

Servus miteinander,

ich muss mal etwas ansprechen, wovor ich mich bisher immer etwas gedrückt habe, es nun aber einfach mal vernünftige realisieren möchte. Und zwar möchte ich beim Anklicken eines Links in der Navigation, dass dessen Attribut dann um ein class="" erweitert wird, damit der Benutzer auch erkennen kann, dass er auf der neuen Seite ist. Logisch ;)

Folgende vereinfachte Struktur:
konstrukt.html

Code: Alles auswählen

<html lang="de">
<head>
    <meta charset="utf-8">
</head>
<body>

<core:importdesign namespace="WEB\preisdb\pres\templates" template="__navi"/>

<core:importdesign namespace="WEB\preisdb\pres\templates" template="__content"/>

<footer></footer>
</body>
</html>
Über __Content.html werden dann neue Seiten eingebunden (<core:importdesign mit incparam). Nun muss ich aber je nachdem, wo in der __navi.html geklickt wurde, das Attribut des jewieligen Link erweitern (oder verkürzen, wenn er nicht mehr aktiv ist):

Code: Alles auswählen

<li><a href="?p=impressum">Impressum</a></li> 
wird dann zu

Code: Alles auswählen

<li class="current"><a href="?p=impressum">Impressum</a></li> 
Wie lässt sich das realisieren?
Zuletzt geändert von dave am 09.03.2015, 17:59:34, insgesamt 1-mal geändert.

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

Re: [3.0] Navigation my Stylesheet versehen

Beitrag von dr.e. » 04.03.2015, 14:11:39

Hallo dave,

hierzu könntest du die Tags unter APF\tools\link\taglib zur Generierung von Links nutzen oder einen Controller implementieren, der dynamisch an Hand der URL ein class-Attribut hinzufügt. Erstere wurden von Werner Liemberger initial implementiert, die Doku findet sich allerdings im Wiki unter http://wiki.adventure-php-framework.org/HtmlLinkTag. Mit einem Controller lässt sich das wie folgt erledigen:

Code: Alles auswählen

<li class="${active-marker}"><a href="?p=impressum">Impressum</a></li>
Zugehöriger Controller:

Code: Alles auswählen

class NaviController extends BaseDocumentController {

   public function transformContent() {
      if(...) {
         $this->setPlaceHolder('active-marker', 'current');
      }
   }

} 
Hoffe das hilft dir weiter! :)
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0] Navigation my Stylesheet versehen

Beitrag von dave » 04.03.2015, 17:20:21

Hi Christian,

Danke :D Die HtmlLink-Taglib ist genau das, was ich brauche. Über einen Controller wollte ich es nicht lösen, da das meiner Meinung nach keine Aufgabe eines Controllers ist. Die Taglib eignet sich natürlich hervorragend dafür.

Ansonsten muss ich sagen, dass ich mich bereits wieder sehr gut eingearbeitet habe und die erweitete Funktion speziell für Templates (wiederkehrende Logik direkt ins Template zu packen) gefällt mir sehr gut.

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

Re: [3.0] Navigation my Stylesheet versehen

Beitrag von dr.e. » 04.03.2015, 19:52:42

Sehr schön! :)
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0] Navigation my Stylesheet versehen

Beitrag von dave » 05.03.2015, 12:03:51

Ich habe mich heute mal ein wenig mit der HtmlLink-Taglib verfasst. Diese funktioniert jedoch nicht, wie sie sollte.

Im Template:

Code: Alles auswählen

<li><html:a p="start" para="123">Home</html:a></li>
<li><html:a p="impressum" para="345">Impressum</html:a></li> 
wird zu:

Code: Alles auswählen

<li><a p="start" para="123" href="http://db.der-dave.com/?p=start&para=123" class="active">Home</a></li>
<li><a p="impressum" para="345" href="http://db.der-dave.com/?p=impressum&para=345" class="active">Impressum</a></li>
Unschön zum einen dass die Attribute p und para mit in den Quellcode landen, was laut Wiki-Eintrag eigentlich nicht sein sollte. Ausserdem bekommt jeder Link, unabhängig ob dieser nun akriv oder nicht, die Klasse active zugewiesen.

Ich werde das mal noch etwas weiter im Code verfolgen, Erkenntnisse aktualisiere ich dann an passender Stelle.

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

Re: [3.0] Navigation my Stylesheet versehen

Beitrag von dr.e. » 05.03.2015, 23:05:27

Hallo dave,

ich kann habe dazu leider keinen Unit Test gefunden, allerdings sollte die Zeile

Code: Alles auswählen

return '<a ' . $this->getAttributesAsString($this->getAttributes()) . '>' . $content . '</a>'; 
besser

Code: Alles auswählen

return '<a ' . $this->getAttributesAsString($this->getAttributes(), $this->attributeWhiteList) . '>' . $content . '</a>'; 
lauten. Damit ist zumindest schon mal das Problem mit den Attributen gelöst.

Für die Markierung als aktiv sollte an sich durch einen Unit Test abgedeckt sein. Kannst du deinen Anwendungsfall im Code mal genauer ansehen?
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0] Navigation my Stylesheet versehen

Beitrag von dave » 06.03.2015, 11:52:30

Moin Christian,

Code: Alles auswählen

return '<a ' . $this->getAttributesAsString($this->getAttributes(), $this->attributeWhiteList) . '>' . $content . '</a>';
passt hervorragend! Attribute werden nicht mehr im html-Code ausgegeben.

Ich habe mir nun mal den Vergleich bzw. das markieren als active angesehen. Ist schon eine komische Sache, wie ich feststellen musste.

In der Funktion isActive() werden die derzeitige und die zukünftige Url über substr_count miteinander verglichen. Soweit so gut. Ich habe mein Template nun mal vereinfacht um zu schauen, was genau passiert.
Ich befinde mich derzeit auf der Seite Start

Code: Alles auswählen

http://db.der-dave.com/?p=start
und als Link gibt es das Impressum

Code: Alles auswählen

http://db.der-dave.com/?p=impressum
Vergleiche ich diese beiden Strings nun via

Code: Alles auswählen

echo "<br>" . substr_count('http://db.der-dave.com/?p=start', 'http://db.der-dave.com/?p=impressum');
erhalte ich als Ausgabe
0
Super, funktioniert! Vergleiche ich das ganze nun aber über

Code: Alles auswählen

echo "<br>" . substr_count(LinkGenerator::generateUrl($currentUrl), LinkGenerator::generateUrl($targetUrl));
erhalte ich als Ausgabe
1
was natürlich Schwachsinn ist, da currentUrl als Ergebnis http://db.der-dave.com/?p=start liefert und targetUrl als Ergebnis http://db.der-dave.com/?p=impressum.

Selbst wenn ich nun mal als Alternative die PHP Funktion strcmp nutze kommt dabei Schwachsinn raus. Meine Frage: Was macht denn der LinkGenerator da nun?

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

Re: [3.0] Navigation my Stylesheet versehen

Beitrag von dr.e. » 07.03.2015, 10:56:40

Hallo dave,

das war garnicht so einfach zu sehen. :D In der Methode isActive() wurde die Query der Ziel-URL mit der der Quell-URL überschrieben. Zudem habe ich noch ein Issue gefunden, das bei nicht definiertem Content auftaucht.

Beide habe ich unter http://tracker.adventure-php-framework. ... php?id=246 geschrieben und im Git-Repo gefixt. Details siehe https://github.com/AdventurePHP/code/co ... a088b7f7f7. Eine aktualisierte Version kannst du unter https://github.com/AdventurePHP/code/archive/master.zip.

Hoffe, damit sind deine Fehler behoben. :)
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0] Navigation my Stylesheet versehen

Beitrag von dave » 07.03.2015, 13:40:18

Oh man, wirklich nicht einfach zu sehen, wie peinlich. Ich nenne es mal Betriebsblindheit, wenn man stundenlang drauf starrt sieht man solche doofen Lücken nicht mehr :D
Super, dass du es auch gleich im aktuellen Zweig eingecheckt hast, ich muss mich da auch erstmal wieder rein fuchsen und brauche zum Einchecken auch wieder die Rechte, das APF ist ja von SourceForge nach GitHub umgezogen, richtig?

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

Re: [3.0] Navigation my Stylesheet versehen

Beitrag von dr.e. » 07.03.2015, 17:11:39

Korrekt, das Repo bzw. die Repos werden nun unter https://github.com/AdventurePHP gehostet. Damit ich dir Berechtigungen geben kann brauchst du einen GitHub-Account. Gib mir per PN Bescheid, dann füge ich dich hinzu. Solange kannst du deine Änderungen gerne als Fork + Pull-Request verwalten. Das ist an sich sehr komfortabel.
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0] Navigation mit Stylesheet versehen

Beitrag von dave » 09.03.2015, 18:03:43

Ich habe nochmal eine Frage:

Wenn meine Startseite ohne "p"-Parameter aufgerufen wird (http://db.der-dave.com), wird die Navigation nicht korrekt gesetzt, da der HtmlLinkTag ja gar nicht weiss, wo ich nun bin. Daher leite ich über die index.php immer auf "db.der-dave.com/?p=start" um, sollte der GET_Parameter "p" nicht gesetzt sein. Problematik daran ist, das Actions nicht richtig ausgeführt werden, beispielweise der Logout vom UMGT (ist auch logisch, der p-Parameter in der Action fehlt).

Wie kann ich dem vorbeugen, was wäre der beste Lösungsansatz? Kann man einen Default-Wert für die HtmlLinkTag setzen?

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

Re: [3.0] Navigation mit Stylesheet versehen

Beitrag von dr.e. » 10.03.2015, 14:06:44

Hallo dave,

aktuell kannst du den <html:a />-Tag nur wie im Wiki beschrieben konfigurieren. Einen Defaul-Parameter gibt es so nicht. Die Implementierung des HtmlLinkTag generiert die aktuelle URL über

Code: Alles auswählen

Url::fromCurrent(true); 
insofern sollte eigentlich auch deine Startseite erkannt werden, sofern du für den Link auf die Startseite den p-Parameter in der Definition des <html:a />-Tags weg lässt. Schau dir mal den Unit Test unter https://github.com/AdventurePHP/code/co ... 2231c39R75 an ob dieser deinen Anwendungsfall nicht schon abdeckt. Falls nicht, lass uns zusammen einen erweiterten Test formulieren und ich schaue mal ob sich das mit der HtmlLinkTag-Implementierung realisieren lässt.

Einverstanden?
Viele Grüße,
Christian

Benutzeravatar
dave
Beiträge: 903
Registriert: 04.02.2011, 19:03:57
Wohnort: Berlin
Kontaktdaten:

Re: [3.0] Navigation mit Stylesheet versehen

Beitrag von dave » 10.03.2015, 18:43:14

Hi Christian,

ich habe keine Ahnung, wie ich Unit Test verwenden könnte. Ich mache immer alles direkt online, da weiss ich wenigstens sofort, dass es auch online mit der Serverkonfiguration dort klappt.

Ich habe meine Startseite (den Home-Link) nun so mit der HtmlLinkTag angepasst:

Code: Alles auswählen

<li><html:a>Home</html:a></li> 
Dies hat zur Folge, dass der Home-Link immer als active markiert wird, egal welchen anderen Wert p nun annimmt. Selbst mit

Code: Alles auswählen

<li><html:a p="">Home</html:a></li> 
ist das Verhalten so.

Ich habe mich bereits an einer Default-Implementierung versucht, jedoch noch kein vernünftiges Ergebnis erzielen können. Für mich hat das bisher auch keine grosse Priorität, es ist lediglich eine "Unschönheit".

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

Re: [3.0] Navigation mit Stylesheet versehen

Beitrag von dr.e. » 15.03.2015, 10:09:36

Hallo dave,

im Unit Test - bzw. der referenzierten Methode kannst du ablesen, welchen Anwendungsfall der Tag aktuell unterstützt. Ich bearbeite gerade noch http://tracker.adventure-php-framework. ... php?id=224 und werde mich anschließend nochmal um dein Beispiel kümmern.
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast