Revision e87d47c3
Von Moritz Bunkus vor mehr als 8 Jahren hinzugefügt
doc/help_system.md | ||
---|---|---|
1 |
# Entwicklerdokumentation kivitendo-Hilfesystem |
|
2 |
|
|
3 |
Im Layout wird immer ein Hilfe-Link gerendert. Dieser öffnet ein Popupfenster und ruft darin die Action `Help/show` auf. Ihr wird eine Kontextinformation übergeben, mit der der Controller entscheiden kann, welche Hilfeseite angezeigt wird. Diese Kontextinformation wird automatisch aus dem aktuellen Controller und der aktuellen Action abgeleitet, kann aber im Controller überschrieben werden. |
|
4 |
|
|
5 |
## Popup-Fenster |
|
6 |
|
|
7 |
Hilfetexte werden in einem Popup-Fenster angezeigt. Das Link-Target für dieses Popup lautet `_kivitendo_help`. |
|
8 |
|
|
9 |
## Kontextinformationen |
|
10 |
|
|
11 |
Die Kontextinformationen werden normalerweise aus dem aktuellen Controller und der aktuellen Action erzeugt. Sie bestehen aus zwei Elementen, die durch einen `/` voneinander getrennt werden. Sie haben das Format `controller/action`. |
|
12 |
|
|
13 |
Jedes Element der Kontextinformationen darf dabei nur aus den folgenden Zeichen bestehen: |
|
14 |
|
|
15 |
* Buchstaben `a-z` und `A-Z` |
|
16 |
* Ziffern `0-9` |
|
17 |
* Die Zeichen `_` und `-` |
|
18 |
|
|
19 |
### Speichern des aktuellen Controllers und der aktuellen Action |
|
20 |
|
|
21 |
Um Kontextinformationen automatisch erzeugen zu können, wird bei jedem Aufruf der aktuelle Controller und die aktuelle Action im globalen Objekt `$::request` in den Methoden `controller` bzw. `action` gespeichert. |
|
22 |
|
|
23 |
Die Methode `controller` enthält dabei nur den Basisnamen des Controllers, beispielsweise `BackgroundJob` für neuen Controller-Stil (Datei `SL/Controller/BackgroundJob.pm`) bzw. `oe` für alten Code (Datei `bin/mozilla/oe.pl`). |
|
24 |
|
|
25 |
Die Action enthält ebenfalls nur den Basisnamen für neue Controller (also z.B. `show`, wenn im Controller `action_show` aufgerufen wird) bzw. den bereits rückübersetzen Namen für alte Controller (z.B. `update`, wenn im Rechnungs-Controller der Button mit der Beschriftung `Erneuern` gedrückt wurde). Falls bei einem alten Controller der Dispatch-Mechanismus genutzt wird, so enthält `action` bereits den Namen der letztlich aufgerufenen Funktion und nicht `dispatcher`. |
|
26 |
|
|
27 |
### Überschreiben von Kontextinformationen |
|
28 |
|
|
29 |
Oftmals ist es erwünscht, dass mehrere Actions denselben Hilfetext erhalten. Typische Beispiele: die Funktionen `add`, `edit` und `update` sowie potenziell `save`, `create`, `update`. Hierfür kann eine Action den Hilfekontext manuell setzen. Das muss geschehen, bevor das Layout gerendert wird; de facto also vor dem ersten Aufruf von `$::form->header`. |
|
30 |
|
|
31 |
Das Überschreiben unterscheidet sich für neue und alte Controller. Neue Controller definieren ihre Abweichungen deklarativ mit einem Aufruf analog zum Folgenden: |
|
32 |
|
|
33 |
package SL::Controller::SomeController; |
|
34 |
|
|
35 |
use parent qw(SL::Controller::Base); |
|
36 |
|
|
37 |
__PACKAGE__->override_help_contexts( |
|
38 |
new => 'edit', # Verlinkung auf aktuellen Controller |
|
39 |
list => 'BackgroundJob/edit', # Verlinkung auf anderen Controller |
|
40 |
); |
|
41 |
|
|
42 |
Alte Controller müssen innerhalb ihrer Action den Kontext wie folgt setzen, damit die Hilfefunktion auf die Seite für den Controller `other_controller` und die Action `other_action` verlinkt: |
|
43 |
|
|
44 |
$::request->help_system->context("other_controller/other_action"); |
|
45 |
|
|
46 |
Alternativ kann bei beiden Arten von Controller mit symbolischen Links im Dateisystem gearbeitet werden, die auf die gewünschten Seiten verweisen. |
|
47 |
|
|
48 |
### Deaktivieren des Hilfe-Links |
|
49 |
|
|
50 |
Bei manchen Actions mag es gewünscht sein, den Hilfelink komplett zu verstecken. Dazu muss man den Hilfekontext mit einem leeren String überschreiben (`undef` funktioniert nicht): |
|
51 |
|
|
52 |
# Im Layout wird hiermit kein Hilfe-Link angezeigt: |
|
53 |
$::request->help_system->context(""); |
|
54 |
|
|
55 |
## Speicherort für Hilfeseiten und Dateinamen |
|
56 |
|
|
57 |
Alle Hilfeseiten werden im Verzeichnisbaum `templates/webpages/help/content` abgelegt. Darunter gibt es eine klar strukturierte Hierarchie: |
|
58 |
|
|
59 |
1. Die erste Ebene ist die Sprache. Hier wird das übliche Zwei-Buchstaben-Kürzel genutzt. Deutsche Hilfeseiten werden also im Unterbaum `de` abgelegt. |
|
60 |
2. Die zweite Ebene entspricht dem Controllernamen. |
|
61 |
3. Für jede Action existiert dann eine Datei, deren Name die Action zzgl. Endung `.mmd` ist. |
|
62 |
|
|
63 |
Der vollständige Pfad für die deutsche Hilfeseite zur Seite zum Anlegen von Artikeln (Action `add` im Controller `ic`) lautet also `templates/webpages/help/content/de/ic/add.mmd`. |
|
64 |
|
|
65 |
Allgemeine Hilfeseiten, die keiner Action zugeordnet sind, sind ebenfalls möglich. Deren Dateinamen müssen dabei mit einem Unterstrich beginnen, um einem potenziellen Namenskonflikt aus dem Weg zu gehen. Dabei nimmt der Namen `_index.mmd` eine besondere Bedeutung ein, die weiter Unten im Abschnitt über die Suchreihenfolge genauer erläutert wird. |
|
66 |
|
|
67 |
**Achtung:** Das Basisverzeichnis `templates/webpages/help` ist nur für HTML-Vorlagen gedacht, die direkt vom Controller `Help` benutzt werden. |
|
68 |
|
|
69 |
## Suchreihenfolge für Hilfeseiten |
|
70 |
|
|
71 |
### Beschreibung der Reihenfolge |
|
72 |
|
|
73 |
Der Hilfe-Controller zeigt nicht ausschließlich die zum Kontext gehörende Seite an, sondern auch allgemeinere, falls die exakt gewünschte Variante nicht gefunden wird. Die Suchreihenfolge sieht wie folgt aus (der erste Treffer gewinnt): |
|
74 |
|
|
75 |
1. im Unterbaum der Benutzersprache: der exakte Dateiname |
|
76 |
2. im Unterbaum der Benutzersprache: für den Controller die Datei `_index.mmd` als Übersichtsseite des Controllers |
|
77 |
3. im Unterbaum der Sprache Deutsch: der exakte Dateiname |
|
78 |
4. im Unterbaum der Sprache Deutsch: für den Controller die Datei `_index.mmd` als Übersichtsseite des Controllers |
|
79 |
5. im Unterbaum der Benutzersprache die Datei `_index.mmd` als Startseite der kivitendo-Hilfe |
|
80 |
6. im Unterbaum der Sprache Deutsch die Datei `_index.mmd` als Startseite der kivitendo-Hilfe |
|
81 |
|
|
82 |
Wird keine dieser Dateien gefunden, so wird eine Fehlermeldung ausgegeben. Da eine deutsche Hilfe-Startseite mitgeliefert wird, sollte das aber nie passieren. |
|
83 |
|
|
84 |
### Beispiel |
|
85 |
|
|
86 |
Wenn eine Benutzerin mit englischer Oberflächensprache die Hilfe im Controller `CustomerVendor` bei Action `edit` aufruft, so werden also nacheinander die folgenden Dateien gesucht (die Ziffern entsprechen den oben genannten Nummern): |
|
87 |
|
|
88 |
1. `templates/webpages/content/en/CustomerVendor/edit.mmd` |
|
89 |
2. `templates/webpages/content/en/CustomerVendor/_index.mmd` |
|
90 |
3. `templates/webpages/content/de/CustomerVendor/edit.mmd` |
|
91 |
4. `templates/webpages/content/de/CustomerVendor/_index.mmd` |
|
92 |
5. `templates/webpages/content/en/_index.mmd` |
|
93 |
6. `templates/webpages/content/de/_index.mmd` |
|
94 |
|
|
95 |
## Layout und Styling |
|
96 |
|
|
97 |
### Layoutsystem |
|
98 |
|
|
99 |
Aktuell werden Hilfeseiten ohne das kivitendo-übliche Layout (Kopfzeile, Menüsystem) gerendert. |
|
100 |
|
|
101 |
### Styling |
|
102 |
|
|
103 |
Das Styling kann über CSS geregelt werden. Zusätzlich zum von der BenutzerIn ausgewählten Stylesheet wird die CSS-Datei `help.css` eingebunden, die bereits in minimaler Version existiert. |
|
104 |
|
|
105 |
In der Hilfe-Ausgabe selber besitzt das `<body>`-Element die CSS-Klasse `kivitendo-help`. Darüber können CSS-Regeln alle Elemente greifen. |
|
106 |
|
|
107 |
## Zu implementierende Features, zu behebende Bugs |
|
108 |
|
|
109 |
Die folgenden Dinge müssen in `Text::MultiMarkup` implementiert bzw. behoben werden: |
|
110 |
|
|
111 |
### Codeblöcke mit Backticks |
|
112 |
|
|
113 |
Codeblöcke können normalerweise auch ohne Einrückung gesetzt werden, wenn sie vorne und hinten mit je einer Zeile mit drei Backticks eingeschlossen wird. Dies wird von `Text::MultiMarkdown` momentan nicht unterstützt und als eingebetteter Code erkannt. |
|
114 |
|
|
115 |
### Zeilenumbrüche |
|
116 |
|
|
117 |
Einfache Zeilenumbrüche im Fließtext (also keine Leerzeile danach) werden in der Ausgabe nicht als <br/> gerendert, sodass gar dort gar keine Zeilenumbrüche zu sehen sind. |
|
118 |
|
|
119 |
Auf Github existiert dafür auch ein [pull request](https://github.com/bobtfish/text-multimarkdown/pull/17). |
|
120 |
|
|
121 |
### Hervorhebungsblöcke |
|
122 |
|
|
123 |
Ein Block soll hervorgehoben darsgestellt werden (wie z.B. solche »Achtung!«- oder »Information«-Blöcke in Textbüchern zu Programmiersprachen), wenn sie vorhe und hinten mit zwei Gleichheitszeichen eingeschlossen werden. Das unterstützt `Text::MultiMarkdown` momentan gar nicht. |
|
124 |
|
|
125 |
### Tabellen und <colgroup> |
|
126 |
|
|
127 |
Für Tabellen werden zwar <col>-Elemente ausgegeben, diese stecken allerdings direkt in <table> und nicht in einem <colgroup>-Element. |
|
128 |
|
|
129 |
### Einfachere Hilfe-Links |
|
130 |
|
|
131 |
Links auf andere Hilfe-Texte müssen momentan mühsam als `controller.pl?action=Help/show&context=WANTED_CONTROLLER/WANTED_ACTION` angegeben werden. Schöner wäre es, wenn man einfach als Linkziel `help:WANTED_CONTROLLER/WANTED_ACTION` angeben könnte. |
|
132 |
|
|
133 |
## Zukünftige Erweiterungsmöglichkeiten |
|
134 |
|
|
135 |
### Kommentare von BenutzerInnen |
|
136 |
|
|
137 |
Ursprünglich wurde überlegt, die Dokumentation selber von allen BenutzerInnen bearbeitbar zu haben. Dies ist mit der aktuellen Implementation nicht mehr geplant. Es wäre aber möglich, Kommentare von BenutzerInnen zuzulassen, ähnlich wie es auch Seiten wie z.B. [PostgreSQL](http://www.postgresql.org/docs/9.5/interactive/index.html) machen. Folgendes Modell wäre eine Möglichkeit: |
|
138 |
|
|
139 |
* Angemeldete BenutzerInnen bekommen eine Kommentar-Form mit Vorschau-Funktion, in der ebenfalls mit Markdown Sachen eingegeben werden können. |
|
140 |
* Die Kommentare werden in der Datenbank gespeichert und mit der BenutzerIn verknüpft. |
|
141 |
* BenutzerInnen können eigene Kommentare immer editieren und löschen. |
|
142 |
* Über ein zusätzliches Gruppenrecht kann weiteren BenutzerInnen das Recht gewährt werden, Kommentare beliebiger BenutzerInnen zu bearbeiten oder zu löschen (Moderatorfunktion). |
|
143 |
|
|
144 |
### Seitenindizierung |
|
145 |
|
|
146 |
Eine Indizierung würde ermöglichen, Übersichtsseiten zu erzeugen, die automatisch auf alle vorhandenen Seiten oder z.B. nur alle Unterseiten eines Controllers zu verlinken. Das kann entweder statisch über ein Script geschehen (analog dazu, wie die Übersetzungen mit `locales.pl` erzeugt werden), oder aber zur Laufzeit durch spezielle Methoden im Controller `Help`. Letztere sollten zwecks Performance gecachet werden. |
|
147 |
|
|
148 |
### Suchfunktionen |
|
149 |
|
|
150 |
Eine Suchfunktion über die komplette Hilfe wäre hilfreich. Hierzu müsste aber, ähnlich wie bei der Seitenindizierung, ein Volltextindex gebaut werden. Dafür gibt es Produkte, die sich nur darum kümmern (z.B. [Sphinx](http://sphinxsearch.com/), [Solr](http://lucene.apache.org/solr/) oder [Elasticsearch](https://github.com/elastic/elasticsearch)). |
|
151 |
|
|
152 |
### Unterstützung weiterer Markdown-Syntax-Varianten |
|
153 |
|
|
154 |
Hier ist das Perl-Modul `Text::MultiMarkdown` zu erweitern. Mindestens die folgenden Funktionen werden bisher noch nicht unterstützt bzw. sind noch ungetestet: |
|
155 |
|
|
156 |
* Markierung wichtiger Blöcke, die gesondert vom Rest des Texts abgehoben werden; eine Syntax dafür ist das Einschließen in `== … ==` |
|
157 |
* Einbinden von Bildern |
|
158 |
* Workflow-Abbildung |
|
159 |
|
|
160 |
### Auto-Verlinking für Artikel in anderen Sprachen |
|
161 |
|
|
162 |
Falls mal wirklich Hilfetexte in anderen Sprachen geschrieben werden, so könnte man den Mechanismus anpassen, der nicht existierende Seiten behandelt. Existiert eine Seite in der Benutzersprache nicht aber in anderen Sprachen, so könnte dies angezeigt und der BenutzerIn die Möglichkeit gegeben werden, diesen Artikel in anderen Sprachen anzuzeigen. |
|
163 |
|
|
164 |
Das könnte auch für existierende Artikel gemacht werden. Solche Sprachverlinkung sollte automaisch erfolgen. |
|
165 |
|
|
166 |
### Automatische Inhaltsverzeichnisse |
|
167 |
|
|
168 |
Beim Anzeigen einer Seite könnte automatisch ein Inhaltsverzeichnis aus allen Überschriften erstellt und oben angezeigt werden. Viele Wiki-Systeme haben z.B. so eine Funktion. |
Auch abrufbar als: Unified diff
Hilfesystem: Entwicklerdokumentation