De:PHx

From MODx Wiki

Jump to: navigation, search
Dieser Artikel ist eine Übersetzung aus dem englischen Wiki.

Vielleicht gibt es noch Übersetzungsfehler oder andere Ungereimtheiten. Wenn du gut Englisch versteht vergleiche doch mal die beiden Artikel.

Dieser Artikel kann noch eine Rechtschreibprüfung vertragen.

Wenn du gut Deutsch kannst, schau mal drüber.

Contents

Einleitung

PHx (Platzhalter Xtended) geben dir die Möglichkeit, die Ausgabe zu beeinflussen, wenn du Platzhalter, Templatevariablen und Einstellungs-Tags benutzt. Der rekursive Parser erlaubt auch verschachtelte Tags. Eigene Modifikatoren können erstellt werden, indem du "Mini-Snippets" im MODx Resource-Manager anlegst.


Auf dieser Beispiel-Seite kannst du PHx in Aktion sehen.

PHx bekommen

Lade dir die aktuellste Version von PHx aus dem MODx-Repository. Die hier beschriebene Version ist 2.0.1

Installation

Frische Installation

  1. Lade das Archiv runter und entpacke es.
  2. Erstelle einen Ordner namens "phx" in deinem [MODx Directory]/assets/plugins Ordner.
  3. Lade die Dateien per FTP hoch oder kopiere sie per SSH in [MODx Directory]/assets/plugins/phx
  4. Erstelle ein neues Plugin namens "PHx" im Manager und kopiere den Inhalt von phx.plugin.txt in das Code-Feld.
  5. Aktiviere "OnParseDocument" im Tab "Systemereignisse".

Update

  1. Lade das Archiv runter und entpacke es.
  2. Mach eine Sicherheitskopie von den Dokumenten in [MODx Directory]/assets/snippets/phx und lösche sie.
  3. Erstelle einen Ordner namens "phx" in deinem [MODx Directory]/assets/plugins Ordner.
  4. Lade die Dateien per FTP hoch oder kopiere sie per SSH in [MODx Directory]/assets/plugins/phx
  5. Ersetze den Inhalt vom "PHx"-Plugin im Manager mit den Inhalt von phx.plugin.txt.
  6. Prüfe ob "OnParseDocument" im Tab "Systemereignisse" aktiviert ist.

Konfiguration

Gib im Tab "Konfiguration" -> Plugin-Konfiguration folgendes ein:

&phxdebug=Log events;int;0 &phxmaxpass=Max. Passes;int;50

Erfahrene Benutzer

Du kannst einige Standardeinstellungen von PHx ändern:

  • Ereignisse protokollieren
0 = Deaktiviert
1 = Protokolliere PHx-Ereignisse
Wenn aktiviert, wird PHx ein detailliertes Verarbeitungsprotokoll im MODx-Systemereignis-Log (Manager->Berichte->Systemereignisse) anlegen
  • Max. Durchläufe
Gib eine Zahl für die max. Tiefe an, bis zu der verschachtelte Tags verarbeitet werden sollen.. Ich empfehle den Wert auf 50 zu belassen.

Beschreibung

PHx (Platzhalter Xtended) erweitert Platzhalter, Template-Variablen und Einstellungs-Tags - das gibt dir die Möglichkeit, die Darstellung des Endergebnisses auf einfache Weise zu beeinflussen. Wenn aktiviert, klemmt es sich in den MODx-Parser, erweitert diesen mit Modfikatoren und Bedingungen und als Bonus macht es ihn wirklich rekursiv. PHx macht außerdem die wenig-Parameter-Snippets überflüssig, die nur dazu benutzt werden, einen Wert für die Ausgabe zu formatieren.

Spitze für Templates!

Einen Wert zu modifizieren ist so einfach wie :modifikator hinzufügen.


Unterstützte Tags

PHx kann folgende MODx-Tags erweitern:

[+platzhalter+]
[*variablen*]
[(einstellungen)]

Snippets, die PHx unterstützen

  • Ditto (as of 1.1 Beta 2)
  • Jot
  • MaxiGallery

Du kannst PHx außerdem in Chunks von anderen Snippets benutzen, die nicht oben aufgelistet sind - vielleicht musst du sie davor aber geringfügig anpassen (schau dir die Tipps & Tricks an).

Benutzung

Ein normaler Platzhalter wie [+platzhalter+] kann leicht zu einem PHx-Platzhalter erweitert werden: [+platzhalter:modifikator+]. Dasselbe gilt für Template-Variablen wie:

[*erstelltvon*]

