Einbindung in EULANDA und Auslieferung #
Ein Plugin besteht aus drei Teilen: den headless Fachfunktionen, dem GUI-Einstieg und der cnreg-Action, die EULANDA den Aufruf als Menü- oder Kontextpunkt bekannt macht. Dazu kommt die Auslieferung (Modulpfad, Paket).
Headless-Einstieg (Caller-owns-Connection) #
Der öffentliche Einstieg ist parameter-gesteuert und damit headless lauffähig. Die GUI ruft ihn genauso wie ein Batch-Lauf.
function Show-MyPlugin {
[CmdletBinding()]
param([Parameter(Mandatory)][string]$Udl, [string]$Language = 'DE', $Task)
# GUI: Dialog bauen und Fachfunktionen mit -Udl rufen (siehe WebView2-Seite).
}
function Invoke-MyReconciliation {
[CmdletBinding()]
param([__ComObject]$Conn, [string]$Udl, [string]$ConnStr)
# Verbindung nach Caller-owns-Connection: -Conn (bleibt offen) ODER -Udl/-ConnStr
# (selbst öffnen und am Ende schließen). Reine Fachlogik, keine GUI.
}
So ist jede Funktion einzeln test- und serverbar; die Oberfläche bleibt austauschbarer Komfort.
Die cnreg-Action #
EULANDA findet ein Plugin über einen Eintrag in der SQL-Registry. Beispiel (verallgemeinert aus EulandaXcel), eine Action im Datensatz-Kontext des Artikelstamms:
[\OBJECTS\DATAOBJECTS\Eulanda.Artikel\Actions\esol.Artikel.EulandaXcel]
".package"="esol.EulandaXcel"
".version"="{{Version}}"
"ActionClass"="Extradata"
"CommandText"="Show-EulXcelArticle -Udl $Env:EULANDA_UDLFILENAME"
"Context"=dword:00000002
"ContextMode"="hidden"
"Environment"="import CURRENT"
"IconUrl"=""
"NeedsAction"=dword:00000000
"Requirements"="{{Requirements}}"
"SafeForBatchProcessing"="0"
"Title"="Excel Im- und Export"
"Type"="PowershellPlugin"
"WaitMode"="Completed"
Die Properties #
| Property | Bedeutung |
|---|---|
Type | Muss wörtlich PowershellPlugin sein. |
Title | Anzeigename im Menü. |
CommandText | Die PowerShell-Befehlszeile. Kein Import-Module-Präfix nötig (Auto-Import über Requirements). Kontext via Umgebungsvariablen, z.B. -Udl $Env:EULANDA_UDLFILENAME. |
ActionClass | Einordnung im Menü. Nur Werte aus der festen CNAC_*-Liste (siehe unten). Für das Datensatz-Kontextmenü: Extradata. Freie Pfade wie Extras.Schnittstellen funktionieren nicht. |
Context | dword:00000002 = die Action ist sichtbar. |
ContextMode | hidden bei Datensatz-Actions - sonst erscheint sie überall ausgegraut. |
Requirements | Mehrzeilig, je Zeile MODULE <Name> minimum-version:<Version> (auch die letzte Zeile mit Zeilenumbruch). Der Worker importiert diese Module automatisch. |
Environment | import CURRENT übernimmt die System-Umgebungsvariablen (sonst fehlen PATH, USERPROFILE usw.). |
WaitMode | Completed (warten bis fertig), InputIdle (freigeben, sobald der Dialog steht) oder FireAndForget. |
PluginModule | Nur für EULANDA-Lizenz-Slots. Bei 3rd-Party-Plugins weglassen, sonst Fehler “ungültiger Modulname”. |
SafeForBatchProcessing | 1 = die Action erscheint auch in der Treffer-/Stapel-Aktionsliste. |
.package / .version | Paket-Kennung und Version (beim Build als {{Version}} ersetzt). |
IconUrl | Optionales Icon. |
Erlaubte ActionClass-Werte (CNAC_*) #
Die zulässigen Klassen sind in EULANDA fest definiert (EulandaLib/pas/elConsts.pas,
CNAC_*). Häufig genutzt:
Extradata- Datensatz-Kontextmenü (der Normalfall für ein datensatzbezogenes Werkzeug).Extras,Extras.Misc,Extras.Tools,Extras.Tools.Admin- allgemeine Werkzeuge.Actions,Actions.Current,Actions.Workflow,Actions.All- Vorgangs-/Workflow-Aktionen.Print,View,Edit,New,Help,Developer,Developer.Tools.
Andere als die definierten Werte werden nicht akzeptiert.
Umgebungsvariablen (Kontext aus EULANDA) #
Bei gesetztem Environment="import CURRENT" stehen u.a. bereit:
| Variable | Inhalt |
|---|---|
EULANDA_UDLFILENAME | Pfad zur UDL-Datei (Datenbankverbindung) - der wichtigste Parameter. |
EULANDA_CONNECTIONSTRING | ADO-Connection-String. |
EULANDA_DOC | Aktuelles DataObject, z.B. Eulanda.Rechnung. |
EULANDA_CURRENT_ID | ID des angezeigten Datensatzes. |
EULANDA_ALIAS, EULANDA_SERVERNAME, EULANDA_DATABASENAME | Mandant/Server/DB. |
WaitMode und nicht-blockierende Dialoge #
Ein WebView2-Dialog blockiert beim Anzeigen. Damit EULANDA nicht hängt, gibt das Plugin die
Anwendung frei, sobald der Dialog steht: bei WaitMode="InputIdle" ruft es kurz vor dem
Anzeigen $Task.InputIdle() (das -Task-Objekt wird vom Worker übergeben und an
Show-EulWebView2Dialog durchgereicht). Completed eignet sich für kurze, nicht-interaktive
Läufe (Exporte), FireAndForget für Hintergrundjobs.
Namenskonvention #
- Hauspartner (EULANDA): Modul- und Funktionspräfix
EulandaX<Name>(z.B.EulandaXcel,EulandaXbanc); Paket-Kennungesol.<Modul>. - 3rd-Party: eigener Anbieter-Präfix statt
Eulanda, z.B.AcmeXinvoicemit FunktionenShow-AcmeXinvoice..., Paket-Kennung im eigenen Namensraum (acme.AcmeXinvoice). So gibt es keine Namenskollisionen, und der Anbieter bleibt eindeutig erkennbar. (Ein Präfix darf nicht mit einer Ziffer beginnen - der Anbietername ist gemeint, nicht die Zeichenfolge “3rdParty”.)
Modulpfad und Auslieferung #
Wo das Modul liegt #
EULANDA sucht das Modul im PowerShell-Modulpfad, vorrangig im Benutzerprofil
(...\Documents\WindowsPowerShell\Modules\<Name>\<Version>\ bzw. unter PowerShell 7
...\Documents\PowerShell\Modules\...), und nimmt die höchste vorhandene Version. Die
Documents-Auflösung respektiert OneDrive-Umleitung.
Automatische Installation (Fallback-Kette) #
Fehlt ein Modul, zieht EULANDA es selbsttätig nach:
- ZIP neben der EXE (Offline), z.B.
C:\Eulanda\<Modul>.zip. - Online von
https://files.eulanda.eu/<modul-kleingeschrieben>/(version.txt+<modul>.zip). - SQL-Registry-Blob als letzter Rückfall.
Worker und Requirements-Auto-Import #
Der persistente EulandaPluginHost liest die Requirements der Action und importiert die
deklarierten Module automatisch (ab EulandaXtools 1.0.97). Deshalb braucht der CommandText
keinen Import-Module-Präfix. Module werden einmal je Sitzung geladen, nicht pro Klick.
Paket für die Verteilung (cninst) #
Die Auslieferung erfolgt als esol.<Plugin>.cninst (ein ZIP mit eulanda.xml und der
install_builder.cnreg). Das Datei-Handling übernimmt das Modul EulandaPlugin
(Invoke-PluginBuild), das ein Builder-Skript im Plugin-Repo aufruft; die Platzhalter
{{Version}} und {{Requirements}} in der install_builder.cnreg.template werden dabei
gefüllt. Der PluginInstaller importiert die install_builder.cnreg in die SQL-Registry;
fehlende Module zieht der Worker beim ersten Aufruf nach.
Pre-Setup für 3rd-Party #
Hostet ein Anbieter nicht über files.eulanda.eu, liefert er das Modul-ZIP entweder neben der
EXE aus oder stellt sicher, dass es im Modulpfad liegt (eigenes Setup), und liefert die
cnreg-Action mit. Im EULANDA Marketplace (siehe Übersicht) übernimmt EULANDA Hosting,
Demo-Auslieferung und Lizenzaktivierung; der Anbieter liefert das saubere cninst-Paket.
Checkliste für ein neues Plugin #
- Fachfunktionen headless mit
-Udl/-ConnStr/-Conn(Caller-owns-Connection), einzeln testbar. - GUI-Einstieg
Show-...als dünner Aufrufer überShow-EulWebView2Dialog. - Dialog nach Hausstil:
eul-appmit Topbar (Verlauf/Sprache/About/Theme), Sidebar, Statusleiste;eul-*-Komponenten statt Eigenbau. - About-Box über
Get-EulModuleAboutInfo; i18n überGet-EulPluginStrings. - Externe Links über
_help, niehref. - cnreg-Action:
Type=PowershellPlugin,ActionClassausCNAC_*(Datensatz:Extradata),Context=dword:00000002,ContextMode=hidden,Environment="import CURRENT",Requirementsmehrzeilig;PluginModulebei 3rd-Party weglassen. - Auslieferung als cninst (über EulandaPlugin), Modul im Modulpfad oder per Auto-Install.