Individuelle OTOBO Modul- & Plugin-Entwicklung
Benötigen Sie maßgeschneiderte Funktionen oder Paket-Upgrades? Softoft entwickelt release-sichere Perl- & Frontend-Erweiterungen.
In diesem Artikel lernst du, wie du OTOBO direkt im Kern anpasst – über XML-Konfiguration, Perl-Module und Templates. Wir zeigen dir Schritt für Schritt, wie du ein eigenes „HelloWorld“-Modul ins System einbindest.
Alle Anpassungen liegen unterhalb deines OTOBO-Clones im Kernel/-Verzeichnis:
Kernel/├─ Config/Files/ # XML-Registrierungen│ └─ XML/├─ System/ # Geschäftslogik-Module (Core)├─ Modules/ # Frontend-Controller (Agent/Customer)├─ Output/HTML/Standard/ # Template Toolkit (TT)-Templates└─ Language/ # ÜbersetzungenNeue Module und Routen werden per XML registriert. Lege in Kernel/Config/Files/XML/ eine Datei HelloWorld.xml an:
<?xml version="1.0" encoding="UTF-8"?><otobo_config version="2.0" init="Application">
<!-- 1. Frontend-Modul registrieren --> <Setting Name="Frontend::Module###AgentHelloWorld" Required="1" Valid="1"> <Navigation>Frontend::Agent::ModuleRegistration</Navigation> <Value> <Item ValueType="FrontendRegistration"> <Hash> <Item Key="Group"><Array><Item>users</Item></Array></Item> <Item Key="Description" Translatable="1">HelloWorld Modul</Item> <Item Key="Title" Translatable="1">HelloWorld</Item> <Item Key="NavBarName">HelloWorld</Item> </Hash> </Item> </Value> </Setting>
</otobo_config>Erstelle in Kernel/System/HelloWorld.pm deine Logik:
package Kernel::System::HelloWorld;use strict;use warnings;our @ObjectDependencies = ();
sub new { my ($Type, %Param) = @_; return bless {}, $Type;}
sub GetHelloWorldText { my ($Self, %Param) = @_; return $Self->_FormatText(String => 'Hello World');}
sub _FormatText { my ($Self, %Param) = @_; return uc $Param{String};}
1;In Kernel/Modules/AgentHelloWorld.pm bindest du deine Logik ins Agent-Frontend ein:
package Kernel::Modules::AgentHelloWorld;use strict;use warnings;
sub new { bless {}, shift }
sub Run { my ($Self, %Param) = @_;
my $HelloObj = $Kernel::OM->Get('Kernel::System::HelloWorld'); my $LayoutObj = $Kernel::OM->Get('Kernel::Output::HTML::Layout'); my %Data;
$Data{Text} = $HelloObj->GetHelloWorldText();
return $LayoutObj->Header(Title => 'HelloWorld') . $LayoutObj->NavigationBar() . $LayoutObj->Output( TemplateFile => 'AgentHelloWorld', Data => \%Data, ) . $LayoutObj->Footer();}
1;Lege in Kernel/Output/HTML/Standard/AgentHelloWorld.tt folgendes Template an:
[% Data.Text %]
<p>Das ist dein selbst erstelltes HelloWorld-Modul!</p>Neu laden:
bin/otobo.Console.pl Maint::Config::RebuildCache leeren:
bin/otobo.Console.pl Maint::Cache::DeleteBrowser öffnen: Agent-Interface → Menü → „HelloWorld“
Kernel/Language/de_*.pm pflegen.Damit hast du eine solide Vorlage, um weitere Kern-Erweiterungen in OTOBO zu realisieren. Viel Spaß beim Entwickeln!
Individuelle OTOBO Modul- & Plugin-Entwicklung
Benötigen Sie maßgeschneiderte Funktionen oder Paket-Upgrades? Softoft entwickelt release-sichere Perl- & Frontend-Erweiterungen.
Anpassungen am OTOBO-Kernsystem werden primär im Kernel/-Verzeichnis vorgenommen, das die gesamte Geschäftslogik und Konfiguration beherbergt. Jedes Unterverzeichnis hat eine spezifische Funktion:
Kernel/Config/Files/XML/ ist der Ort, an dem neue Module, Routen und Systemeinstellungen über XML-Dateien registriert werden. Hier definierst du, wie OTOBO deine Erweiterungen erkennt und integriert.Kernel/System/ enthält die Core-Perl-Module, die die eigentliche Geschäftslogik und Datenverarbeitung implementieren. Dies sind die "Backend"-Komponenten deiner Erweiterung.Kernel/Modules/ beherbergt die Frontend-Controller, die die Interaktion mit der Benutzeroberfläche (Agenten- oder Kunden-Interface) steuern. Sie rufen die Geschäftslogik aus Kernel/System/ auf und bereiten Daten für die Darstellung vor.Kernel/Output/HTML/Standard/ ist für die Template-Toolkit-Templates zuständig, die die visuelle Ausgabe im Browser generieren. Hier wird festgelegt, wie die vom Frontend-Modul bereitgestellten Daten dem Benutzer präsentiert werden.Kernel/Language/ dient der Verwaltung von Übersetzungen für alle Texte, die in deinen Modulen und Templates verwendet werden.Quellen
Neue Frontend-Module in OTOBO werden über XML-Konfigurationsdateien registriert, die im Verzeichnis Kernel/Config/Files/XML/ abgelegt werden. Diese XML-Dateien definieren die Metadaten und Eigenschaften des Moduls, sodass OTOBO es im System erkennen und korrekt routen kann. Ein typisches Beispiel ist die Registrierung eines "HelloWorld"-Moduls, wie in der Dokumentation beschrieben. Hierfür wird eine Datei wie HelloWorld.xml erstellt, die eine <Setting>-Definition enthält.
Innerhalb dieser <Setting> wird der Name des Moduls (z.B. Frontend::Module###AgentHelloWorld) sowie wichtige Navigationsinformationen und Beschreibungen festgelegt. Dazu gehören die Group, die die Sichtbarkeit des Moduls für bestimmte Benutzergruppen steuert, eine Description und ein Title (beide Translatable="1" für Mehrsprachigkeit) und ein NavBarName, der festlegt, wie das Modul im Navigationsmenü erscheint. Diese XML-Konfiguration ist entscheidend, da sie OTOBO mitteilt, dass ein neues Modul existiert und wie es in die Benutzeroberfläche integriert werden soll. Ohne diese Registrierung würde OTOBO das Modul nicht finden und nicht korrekt aufrufen können.
Quellen
Um ein eigenes Core-Perl-Modul für die Geschäftslogik in OTOBO zu erstellen, legst du eine neue .pm-Datei im Verzeichnis Kernel/System/ an, beispielsweise Kernel/System/HelloWorld.pm. Jedes Perl-Modul beginnt mit der Deklaration des Pakets (package Kernel::System::HelloWorld;) und der Aktivierung von strict und warnings für eine saubere Code-Entwicklung.
Das Modul benötigt eine new-Methode, die als Konstruktor fungiert und eine Instanz des Moduls zurückgibt. In dieser Methode können Initialisierungen vorgenommen werden, obwohl sie im einfachen "HelloWorld"-Beispiel leer bleibt. Die eigentliche Geschäftslogik wird in weiteren Subroutinen implementiert. Zum Beispiel könnte eine Methode GetHelloWorldText definiert werden, die den gewünschten Text generiert. Es ist auch gängige Praxis, Hilfsmethoden (oft mit einem Unterstrich beginnend, z.B. _FormatText) zu erstellen, um Code zu strukturieren und wiederverwendbar zu machen. Diese Methoden können dann von anderen Modulen aufgerufen werden, um spezifische Aufgaben zu erledigen, wie das Formatieren von Strings oder das Abrufen von Daten. Wichtig ist, dass das Modul am Ende mit 1; abgeschlossen wird, um anzuzeigen, dass es erfolgreich geladen wurde.
Quellen
Die Einbindung der Geschäftslogik eines Core-Moduls in das OTOBO-Frontend erfolgt über ein Frontend-Modul, das im Verzeichnis Kernel/Modules/ erstellt wird, zum Beispiel Kernel/Modules/AgentHelloWorld.pm. Dieses Modul fungiert als Controller, der die Anfragen des Benutzers verarbeitet und die entsprechenden Aktionen ausführt.
Ein Frontend-Modul benötigt ebenfalls eine new-Methode und vor allem eine Run-Methode. Die Run-Methode ist der zentrale Einstiegspunkt, wenn das Modul über die URL aufgerufen wird. In dieser Methode werden folgende Schritte ausgeführt:
$Kernel::OM->Get() werden Instanzen anderer benötigter OTOBO-Objekte abgerufen, wie das zuvor erstellte Core-Modul (Kernel::System::HelloWorld) und das Layout-Objekt (Kernel::Output::HTML::Layout).$HelloObj->GetHelloWorldText()). Diese Daten werden in einem Hash (%Data) gesammelt.Header mit dem Seitentitel, die NavigationBar und den Footer. Der wichtigste Teil ist der Aufruf von $LayoutObj->Output(), der das entsprechende Template-Toolkit-Template (TemplateFile => 'AgentHelloWorld') lädt und die vorbereiteten Daten (Data => \%Data) an dieses Template übergibt.Quellen
Template-Toolkit-Templates (TT-Templates) in OTOBO werden erstellt, indem man eine .tt-Datei im Verzeichnis Kernel/Output/HTML/Standard/ ablegt, zum Beispiel Kernel/Output/HTML/Standard/AgentHelloWorld.tt. Diese Templates sind für die visuelle Darstellung der Daten im Browser zuständig und werden vom Frontend-Modul mit den benötigten Informationen befüllt.
Die Syntax von Template Toolkit ermöglicht es, dynamische Inhalte einfach in statisches HTML einzubetten. Daten, die vom Frontend-Modul über den Data-Hash übergeben werden, können im Template direkt über die Punktnotation angesprochen werden. Wenn das Frontend-Modul beispielsweise einen Hash %Data mit dem Schlüssel Text übergibt (z.B. $Data{Text} = 'Hello World';), kann dieser Wert im Template mit [% Data.Text %] ausgegeben werden.
Zusätzlich zu den dynamischen Platzhaltern können Templates auch statischen HTML-Inhalt oder andere Template-Toolkit-Direktiven enthalten, um die Struktur und das Design der Seite zu gestalten. Im "HelloWorld"-Beispiel wird neben dem dynamischen Text auch ein einfacher Absatz Das ist dein selbst erstelltes HelloWorld-Modul! hinzugefügt. Die Trennung von Logik (Perl-Module) und Präsentation (Templates) ist ein Kernprinzip von OTOBO und erleichtert die Entwicklung und Wartung von Erweiterungen erheblich.
Quellen
Nachdem ein neues Modul in OTOBO entwickelt wurde – bestehend aus XML-Konfiguration, Core-Modul, Frontend-Modul und Template –, sind einige entscheidende Schritte notwendig, um es im System sichtbar und funktionsfähig zu machen. Diese Schritte stellen sicher, dass OTOBO die neuen Dateien erkennt und in seine interne Konfiguration integriert.
Zuerst muss die OTOBO-Konfiguration neu aufgebaut werden. Dies geschieht über den Konsolenbefehl bin/otobo.Console.pl Maint::Config::Rebuild. Dieser Befehl scannt alle Konfigurationsdateien, einschließlich deiner neuen XML-Datei, und aktualisiert die interne Systemkonfiguration. Ohne diesen Schritt würde OTOBO die Registrierung deines neuen Moduls nicht erkennen.
Anschließend ist es unerlässlich, den OTOBO-Cache zu leeren. Dies wird mit dem Befehl bin/otobo.Console.pl Maint::Cache::Delete durchgeführt. OTOBO verwendet umfangreiche Caching-Mechanismen, um die Performance zu verbessern. Wenn der Cache nicht geleert wird, könnte das System weiterhin alte oder nicht aktualisierte Informationen verwenden, was dazu führen würde, dass dein neues Modul nicht korrekt angezeigt oder ausgeführt wird.
Nachdem diese beiden Befehle erfolgreich ausgeführt wurden, kannst du das Agenten-Interface in deinem Browser öffnen. Dein neues Modul sollte nun im Navigationsmenü erscheinen, beispielsweise unter dem Namen "HelloWorld", wie in der XML-Konfiguration definiert. Ein Klick darauf sollte die von dir erstellte Seite mit dem "Hello World"-Text anzeigen. Diese Schritte sind nach jeder Änderung an der Kernkonfiguration oder an Modulen notwendig, um die Änderungen im laufenden System zu aktivieren.
Quellen
Bei der Entwicklung von OTOBO-Kern-Erweiterungen gibt es mehrere Best Practices und wichtige Tipps, die eine reibungslose Entwicklung und eine gute Wartbarkeit sicherstellen.
ObjectDependencies sauber deklarieren: In deinen Perl-Modulen solltest du alle benötigten OTOBO-Objekte (wie Kernel::System::DB oder Kernel::Output::HTML::Layout) explizit in @ObjectDependencies deklarieren. Dies verbessert die Lesbarkeit, erleichtert das Testen und hilft OTOBO, Abhängigkeiten korrekt zu verwalten.Kernel/Language/de_*.pm (oder anderen Sprachen) an und verwende die OTOBO-Mechanismen für die Textübersetzung in deinen Templates und Modulen.Config rebuild und Cache löschen nach jeder Änderung: Wie im Workflow beschrieben, sind die Befehle bin/otobo.Console.pl Maint::Config::Rebuild und bin/otobo.Console.pl Maint::Cache::Delete nach jeder Änderung an Konfiguration oder Code im Kernel/-Verzeichnis unerlässlich, um sicherzustellen, dass OTOBO die neuesten Versionen deiner Dateien verwendet.Quellen