So : Habe nun selber herausgefunden, wie das sauber klappt und möchte es einmal für andere kurz hier festhalten mit Beispielcode. Im Prinzip wird einfach ein Controller erstellt, der via PageRenderer die Libs lädt.
Dieser wird dann via Hook eingebunden. Achtung : damit werden diese Libs auch bereits für das Login geladen !!
File \Classes\Backend\BackendJSLoader.php
<?php
namespace <Vendorname>\<Extname>\Classes\Backend;
class BackendJSLoader {
// JSbottom() abzuleiten führt zu Problemen
public function getBackendJQuery() {
if ($GLOBALS['BE_USER']->user['uid'] > 0) {
$pageRenderer = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Page\PageRenderer::class);
$pageRenderer->addCssFile('//cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.css', $rel = 'stylesheet', $media = 'all', $title = '', $compress = false, $forceOnTop = false, $allWrap = '', $excludeFromConcatenation = true, $splitChar = '|');
$pageRenderer->addCssFile('//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.css', $rel = 'stylesheet', $media = 'all', $title = '', $compress = false, $forceOnTop = false, $allWrap = '', $excludeFromConcatenation = true, $splitChar = '|');
$pageRenderer->addCssFile('../typo3conf/ext/<extname>/Resources/Public/CSS/<cssfilename>', $rel = 'stylesheet', $media = 'all', $title = '', $compress = true, $forceOnTop = false, $allWrap = '', $excludeFromConcatenation = false, $splitChar = '|');
$pageRenderer->addJsFile('../typo3conf/ext/<extname>/Resources/Public/JavaScript/<custom js filename>', 'text/javascript', true, false, '', false, '|', false, '');
$pageRenderer->loadRequireJsModule('TYPO3/CMS/<extname>/<jquery-ui-filename>','function() { TYPO3.jQuery.<postLoadFunctionName>(); }');
$pageRenderer->loadRequireJsModule('TYPO3/CMS/<extname>/<select2-filename>','function() { TYPO3.jQuery.<postLoadFunctionName>(); }');
}
return;
}
}
File ext_localconf.php :
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['typo3/template.php']['preStartPageHook'][] = '<VENDOR>\<Extname>\Classes\Backend\BackendJSLoader->getBackendJQuery';
Im obigen Beispiel werden ein eigenes ("custom") JavaScript (welches zB die PostLoad-Functions für die Require-JS-Bibliotheken enthalten kann), sowie die JQery-Bibliotheken "Select2" und "JQuery-UI" und die zugehörigen CSS-Dateien (vom CDN, um Beispiel für external-Files zu geben) geladen.
Zu den JQuery-Bibiotheken ist zu sagen, dass diese, sofern Require-JS kompatibel, unter <Extension-Dir>/Resources/Public/Javascript abgelegt und dann automatisch, wie im Beispiel gezeigt, per LoadRequire-JSModule Funktion eingebunden werden können und MÜSSEN. Das Muss ergibt sich aus den Namespace-Konventionen, ich habe keine andere Variante gefunden diese sauber einzubinden !
Das obige Beispiel kann, sofern <> Markierte Platzhalter durch die jeweiligen echten Werte ersetzt werden, direkt so benutzt werden und ist bei mir im Produktiv-Einsatz (mit allen Browsern). Achtung : Ich habe bei den Platzhaltern auf die Groß-Kleinschreibung geachtet, diese muss so übernommen werden !
Außerdem ist zu beachten, dass die Aktivierung von Classen für die jeweiligen Felder dann natürlich über die PostLoad-Funktionen geschehen muss !