From Ohmnibus.NET

PmWikiDe: Eigene Aktionen

Mit Kochbuchrezepten ist es möglich, eigene Seitenaktionen für PmWiki zu definieren. Der korrespondierende Kode wird ausgeführt, wenn ein Parameter wie in dem folgenden Beispiel angegeben wird:

http://www.pmwiki.org/wiki/MyGroup/MyPage?action=myaction

Mit einer solchen Aktion kann man die Anzeige und Behandlung der aktuellen Seite ändern - wie in den Standardaktionen edit oder print. Oder man kann viele Wikiseiten auf einmal manipulieren oder globale Aufgabe durchführen wie das Ändern der gespeicherten Textauszeichnungen aller Seiten in dieser Gruppe (Wehe!) oder Daten sammeln aus allen Seiten im Wiki. Abhängig von seinem Kode kann es sogar egal sein, mit welchem Seiten-Url man die Aktion aufruft wie bei der Standardaktion phpinfo.

Während ein Eigene Auszeichnungen vornehmlich bedeutungsvolle Textersetzungen an der aktuellen Seite vornehmen soll, wird eine Seitenaktion von einem Url-Parameter ausgelöst und kann deshalb in Verweis als Aufruf von PHP-Funktionen eingesetzt werden, mit Wirkung auf die aktuelle Seite oder auf das ganze Wiki, wie in diesem Beispiel:

[[{*$FullName}?action=myaction| do my action]]

do my action

Auf jeden Fall muss man sich klar machen, wenn man PMWikis eingebaute Funtionen für angepasste Aktionen (Benutzeraktionen) nutzen will, dass Kochbuchrezepte in die config.php eingefügt werden, welche früh während der Seitenbearbeitung aufgerufen wird. Das bedeutet, dass zu jenem Zeitpunkt viele Variablen der internen Funktionen (z. B. in pmwiki.php) noch gar nicht sauber initialisiert sind. Dadurch können sich diese Funktionen unerwartet verhalten, wenn sie direkt in den eingefügten Rezeptdateien aufgerufen werden. Man erinnere sich, dass auch Funktionen, die für angepasste Textauszeichnungen (Custom markups) benutzt werden, immer erst später in dem Prozess aufgerufen werden — Markup() berücksichtigt das. Analog kann man einen Aktionsbehandeler (action handler) nutzen, der PmWiki veranlasst, seinen Aktionskode zur rechten Zeit auszuführen, wenn alle internen Arbeiten erledigt sind.

Das folgende Beispiel zeigt, wie man eine Benutzeraktion myaction aufsetzen kann für den Url .../MyGroup/MyPage?action=myaction. Das folgende unsinnige, aber instruktive, Beispiel wird dem Text einer anderen Seite MyGroup.MyOtherPage ein 'x' voranstellen. Dann wird die Seite MyGroup.MyPage, die in dem Url steht, angezeigt.

$HandleActions['myaction'] = 'HandleMyAction';  # Wenn der Url 'action=myaction' enthält, 
                                                # rufe HandleMyAction zur rechen Zeit auf
$HandleAuth['myaction'] = 'admin';              # Authorisierungsebene $auth für HandleMyAction

function HandleMyAction($pagename, $auth) {     # Parameter (Signatur) der Handler-Funktion, die PmWiki erwartet
  global $Author;                               # aktuellen Benutzernamen behalten, z. B. für Seitenverlauf
  $old = RetrieveAuthPage('MyGroup.MyOtherPage', $auth);   # Alle Informationen der Seite MyGroup.MyOtherPage holen
  $new = $old;                                  # die Seiteninformationen, die unverändert bleiben, 
                                                # kopieren (z. B. Seitenverlauf)
  $new['text'] = "x".$old['text'];              # ... etwas am alten Text manipulieren
  $Author='myactionbot';                        # Autorname, der im Seitenverlauf für diese Manipulation 
                                                # eingetragen werden soll
  $pn='MyGroup.MyOtherPage';                    # nötig, weil UpdatePage nur mit Variablen (by reference) 
                                                # als Parameter aufgerufen werden darf
  UpdatePage($pn,$old,$new);                    # ändere die aktuelle Wikiseite
  HandleBrowse($pagename);                      # zeige die in dem Url angegebene Seite (z. B. MyGroup.MyPage) an
}

Anmerkungen:

UpdatePage('MyGroup.MyOtherPage',$old,$new), in einen PHP-Fehler münden.

UpdatePage() beenden, vielleicht nachdem man eine schlichte Statusmeldung ausgegeben hat, anstatt eine Wikiseite mit HandleBrowse() anzuzeigen.

Category: PmWiki Developer

<< | Dokumentationsindex | >>

Retrieved from http://www.ohmnibus.net/wiki/index.php?n=PmWikiDe.CustomActions
Page last modified on September 10, 2011, at 05:41 PM