Einige Modifikatoren akzeptieren auch Argumente wie

[*erstelltvon:date=`%a %B %d, %Y um %H:%M`*]

Du kannst auch mehrere Modifikatoren hintereinander anwenden. Diese werden der Reihe nach von links nach rechts verarbeitet.

irgendwas:esc:nl2br:strip

Erweiterte Benutzung

Es gibt einen Dummy-Platzhalter namens 'phx' mit dem du eine Sequenz ohne eine wirkliche Variable starten kannst.

[+phx:if=`[+das+]`:is=`[+jenes+]`:then=`mache irgendwas`:else=`mache sonstwas`+]

Mit einigen Modifikatoren wird der Dummy automatisch einen Wert als Standard setzen. Beim "userinfo" Modifikator wird z.B. der Name des aktuellen Benutzers eingesetzt.

[+phx:userinfo=`benutzername`+]

Bekannte Probleme

Es scheint logisch, aber ich erwähne es als ein Problem, weil es einfach zu beachten ist. Versuche folgende Zeichenkombinationen in deinem Template zu vermeiden, wenn sie nicht als MODx-Tags gedacht sind:

[+
[*
[(
+]
*]
)]

Sie könnten unter Umständen den Parser und MODx verwirren. Normalerweise sollte das zwar kein Problem sein. Wenn du aber Javascript in deinem Template verwendest sieht das ganze so aus:

array[zaehler++]

Das könnte wegen dem +] aber ein komisches Verhalten hervorrufen.

Merk dir einfach, dass du deine Website nicht mit einer kaputten PHx-Syntax beschädigen kannst - im schlimmsten Fall sieht das Layout aus als würdest du eine XHTML-Website in Netscape 4 angucken.

Modifikatoren

String (Zeichenketten)

lcase

Gibt den aktuellen Wert mit allen alphabetischen Zeichen in Kleinschreibung zurück.

Beispiel:
[+string:lcase+]
  • Eingabe:
    Das ist ein String
  • Rückgabe:
    das ist ein string

ucase

Gibt den Wert mit allen alphabetischen Zeichen in Großschreibung zurück.

Beispiel:
[+string:ucase+]
  • Eingabe:
    Ich hab schlechte Laune
  • Rückgabe:
    ICH HAB SCHLECHTE LAUNE

ucfirst

Wandelt das erste Zeichen des übergebenen Werts in Großbuchstaben um-

Beispiel:
[+string:ucfirst+]
  • Eingabe:
    das ist ein satz
  • Rückgabe:
    Das ist ein Satz

length | len

Gibt die Länge des aktuellen Werts zurück

Beispiel:
[+string:len+]
  • Eingabe:
    Lorem Ipsum dolor sit amet
  • Rückgabe:
    26

Notags

Löscht alle HTML-Tags aus dem aktuellen Wert.

Beispiel:
[+string:Notags+]
  • Eingabe:
    das <b>ist</b> ein <i>string</i>
  • Rückgabe:
    das ist ein string

esc

Escapet HTML-Zeichen und eckige Klammern

htmlent

Wandelt HTML-Zeichen im Wert in die entsprechenden Entitäten um.

nl2br

Wandelt Zeilenumbrüche im Wert (\n) in HTML-Breaks um (<br/>)

Beispiel:
[+string:nl2br+]
  • Eingabe:
    1. das ist
    2. ein kleiner
    3. Mehrzeiler
  • Rückgabe:
    das ist <br />ein kleiner <br /> Mehrzeiler

strip

Löscht Zeilenumbrüche (\n), Tabs (\t) und mehrfache Leerzeichen-

Beispiel:
[+string:strip+]
  • Eingabe:
    1. das ist
    2. ziemlich
    3. chaotisch
    4. formatiert
  • Rückgabe:
    das ist ziemlich chaotisch formatiert

Anderes

  • reverse
    Gibt den aktuellen Wert rückwärts aus.
  • wordwrap(=`laenge`)
    laenge - zeichen
    Unterbricht Wörter im aktuellen Wert, die mehr als die angegebene Länge an Zeichen haben, mit einem Leerzeichen.
    Standard: 70 Zeichen.
  • limit(=`laenge`)
    Gibt die ersten X Zeichen vom Wert aus.
    Standard: 100 Zeichen.

Spezielles

date(=`datumsformat`)

  • Formatiert ein Datum wie mit PHPs strftime-Funktion.
  • Wandelt UNIX-Timestamps in das angegebene Format um.

md5

  • Erstellt einen MD5-Hash vom aktuellen Wert.

