Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision e87d47c3

Von Moritz Bunkus vor etwa 8 Jahren hinzugefügt

  • ID e87d47c366eaf3799eae9709b3b4e1406a38cbba
  • Vorgänger f770f74a
  • Nachfolger 8a0b9d38

Hilfesystem: Entwicklerdokumentation

Unterschiede anzeigen:

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