Fügt Markdown-Formatierungs-Unterstützung zu osTicket 1.18.x Ticket-Threads hinzu mit benutzerfreundlicher Editor-Oberfläche, Live-Vorschau und automatischer Format-Erkennung.
Perfekt für Support-Teams, die die Einfachheit von Markdown gegenüber HTML-WYSIWYG-Editoren bevorzugen, besonders für technische Dokumentation, Code-Snippets und API-Integrationen.
| Anforderung | Version | Hinweise |
|---|---|---|
| osTicket | 1.18.x | Plugin erweitert ThreadEntryBody-Klasse |
| PHP | 7.4+ | Empfohlen: PHP 8.1+ für beste Performance |
| jQuery | Beliebig | In osTicket standardmäßig enthalten |
| Parsedown | 1.7.4 | Im Plugin enthalten (vendor/) |
markdown-support-Ordner nach /include/plugins/ auf deinem osTicket-Server hochFinaler Pfad: /pfad/zu/osticket/include/plugins/markdown-support/
cd /pfad/zu/osticket/include/plugins
git clone https://github.com/markus-michalski/osticket-markdown-support.git
Das Plugin konfiguriert automatisch den Static-Asset-Zugriff (.htaccess-Update).
| Einstellung | Beschreibung | Standard |
|---|---|---|
| Markdown-Unterstützung aktivieren | Markdown-Formatierung global aktivieren/deaktivieren | ✅ An |
| Standard Thread-Entry-Format | Standard-Format für neue Einträge | Markdown |
| Format-Wechsel erlauben | Nutzer können zwischen Text/HTML/Markdown wechseln | ✅ An |
| Markdown-Syntax auto-konvertieren | Automatisch Markdown-Muster erkennen | ❌ Aus |
| Live-Vorschau anzeigen | Echtzeit-Vorschau-Bereich anzeigen | ✅ An |
| Markdown-Toolbar anzeigen | Formatierungs-Buttons anzeigen | ✅ An |
Tipp: Aktiviere "Markdown-Syntax auto-konvertieren", wenn du Tickets per API mit Markdown-Inhalten erstellst, aber keinen expliziten Format-Parameter setzt.
| Button | Markdown | Shortcut | Beschreibung |
|---|---|---|---|
| B | **text** |
Strg+B | Text fett |
| I | *text* |
Strg+I | Text kursiv |
| H | ## text |
Strg+H | Überschrift (wechselt H1-H6) |
| 🔗 | [text](url) |
Strg+K | Link einfügen |
<> |
`code` |
- | Inline-Code |
{ } |
```lang |
- | Code-Block |
| • | - item |
- | Unsortierte Liste |
| 1. | 1. item |
- | Sortierte Liste |
| " | > quote |
- | Blockzitat |
| — | --- |
- | Horizontale Linie |
Der Live-Vorschau-Bereich zeigt Echtzeit-Rendering deines Markdown-Inhalts. Aktualisiert automatisch mit 500ms Debouncing für optimale Performance.
| Shortcut | Aktion |
|---|---|
| Strg+B | Text fett machen |
| Strg+I | Text kursiv machen |
| Strg+K | Link einfügen |
| Strg+H | Überschrift einfügen (wechselt H1-H6) |
| Tab | Code einrücken |
# Überschrift 1
## Überschrift 2
### Überschrift 3
**Fetter Text**
*Kursiver Text*
~~Durchgestrichen~~
`Inline-Code`
- Unsortierte Liste
- Element 2
- Unterelement
1. Sortierte Liste
2. Element 2
[Link-Text](https://example.com)

```php
<?php
echo \"Hallo Welt!\";
?>
```
> Dies ist ein Zitat
> Über mehrere Zeilen
| Spalte 1 | Spalte 2 |
|----------|----------|
| Wert 1 | Wert 2 |
Beim Erstellen von Tickets über die osTicket API kannst du das format-Feld verwenden, um Markdown anzugeben:
POST /api/tickets.json
{
\"name\": \"Max Mustermann\",
\"email\": \"max@example.com\",
\"subject\": \"Ticket mit Markdown\",
\"message\": \"## Problem\\\\n\\\\nDer Server antwortet **nicht**.\\\\n\\\\n```bash\\\\nping server.example.com\\\\n```\",
\"format\": \"markdown\"
}
Falls deine API-Integration kein format-Feld sendet, aber Markdown-Syntax enthält:
**fett**, *kursiv*# Überschriften`code`[Links](url)Erkennungs-Schwellenwert: Mindestens 2 Markdown-Muster pro 100 Zeichen
| Format-Wert | Beschreibung |
|---|---|
text |
Plain-Text (keine Formatierung) |
html |
HTML-WYSIWYG-Editor |
markdown |
Markdown-Editor mit Live-Vorschau |
Symptome:
Lösung:
Datei-Berechtigungen prüfen:
chmod 755 /pfad/zu/osticket/include/plugins/markdown-support
chmod 644 /pfad/zu/osticket/include/plugins/markdown-support/*.php
Symptome:
.js/.css-DateienLösung:
Das Plugin sollte automatisch /include/.htaccess aktualisieren. Falls Assets nicht laden:
/include/.htaccess prüfen - sollte enthalten:<FilesMatch \"\\.(js|css|map|json|png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf|eot|otf)$\">
Allow from all
</FilesMatch>
/include/-VerzeichnisSymptome:
Prüfen:
Error-Log überprüfen:
tail -f /pfad/zu/osticket/include/ost-errors.log
Häufige Probleme:
Parsedown.php not found → Plugin erneut von Releases herunterladenThreadEntryBody class not found → osTicket-Versions-Mismatch (benötigt 1.18.x)Class 'ReflectionClass' not found → PHP-Reflection-Extension fehltPlugin-Konfiguration prüfen:
Symptome:
Lösung:
Das Plugin nutzt einen MutationObserver, um dynamisch geladene Textareas zu erkennen. Falls der Editor nicht erscheint:
// In Browser-Konsole:
typeof jQuery // Sollte \"function\" zurückgeben
Symptome:
Erklärung:
Die Live-Vorschau nutzt JavaScript-Parsedown (Marked.js) für Performance, während das finale Rendering PHP-Parsedown nutzt. Kleine Unterschiede können auftreten bei:
Lösung:
Das finale Ticket ist maßgeblich. Die Live-Vorschau ist ein Hilfsmittel, garantiert aber keine 100%-ige Übereinstimmung.
Symptome:
Erklärung:
Das Plugin nutzt 2-Schicht-Sicherheit:
Verhalten:
<script> wird entfernt<iframe> wird entferntonclick= und andere Event-Handler werden entferntWenn HTML benötigt wird:
Symptome:
Prüfen:
Plugin-Konfiguration:
JavaScript-Initialisierung:
MarkdownEditor initialized suchenSzenario:
Lösung:
Das Plugin ändert keine bestehenden Tickets. Um alte Tickets zu konvertieren:
-- Nur als Beispiel - BACKUP ERSTELLEN!
UPDATE ost_thread_entry
SET format = 'markdown'
WHERE format = 'text'
AND body LIKE '%**%' -- Nur Einträge mit Markdown-Syntax
Plugin-Struktur:
markdown-support/
├── plugin.php # Plugin-Metadaten
├── class.MarkdownPlugin.php # Haupt-Plugin-Klasse
├── config.php # Plugin-Konfiguration
├── class.MarkdownThreadEntryBody.php # ThreadEntryBody-Extension
├── vendor/
│ └── Parsedown.php # Parsedown-Library (1.7.4)
├── assets/
│ ├── css/
│ │ └── markdown-editor.css # Editor-Styles
│ └── js/
│ ├── markdown-editor.js # Editor-Initialisierung
│ └── marked.min.js # JavaScript-Markdown-Parser
└── tests/
└── Unit/ # PHPUnit-Tests
Reflection-Based Extension:
Das Plugin erweitert osTickets ThreadEntryBody-Klasse via PHP Reflection, um neue Format-Typen hinzuzufügen:
// class.MarkdownPlugin.php
$reflection = new ReflectionClass('ThreadEntryBody');
$property = $reflection->getProperty('formats');
$property->setAccessible(true);
$formats = $property->getValue(null);
$formats['markdown'] = 'Markdown';
$property->setValue(null, $formats);
Vorteile:
Parsedown SafeMode:
<script>, <iframe>, <object> etc.Format::sanitize:
onclick, onerror)CSRF-Schutz:
Input-Validierung:
JavaScript-Debouncing:
Lazy-Loading:
MutationObserver:
Caching:
Aktuell: Parsedown 1.7.4 (im Plugin enthalten)
Warum nicht Parsedown 2.0?
Update-Pfad:
# Falls du auf Parsedown 2.0 upgraden möchtest (optional):
cd /pfad/zu/osticket/include/plugins/markdown-support
composer require erusev/parsedown:^2.0
# Dann: class.MarkdownThreadEntryBody.php anpassen
F: Funktioniert Markdown in Client-Portal?
A: Ja! Markdown-formatierte Ticket-Antworten werden korrekt im Client-Portal gerendert. Clients können jedoch nicht im Markdown-Format schreiben (nur Staff).
F: Kann ich Markdown als Standard-Format für alle neuen Tickets setzen?
A: Ja, in der Plugin-Konfiguration:
F: Was passiert, wenn ich das Plugin deaktiviere?
A: Bestehende Markdown-formatierte Einträge werden als roher Markdown-Text angezeigt (nicht gerendert). Keine Daten gehen verloren - bei erneutem Aktivieren werden sie wieder korrekt gerendert.
F: Kann ich Markdown und HTML im gleichen Ticket mischen?
A: Ja, jede Ticket-Antwort kann ihr eigenes Format haben. Du kannst z.B. die erste Antwort in HTML und die zweite in Markdown schreiben.
F: Unterstützt das Plugin GitHub-Flavored Markdown (GFM)?
A: Teilweise. Das Plugin nutzt Standard-Parsedown, das folgende GFM-Features unterstützt:
```)- [ ]) - nicht unterstützt:smile:) - nicht unterstütztF: Wie füge ich Syntax-Highlighting zu Code-Blöcken hinzu?
A: Parsedown unterstützt Sprach-Identifikatoren, aber kein automatisches Syntax-Highlighting. Für Highlighting:
class=\"language-php\" markierenF: Kann ich HTML innerhalb von Markdown verwenden?
A: Nein, aus Sicherheitsgründen. Parsedown läuft im SafeMode, der Inline-HTML blockiert. Falls HTML benötigt wird, nutze den HTML-Format-Editor.
F: Wie erstelle ich mehrzeilige Code-Blöcke?
A: Nutze Triple-Backticks mit optionalem Sprach-Identifier:
```php
<?php
echo \"Hallo Welt!\";
?>
```
F: Wie sende ich Markdown-formatierte Tickets per API?
A: Setze das format-Feld auf \"markdown\":
curl -X POST https://osticket.example.com/api/tickets.json \\
-H \"X-API-Key: YOUR_API_KEY\" \\
-H \"Content-Type: application/json\" \\
-d '{
\"name\": \"API User\",
\"email\": \"api@example.com\",
\"subject\": \"Ticket mit Markdown\",
\"message\": \"## Problem\\\\n\\\\n**Server** ist offline.\",
\"format\": \"markdown\"
}'
F: Was passiert, wenn ich kein Format-Feld sende?
A: Das Plugin nutzt das konfigurierte Standard-Format. Falls "Markdown-Syntax auto-konvertieren" aktiviert ist, wird Markdown-Syntax automatisch erkannt.
F: Kann ich bestehende Tickets per API auf Markdown umstellen?
A: osTicket API bietet kein direktes Update von Thread-Entry-Formaten. Du müsstest SQL direkt nutzen:
UPDATE ost_thread_entry
SET format = 'markdown'
WHERE thread_id = 123 AND id = 456;
F: Funktioniert das mit osTicket 1.17 oder älter?
A: Nein. Das Plugin benötigt osTicket 1.18.x für die ThreadEntryBody-Klassen-Struktur. ältere Versionen haben eine andere Thread-Entry-Architektur.
F: Ist es kompatibel mit anderen Plugins?
A: Meistens ja, aber Konflikte können auftreten mit:
ThreadEntryBody modifizierenF: Funktioniert es mit benutzerdefinierten osTicket-Themes?
A: Ja, das Plugin nutzt osTickets Standard-CSS-Klassen. Das Editor-CSS ist minimalistisch und sollte mit den meisten Themes funktionieren.
F: Ist es kompatibel mit PHP 8.x?
A: Ja! Das Plugin ist mit PHP 7.4, 8.0, 8.1, 8.2 und 8.3 getestet. CI-Pipeline testet alle Versionen.
F: Beeinträchtigt das Plugin die Ticket-Lade-Performance?
A: Minimal. Markdown-Parsing ist sehr schnell (~0.1ms pro Eintrag). Bei Tickets mit 100+ Antworten könnte ein kleiner Performance-Hit bemerkbar sein, aber vernachlässigbar.
F: Wie groß können Markdown-Einträge sein?
A: Parsedown hat keine Größenbeschränkung. osTickets Datenbank-Limit für ost_thread_entry.body ist MEDIUMTEXT (16 MB).
F: Wird Markdown-Rendering gecacht?
A: Nein, aktuell kein Caching. Jedes Mal, wenn ein Ticket geladen wird, wird Markdown neu gerendert. Für Hochlast-Systeme könnte ein Caching-Layer hinzugefügt werden.
Dieses Plugin wird unter der GNU General Public License v2 veröffentlicht, kompatibel mit osTicket Core.
Details siehe LICENSE.
Für Fragen oder Probleme erstelle bitte ein Issue auf GitHub:
Issue Tracker: https://github.com/markus-michalski/osticket-markdown-support/issues
Beim Melden von Problemen bitte angeben:
php -v)Entwickelt von Markus Michalski
Beiträge willkommen!
Siehe CHANGELOG.md für Versionshistorie.