userinfo=`feld`

  • feld: ähnlich der Spaltennamen in der Datenbank. Wie: username, useremail

Gibt das angegebene Feld zur übergegeben Benutzer-ID zurück.

math=`berechnung`

  • Macht einfache Rechnungen mit - * + /.
  • Das "?" wird mit dem aktuellen Wert ersetzt.
  • Beispielrechnung: ?+1+(2+3)+4/5*6

ifempty=`anderer wert`

  • Gibt "anderer wert" aus wenn der übergebene Wert leer ist.

select=`optionen`

Gibt den aktuellen Wert formatiert nach den angegeben Optionen aus

  • Optionen wie: wert1=ausgabe1&wert2=ausgabe2

Beispiel:

  • Eingabe: 1
[+placeholder:select=`0=AUS&1=AN&2=UNBEKANNT`+]
  • Rückgabe: AN

Bedingungen

is

  • gleichbedeutend: eq

ist gleich (==)

ne

  • gleichbedeutend: isnot, isnt

ist ungleich (!=)

eg

  • gleichbedeutend: isgt

ist gleich oder größer (>=)

el

  • gleichbedeutend: islt

ist gleich oder kleiner (<=)

gt

ist größer (>)

lt

ist kleiner (<)

mo=`Webgruppen`

  • gleichbedeutend: isinrole, ir, memberof

Nimmt eine Liste von Webgruppen - durch Komma getrennt - und gibt TRUE oder FALSE zurück, je nachdem ob der übergebene Benutzer in der Gruppe ist oder nicht (ersetzt den "inrole" Modifikator, der zusammen mit einer Bedingung benutzt werden musste)

Beispiel:
[+phx:mo=`neueBenutzer`:then=`Ich bin ein neuer Benutzer`:else=`Ich bin entweder schon ein älterer Benutzer oder gar keiner`+]

if =`wert`

Nimmt einen neuen Wert. Normalerweise benutzt vor :or oder :and

or

Letzter ODER nächster Befehl

and

Letzter und NÄCHSTER Befehl

then =`template`

template : dieses Template wird angezeigt, wenn die Bedingung wahr ist Template kann ein { {chunk} }, [ [ snippet] ] oder einfach HTML sein.

else =`template

template : dieses Template wird angezeigt, wenn die Bedingung falsch ist. Template kann ein { {chunk} }, [ [ snippet] ] oder einfach HTML sein.

show

Ähnlich then mit dem Unterschied, dass es den Originalwert ausgibt und nicht ein Template, wenn die Bedingung wahr ist.

[+meinplatzhalter:len:gt=`3`:show+]
  • Wenn "meinplatzhalter" länger als 3 Zeichen ist, wird er angezeigt.

Noch mehr Beispiele

Beispiel 1

meinplatzhalter ist definiert als meinenwert

  • [+meinplatzhalter:is=`meinenwert`:then=`Richtig`:else=`Falsch`+]
    Wird "Richtig" ausgeben, weil "meinplatzhalter" "meinenwert" hat.
  • [+meinplatzhalter:isnot=`meinenwert`:then=`Richtig`:else=`Falsch`+]
  • [+meinplatzhalter:is=`andererwert`:then=`Richtig`:else=`Falsch`+]
    Wird in beiden Fällen Falsch ausgeben.
Beispiel 2
  • meinplatzhalter ist definiert als 2
  • irgendeinplatzhalter ist definiert als 3
  • andererplatzhalter ist definiert als 1
  1. [+meinplatzhalter:is=`2`:then=`
  2. {{ChunkGut}}
  3. `:else=`
  4. {{ChunkSchlecht}}
  5. `+]

Wird den Inhalt vom Chunk ChunkGut anzeigen.

  • [+meinplatzhalter:gt=`1`:then=`Ja`:else=`Nein`+]
  • [+meinplatzhalter:lt=`3`:and:gt=`1`:then=`Ja`:else=`Nein`+]
  • [+meinplatzhalter:lt=`[+irgendeinplatzhalter+]`:then=`Ja`:else=`Nein`+]
  • [+meinplatzhalter:islt=`2`:then=`Ja`:else=`Nein`+]
  • [+meinplatzhalter:isnot=`2`:or:lt=`3`:then=`Ja`:else=`Nein`+]

Werden alle Ja zurückgeben.

  • [+meinplatzhalter:isnot=`2`:then=`Ja`:else=`Nein`+]
  • [+meinplatzhalter:gt=`[+irgendeinplatzhalter+]`:then=`Ja`:else=`Nein`+]
  • [+meinplatzhalter:lt=`2`:then=`Ja`:else=`Nein`+]
  • [+meinplatzhalter:gt=`2`:then=`Ja`:else=`Nein`+]
  • [+meinplatzhalter:lt=`1`:then=`Ja`:else=`Nein`+]

Werden alle Nein zurückgeben.

Eigene Modifikatoren

Ein Modifikator ist praktisch nur ein Ersatz für ein einfaches Snippet, um einen übergebenen Wert auf irgendeine Weise zu verarbeiten. Du kannst ganz einfach eigene Modifikatoren/Mini-Snippets anlegen, indem du Snippets im MODx-Resource-Manager hinzufügst.

Weil Modifikatoren keinen komplizierten Code brauchen, gibt es nur zwei Parameter, die der PHx-Parser übergeben wird:

  1. $output
    der aktuelle Wert der Variable die modfiziert werden soll
  2. $options
    (optional) ein String mit zusätzlichen Parametern die ein Modifikator evtl. benötigt.

Um das ganze ein bisschen zu vertiefen, hier noch ein paar kurze Beispiele. Wir gehen davon aus, dass meinplatzhalter als "test" definiert ist:


[+meinplatzhalter:meinmodifikator+]
  • $output ist jetzt "test"
  • $options enthält Nichts weil keine angegeben wurden.

[+meinplatzhalter:meinmodifikator=`meine optionen`+]
  • $output ist immer noch "test"
  • $options enthält jetzt "meine optionen".

Andere Variablen (für erfahrene Benutzer)

  • $input enthält den ersten Wert, der übergeben wurde.
  • $condition ist ein Array, der die Bedingungen enthält, aus denen ein Ausdruck aufgebaut ist (0, 1, || und &&)

Eigene Modifikatoren anlegen

Beispiel: Ich liebe MODx

Mit dem, was wir bisher gelernt haben, werden wir jetzt einen eigenen Modifikator anlegen. Wir machen es mal ganz einfach: Alles was der Modifikator können soll, ist "weil ich MODx liebe" an einen übergeben Wert anzuhängen.

  1. Melde dich am Manager an
  2. Gehe zu Ressourcen -> Ressourcen verwalten -> Snippets
  3. Klick auf "Neues Snippet"
  4. Als Snippet-Namen geben wir "'phx:herzchen'" ein
    damit PHx weiß, dass ein Snippet als Modifikator angelegt wurde, müssen diese mit "phx:" beginnen. Der nachfolgende String (keine Leerzeichen) ist der Name des Modifikators. In unserem Fall müssen wir also :herzchen an den Platzhalter anhängen [+meinplatzhalter:herzchen+].
  5. Jetzt legen wir den Code für den Modifikator im Snippet an. Folgendes sollte funktionieren:
    1. <?php
    2. $neuerWert = $output. " weil ich MODx liebe";
    3. return $neuerWert;
    4. ?>
  6. Klick Speichern und schon sind wir fertig.

Beispiel: I liebe MODx noch mehr

Ähnlich wie in Beispiel 1 werden wir jetzt einen Modifikator anlegen, der das selbe macht, AUSSER wenn wir Optionen angeben, dann sollen diese hinzugefügt werden.

  1. Melde dich am Manager an
  2. Gehe zu Ressourcen -> Ressourcen verwalten -> Snippets
  3. Klick auf "Neues Snippet"
  4. Als Snippet-Namen geben wir "'phx:verlobt'" ein
    damit PHx weiß, dass ein Snippet als Modifikator angelegt wurde, müssen diese mit "phx:" beginnen. Der nachfolgende String (keine Leerzeichen) ist der Name des Modifikators. In unserem Fall müssen wir also :herzchen an den Platzhalter anhängen [+meinplatzhalter:herzchen+].
  5. Jetzt legen wir den Code für den Modifikator im Snippet an. Folgendes sollte funktionieren:
    1. <?php
    2. $standardWert = " weil ich MODx liebe";
    3. if (strlen($options)>0) {
    4. $neuerWert = $output . $options;
    5. } else {
    6. $newvalue = $neuerWert . $standardValue;
    7. }
    8. return $neuerWert;
    9. ?>
  6. Klick Speichern und schon sind wir fertig.

Gespendete

In De:PHx/GespendeteModifikatoren findest du eine Liste von Modifikatoren, die andere Benutzer programmiert haben und die du verwenden kannst.

Tipps und Tricks

PHx in Nicht-PHx-Snippet-Templates verwenden

Die meisten Snippets verarbeiten ihre Templates intern, bevor sie das Ergebnis an MODx weitergeben. Solange in der Snippet-Beschreibung nicht steht, dass es PHx verwendet, ist es nicht möglich die Modifikatoren direkt zu verwenden. Du kannst PHx trotzdem benutzen, indem du einen speziellen Modifikator namens phx:input einsetzt.

Das hier wird nicht mit einem Nicht-PHx-Snippet funktionieren:

[+meinplatzhalter:modifikator1:modifikator2+]

Versuchs mal so:

[+phx:input=`[+meinplatzhalter+]`:modifikator1:modifikator2+]

Das wird auch mit einem Nicht-PHx-Snippet funktionieren. Eventuell gibt es einige Einschränkungen - das hängt von der Programmlogik des Snippets ab.

Technische Dokumentation

Dieser Teil der Dokumentation ist nicht für normale MODx-Benutzer gedacht sondern soll einmal kurz aufzeigen wir PHx funktioniert.

PHx benutzt das OnParseDocument Ereignis (MODx API), um die Ausgabe zu verarbeiten. OnParseDocument wird vor allen normalen MODx-Elementen aufgerufen - PHx arbeitet also mit der Rohfassung des Templates und der Ausgabe und durchläuft dabei die folgenden Etappen:

  1. wir starten nur, wenn wir noch nicht die maximale Anzahl an Durchläufen erreicht haben
  2. ein Hash wird aus dem Inhalt des Dokuments erstellt, um zu prüfen ob sich im späteren Verlauf etwas verändert
  3. Das Dokument wird mit einigen Filtern vorbereitet, z.B. um eckige Klammern zu escapen, die nicht zu MODx gehören
  4. Jetzt geht es in den Haupt-Parser
    1. ein Hash wird aus dem Inhalt des Dokuments erstellt, um zu prüfen ob sich im späteren Verlauf etwas verändert
    2. Chunks werden zusammengeführt mergeChunkContent (MODx API)
    3. Snippets werden mit einem hochkomplexen regulären Ausdruck erkannt, der auch verschachtelte Tags verarbeiten kann
      1. Snippet-Aufrufe, die nicht verschachtelt sind, werden verarbeitet
      2. Alle zutreffenden Aufrufe werden auf (nicht-)gecachte Ausgabe geprüft, verarbeitet und an evalSnippets (MODx API) übergeben
    4. Die Ausgabe wird in das Dokument eingesetzt
    5. Snippets werden mit einem hochkomplexen regulären Ausdruck erkannt, der auch verschachtelte Tags verarbeiten kann
      1. Dokument/Template-Variablen werden mit mergeDocumentContent (MODx API) geholt
      2. Einstellungs-Variablen werden mit mergeSettingsContent (MODx API) geholt
      3. Die Ausgabe von Platzhaltern wird in folgender Reihenfolge geholt: PHx, MODx.
      4. Wenn der gewünschte Platzhalter nicht belegt ist, wird er für den aktuellen Durchlauf ignoriert (Original wird wieder eingesetzt)
    6. Jeder erkannte Tag, die mit Modifikatoren, werden an den Filter übergeben und entsprechend ersetzt
    7. Das Endergebnis aller Tags wird jetzt in das Dokument eingesetzt
    8. ein Hash wird aus dem Inhalt des Dokuments erstellt, um zu prüfen ob sich im späteren Verlauf etwas verändert
    9. Wenn wir noch nicht die maximale Anzahl an Durchläufen erreicht haben und sich der Hash verändert hat, wird die aktuelle Ebene wiederholt (Durchläufe+1)
  5. Die vorher escapten Klammern werden wieder zurückgewandelt
  6. Die Tags, die immer noch unersetzt vorhanden (also gar nicht aufgelöst werden konnten) sind, werden von der Ausgabe entfernt
    1. ein Hash wird aus dem Inhalt des Dokuments erstellt, um zu prüfen ob sich etwas verändert hat
  7. Wenn sich etwas verändert hat wird die aktuelle Ebene komplett wiederholt
  8. Falls aktiviert die Parser-Schritte in das Protokoll schreiben
  9. Die neue Ausgabe an MODx zurückgeben

Nachdem PHx alles abgearbeitet hat kann man zu 99% sicher sein, dass für MODx nicht ein einziger Tag zum verarbeiten übrig ist. Man könnte also sagen, dass PHx die Kernfunktionalität von MODx ersetzt (mit einer noch flexibleren Technik, die sich um das Zusammenführen kümmert). Trotzdem werden die einzelnen Elemente immer noch von den entsprechenden MODx-Funktionen verarbeitet.

Personal tools