From f734ffb259db30d9ba1993440b96fd18219dc4ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chris=20M=C3=BCller?= <2566282+brotkrueml@users.noreply.github.com> Date: Mon, 26 Dec 2022 10:39:06 +0100 Subject: [PATCH] [TASK] Rework backend controller Related: #14 --- Classes/Controller/BackendController.php | 151 -------- Classes/Controller/TableListController.php | 128 +++++++ Classes/Extension.php | 2 + Configuration/Services.yaml | 3 + .../_images/no-table-links-found.png | Bin 17805 -> 21732 bytes Documentation/module.rst | 6 +- .../Layouts/BackendAdministration.html | 4 - Resources/Private/Templates/Backend/List.html | 334 +++++++++--------- Tests/Acceptance/Backend/DataModuleCest.php | 2 +- ext_tables.php | 16 +- phpstan.baseline.neon | 10 - 11 files changed, 309 insertions(+), 347 deletions(-) delete mode 100644 Classes/Controller/BackendController.php create mode 100644 Classes/Controller/TableListController.php delete mode 100644 Resources/Private/Layouts/BackendAdministration.html diff --git a/Classes/Controller/BackendController.php b/Classes/Controller/BackendController.php deleted file mode 100644 index 7650d34..0000000 --- a/Classes/Controller/BackendController.php +++ /dev/null @@ -1,151 +0,0 @@ - - */ - protected $defaultViewObjectName = BackendTemplateView::class; - - /** - * @var ModuleTemplate - */ - private $moduleTemplate; - - /** - * @var ButtonBar - */ - private $buttonBar; - - public function __construct( - private readonly IconFactory $iconFactory, - private readonly LanguageService $languageService, - private readonly TableRepository $tableRepository, - private readonly UriBuilder $backendUriBuilder - ) { - } - - /** - * Set up the doc header properly here - */ - protected function initializeView(ViewInterface $view): void - { - parent::initializeView($view); - - $this->moduleTemplate = $this->view->getModuleTemplate(); - - $this->buttonBar = $this->moduleTemplate->getDocHeaderComponent()->getButtonBar(); - $this->createNewHeaderButton(); - $this->createRefreshHeaderButton(); - $this->createShortcutHeaderButton(); - } - - public function listAction(): void - { - $pageRenderer = $this->moduleTemplate->getPageRenderer(); - $pageRenderer->addInlineLanguageLabelFile( - \str_replace('LLL:', '', Extension::LANGUAGE_PATH_BACKEND_MODULE) - ); - $pageRenderer->loadRequireJsModule( - 'TYPO3/CMS/JobrouterData/TableTest' - ); - - $simpleTables = $this->tableRepository->findAllByTypeWithHidden(Table::TYPE_SIMPLE); - $customTables = $this->tableRepository->findAllByTypeWithHidden(Table::TYPE_CUSTOM_TABLE); - $formFinisherTables = $this->tableRepository->findAllByTypeWithHidden(Table::TYPE_FORM_FINISHER); - $otherTables = $this->tableRepository->findAllByTypeWithHidden(Table::TYPE_OTHER_USAGE); - - $this->view->assignMultiple([ - 'simpleTables' => $simpleTables, - 'customTables' => $customTables, - 'formFinisherTables' => $formFinisherTables, - 'otherTables' => $otherTables, - ]); - } - - protected function createNewHeaderButton(): void - { - $title = $this->languageService->sL(Extension::LANGUAGE_PATH_BACKEND_MODULE . ':action.add_table'); - - $newRecordButton = $this->buttonBar->makeLinkButton() - ->setHref((string)$this->backendUriBuilder->buildUriFromRoute( - 'record_edit', - [ - 'edit' => [ - 'tx_jobrouterdata_domain_model_table' => ['new'], - ], - 'returnUrl' => (string)$this->backendUriBuilder->buildUriFromRoute(self::MODULE_NAME), - ] - )) - ->setTitle($title) - ->setIcon($this->iconFactory->getIcon('actions-add', Icon::SIZE_SMALL)); - $this->buttonBar->addButton($newRecordButton, ButtonBar::BUTTON_POSITION_LEFT); - } - - protected function createRefreshHeaderButton(): void - { - $title = $this->languageService->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.reload'); - - $refreshButton = $this->buttonBar->makeLinkButton() - ->setHref(GeneralUtility::getIndpEnv('REQUEST_URI')) - ->setTitle($title) - ->setIcon($this->iconFactory->getIcon('actions-refresh', Icon::SIZE_SMALL)); - $this->buttonBar->addButton($refreshButton, ButtonBar::BUTTON_POSITION_RIGHT); - } - - protected function createShortcutHeaderButton(): void - { - if (! $this->getBackendUser()->mayMakeShortcut()) { - return; - } - - $label = $this->languageService->sL( - \sprintf( - 'LLL:EXT:%s/Resources/Private/Language/BackendModule.xlf:heading_text', - Extension::KEY - ) - ); - - $shortcutButton = $this->buttonBar->makeShortcutButton() - ->setModuleName(self::MODULE_NAME) - ->setGetVariables(['route', 'module', 'id']) - ->setDisplayName($label); - $this->buttonBar->addButton($shortcutButton, ButtonBar::BUTTON_POSITION_RIGHT); - } - - protected function getBackendUser(): BackendUserAuthentication - { - return $GLOBALS['BE_USER']; - } -} diff --git a/Classes/Controller/TableListController.php b/Classes/Controller/TableListController.php new file mode 100644 index 0000000..89df6ca --- /dev/null +++ b/Classes/Controller/TableListController.php @@ -0,0 +1,128 @@ +moduleTemplate = $this->moduleTemplateFactory->create($request); + + $this->pageRenderer->addInlineLanguageLabelFile( + \str_replace('LLL:', '', Extension::LANGUAGE_PATH_BACKEND_MODULE) + ); + $this->pageRenderer->loadRequireJsModule('TYPO3/CMS/JobrouterData/TableTest'); + + $this->initializeView(); + $this->configureDocHeader($request->getAttribute('normalizedParams')?->getRequestUri() ?? ''); + $this->listAction(); + + $this->moduleTemplate->setContent($this->view->render()); + + return new HtmlResponse($this->moduleTemplate->renderContent()); + } + + private function initializeView(): void + { + $this->view = GeneralUtility::makeInstance(StandaloneView::class); + $this->view->setTemplate('List'); + $this->view->setTemplateRootPaths(['EXT:' . Extension::KEY . '/Resources/Private/Templates/Backend']); + } + + private function configureDocHeader(string $requestUri): void + { + $buttonBar = $this->moduleTemplate->getDocHeaderComponent()->getButtonBar(); + + $newButton = $buttonBar->makeLinkButton() + ->setHref((string)$this->uriBuilder->buildUriFromRoute( + 'record_edit', + [ + 'edit' => [ + 'tx_jobrouterdata_domain_model_table' => ['new'], + ], + 'returnUrl' => (string)$this->uriBuilder->buildUriFromRoute(Extension::MODULE_NAME), + ] + )) + ->setTitle($this->getLanguageService()->sL(Extension::LANGUAGE_PATH_BACKEND_MODULE . ':action.add_table')) + ->setShowLabelText(true) + ->setIcon($this->iconFactory->getIcon('actions-add', Icon::SIZE_SMALL)); + $buttonBar->addButton($newButton); + + $reloadButton = $buttonBar->makeLinkButton() + ->setHref($requestUri) + ->setTitle($this->getLanguageService()->sL('LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.reload')) + ->setIcon($this->iconFactory->getIcon('actions-refresh', Icon::SIZE_SMALL)); + $buttonBar->addButton($reloadButton, ButtonBar::BUTTON_POSITION_RIGHT); + + if ($this->getBackendUser()->mayMakeShortcut()) { + $shortcutButton = $buttonBar->makeShortcutButton() + ->setRouteIdentifier('jobrouter_data') + ->setDisplayName($this->getLanguageService()->sL(Extension::LANGUAGE_PATH_BACKEND_MODULE . ':heading_text')); + $buttonBar->addButton($shortcutButton, ButtonBar::BUTTON_POSITION_RIGHT); + } + } + + private function listAction(): void + { + $simpleTables = $this->tableRepository->findAllByTypeWithHidden(Table::TYPE_SIMPLE); + $customTables = $this->tableRepository->findAllByTypeWithHidden(Table::TYPE_CUSTOM_TABLE); + $formFinisherTables = $this->tableRepository->findAllByTypeWithHidden(Table::TYPE_FORM_FINISHER); + $otherTables = $this->tableRepository->findAllByTypeWithHidden(Table::TYPE_OTHER_USAGE); + + $this->view->assignMultiple([ + 'simpleTables' => $simpleTables, + 'customTables' => $customTables, + 'formFinisherTables' => $formFinisherTables, + 'otherTables' => $otherTables, + ]); + } + + private function getLanguageService(): LanguageService + { + return $GLOBALS['LANG']; + } + + private function getBackendUser(): BackendUserAuthentication + { + return $GLOBALS['BE_USER']; + } +} diff --git a/Classes/Extension.php b/Classes/Extension.php index 149061c..0c6c957 100644 --- a/Classes/Extension.php +++ b/Classes/Extension.php @@ -18,6 +18,8 @@ final class Extension { public const KEY = 'jobrouter_data'; + public const MODULE_NAME = 'jobrouter_data'; + private const LANGUAGE_PATH = 'LLL:EXT:' . self::KEY . '/Resources/Private/Language/'; public const LANGUAGE_PATH_BACKEND_MODULE = self::LANGUAGE_PATH . 'BackendModule.xlf'; public const LANGUAGE_PATH_CONTENT_ELEMENT = self::LANGUAGE_PATH . 'ContentElement.xlf'; diff --git a/Configuration/Services.yaml b/Configuration/Services.yaml index a0ec80c..d1af5f8 100644 --- a/Configuration/Services.yaml +++ b/Configuration/Services.yaml @@ -29,6 +29,9 @@ services: description: 'Transmit data sets to JobData tables' schedulable: true + Brotkrueml\JobRouterData\Controller\TableListController: + tags: [ 'backend.controller' ] + Brotkrueml\JobRouterData\Controller\TableTestController: tags: [ 'backend.controller' ] diff --git a/Documentation/_images/no-table-links-found.png b/Documentation/_images/no-table-links-found.png index ecfb94292e44ce1b94eb6465c299da815cb6d04f..1277b3deccd6a05172be293bc0703273ec55f9d0 100644 GIT binary patch literal 21732 zcmbq)by!s0yEcl5Iw~qMl!Q_e1JVuBC0)YMNYBun3Ji#pba!_T4bt5W14wt5^f!a= z`}@xMuJg~izVRB_d(GNwuf5i@?&rRrXKg<@8L?+i2%ey!p*@oj7gj(+dw_+8c8~JW zePoGeHT@VG+LKjhrO&nsx(=k4))s~)5Cc+MCrblT14k1>G&INQf@rf)a_Z;aw>Cd` z?|=9G&GGdY#G<%kUN%H+O!Im&hIppCFo5peEAQo9Yp(d)t4kk`1F|&n_sTAW1tRX< z?}aEyoL#R2)_B_v>l)p6kD_j`4S2*|JYE;Zn7Pjmp4Vh{IbNT_f?0chTSA1IjaYW|RMUHyNpf?IE6n*5ZMV<0ABNMZ8Klrz zTX!Eg?G-&Ly_HN1_*1*wZo|{E7EfWBb58c^)uDk4$pl`b?BK+5BR`C!>=yqNt1If< z{oU=)p3{DLNMl3DCf3rqjoZ2V!WDjqYrQ;6e-ixYrhek0eyyTbjQ}5NA6uo70UJeS)zV_ch`3<8g*b&;>_+C1hQqY?=jHF#I8&iXC5g&D z+uL?DH!H{ajMi7-;P3Q`9F)6`!-JXk2d@5GS2R7V(PId z#2M%Fn+flQh$Dx@RML%xEtRAP9(8jo!SnY3*$Pb;>D6UT_!DM7lt?w(>9k*xfoESkP z?TQCYeZg9pKWexvQ6ic1TTBX5sBBf;w4lIrCnbmrY@RVT9?OPXoulTj0?nPaTi>pZ z(sJ3Fb|Gm}cWxd?(=CvdeSgYeVivyJ(2+

H_Ghi zY0fG)fu^@$yRgPwjs4+kej42OvjcXQB4fQP=KMG=C4)8u%-glrpRqr(g|BqK2Aj3j zJlAyKg9?e!SH9Ku8bWO5P%9GfmA)w3Do@RiXfu3lPhgcLNo9`lwB@Y_nUwuzzv%BW z$Y~~(J;))v!4Fc&vr%>)4~9%h+J-n$4xH{j3xJ4rs!L38R3

V~U!?ySB6Bj^A-_ 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 literal 17805 zcmb8X1yoc~+cu1WH6jQ)NQiVzVBkp=5u4(SLY2wLNrLi`*VNJV6%BAT88t;{q}lu;l{c z>p}^Ynn@y4X*2aEKd{dhEC0knJc9?uq)1iYrSTv^ld<3_Ba(PsY4gAFV z0mg!2zOi7}{+j?K0-s{+AKcA;|A%rD zy1`#X^+j&1pj?=km`t^=S_jnf4!yDQNvcTTXQ`+6|CQnZ2kCNpp1bXZ?4}fQvgt(c z9$82EaKFpkzV55uFm1wv@`>s?P`)7)9NB7ymUGv?Y|B6v>m;TysjwR{-EmgkeI@?Pmrq`4)DQJR=HVy`1{V#rF;r1*GJ3dsAYsLxzeYy z-QF0s#JEX3SE4Hab{lm|KxJ(yg9=Rxmy17Iq^6BozTe(mvq}Fu=&HVN{YtT&tK?m( zRJXTeS}tN;7)>)Rs~90}pZ6EzOpcKzNn7)%19^S45y8x7{`)v@LZk3`-obqo7QV?9 zoy*9`O8fIF;uqOx;5SnFJ|H6|C%358gguhgy&9qB`f_aQtfoMPz+o@Zvo?1VFUmO_ zX0IV7G9${fu5S5f832NrU@7pqyLhZftX=bX;m$ zT0!L(rZ!RZm09_?T7YEMM#ZG?Z=m~vI=^El8@;vhsDp1$7ugPv1>3HrXt}2jePE4# zO&la9D7GKA3^9&y26@I3r*ObLMMl5ZG>UvqK`C9kG~6Fx3ljOQr16e?gw^ivHHrCd zF)_F3%&DU#Ulv~+kLKGox5;Q^?^{*GENUd;uSg;Vr9eV?x!3<1<23t>Qd!!4^t*aK zm)yY9MNrbJeT+*>aP^JWsF0weDS;Lb=K!zo-6J9RsZlOmsL*A|25#g_4sO{XzVH2Y zK9O&;1(lSPI^q^#ti*~63iwc*!79$1jqZSnBOV;C6?sk-aUn7wUjjTW^yDL~$4Qn3 zg>yT1oFg)MyES^W)yIUp1~*UKwscmp^Fo$hobP=P-|i>+`o?4`GI&L#pg&d|XJ^I{ zX<%feZO$gVFyF}77zIqN|CXHtOo{<@xSWE*GvT`O@^X|1g@1b+W$UM-(fe3f1K=uE z&$B6!(N91&o#jIjvkR4G%s3!oA=77#=bNc(#uCut2BR{~)(7E@AFoVwLeQuj8<@(N z9=>z}|9)=4AsS&#V8Ay3cZ>t!c#j{m*)H{*Gkw_h7c7VvIGy6hA=!5k@4?p1DRRo#H%`K=>w5_8c5{?5nM5Y%OfQ_E_= zN{KOt0WDb5uD=Hr#oG2{*>WTW*{mAU>rZIA^4tS7>wmnVacATCylkDE7x&m*MHbO# zY|rjjDgkvb#uj}BG~jLC1uBWtT2Cm$S<#m+CYHleAcj*uM080W<0&t@!|D(w5WbWq z8f01*Ygy-J84Q`&)H0Ur0BmyN$}SxjiY{9H2}rcXP!1Ppj{3D|e$R#i$d@2YXH6&I zV8-t=M5D$|;!aDpd>Syrz8kc9zkG1pG#K(_fzAc!<)55HJ8vg#j2wMh02g1C2e-O? z`SQ&^@T1h!)Xyw5ZRoE=EU}!VKSwsy`tno?N~=COJ#F|9$#Ugn&AY+se~LT_LR^3U zd|2E4+CONX7Sqa0$Iev*nV!nM0l4@7*vNnGVX|;VL);wcFRcV)KR>`*zK}1sm^7*e zTrNyR7F-Xv+AfVS7&86+(g-o@Q1-=%V9|Ksg{psnFQ=~colASzoM`4fUPm(KKER9^ z`bm(ecT;FWf_utiyk4z3CwWpY?Ovce%>7(Z)TjfieHFOY?WSG=Cr) zW*xe6!XF`Tm&<)H(-dnURR=U+4V$}Mzl`NE)x{)Z7O%@i?0+Qubvjtkt4u%>uQL5L zQOwNvKP6O=UHRC=#6&GhDsqfVy!UT4s(|D}D`lQw{AFETU29ZBL&MB_Fv7{lY=axJnRNy{`nf zvyUMwV0smch=H)~oB>V)_*hxOnwT}4p5X?9AqwP2Xmr3PWTO5L;bDeECY2zrDLW@F z`Ri6?gDq$@yOVBsO8U@;9!X7Z%~7Mz?7PXcPk&0z)Y%C)y1Q6=X zP(I<7ZK9Llc(L1U29iu{zthd3b1&*0bbb!j9m(>4;kTpN)Cgu2m|Wr6ORKL5)T@+2 zx5&rN*+|Js)1I@ z>q?JC-pet@GPZ?>e*31&O021=34tf)`#&NhBLjmC)hKdA44Ld4i5oayG}4$)WnJ5I z^WCpF|Ds9czYpCkEFB3Ikde`>o8>cocL7U{`~Kb3_~)m(@L#$pb4rt#gY~-bx5wVj z%P~7fhqvk;TZX~rWQ9~VI5Iq!Mzvv{lm~(mb?}hy-=RN0DJ&#Druv+n{Zd%F>d9u7 z4e>=v;Zru9^nLV4&8S5JJfl>O=Mb`8VaL&l$F#?)i$T0?Wi`=J)2URY~dr7iw@tK1g*<*>m_gZSnV-vKNI04FwOcg1<}*%EHq!*p{_@}};e zc=_$SOdHHOxHqqFfgVFc`4EoZ+S%@s-xUYrJos)dz?w}n_#-qeK+sOLx+*svf&l{Z z!-)pDiSs$Ttytr+=l9eo(LK^V+|@2&HY-T82C&aL%_Mk8P_&bpD%kb8($=eoegtBx zn<$e^V9C!-40u`}6`928__5gMUCV*$@1Xg!wf)y+%8paun{n*s_~gd*B5KD04VRc4 z*3;M3`6@`_wWVph?(dXV_-qN>W=PtZN?2r=672U|Zr2b$wlkQYBqKg7WP=Z|JXNDx zS-d+i<_z(itd7`fT-zrIle9CYYXzK3nPQ4eo7zX&O*f-tBJN`+Dtchqz78%A4DhJlig%HlDLPO%TPDA}~0AuOZ6sYbtPbad31 zmEDywe~qYjxz>&l^zQnq2MBt-y;i*!dbAgs!Hx4G3iaCZeS!aThZBuNQkWTNH++%h zcz1#_5OV7L^HjPf&`5S?7(26D}&)CjWa*nHW z%&7Bx8}VH?QU^mL4mN8-Azf;B6QcFC2qe^#SM5zcWwyg~L!G6cFFwvX@U2@xyhVDA zo@{o;ietR@z!I#<;h{42qG(^&SL~*~1a9c>E!gH4F(ZqfL6LV3YjZcRrgByVb_TV; zi20c2Z9&}6kk39o)ipKk9UUCD?SigzB@gLwpWt@q74fmX7@Ib`_V*b$c7|V*F{`hi zpKJn`@)NJ9s3^Q!I~fxbF)okesXuRYg^#^v{*Yne=KPc3(b?rg0PIa{dD{AeSzmw$ zPaEFuUi)wD1{NKFi=uwwlDH&!d$+_3do29a@JFHRy}i@Sl$^UaCt;EVgb$7uJROJ# zT+kg;9_HwK)PA0}as^yXhX6(>#>OnkcWo)~9yg+S-OUiqIc>6B?{~USD9~x915VN_ znZqv}-R4bVJsv#JG|IXdsMB)^%v!jxH;!jy+B`kZf*XUBx!aM4o@AuFe2m5uH^a1D z-zl9w2o5Ri1Yq_R2}cw{PUlk!>0-7t$*cM`{P`ywcY>$6xpusVYXQKkwCPk0J+xr6 z+ur3qZuK~uvZ&z6)vBmGLkN!g+YkHIxSCWx9;gHg1HdtSz}LJxCUB94NsOUMTwZi zf7Mq-3XNM-vLZQ8DgVJhAOj&>&fv(fx0^~il4 z!K105`+}2e_9D*0`{nJ9q#|?>C6(tT_3~l@Tu7@wWmGoHoU)mvLb{_v&=%vkdxz`KwRPjJSt=<=wKPKKhL`JcWgBwt;D^U-EWgFwp z^b;U!A#IKt@mZYHX}B}geS3p*d;I*G)>2R!e;2Lz8llQ4c;uKys#o}*H)&`|q)$Mb*L?Zk|%=n)1?l*kFl`y0qicMXk#?(|Dr%FuNSjJFs;?7$;Peh{UDG&P!~NGlw<;h{#_}$b zlt6hE$Y`^M+&%fSjC&KgABr}ic*H4VWBC?J5w$4goLlxzRys-+im@ah* z2xn68d#p0)+ZuA&9yQ02x~!ca^F|r;8%K6J2O&Wd&A5JGsquoq4(;!I3`vtr6n~PP zLU0}o1MG;ClZ%UIC4VxEHfgzc_=5OifN6~>L8%{{8_b~UU%9JO^kom_c`N^SF^~IR ztvph7SM|>2M1Noc;(yr_VLI#gQZ#ZbCz|Od?zgq(YZWhQs})Gkt?T9A8FI*Z#!o$h z9yufFHAzKqxcI8)i0&wJXY%ZC+e^*ff;Bx5b@ugM_?Vr_U3oc3ANg-m>&VpysfI1>M>tOC@t&{! ziZ7fG;&~|Fs!et&qOYFroY=yKaDzh#H-{Q}g?Gy@&DRA!BonhB60dNOBp}+~R1VfVepwLFc z@OI>v2OLc9Xf^AeK+V#8~<#R$@9b;E{?7E!-v2%4u|KJ}SJkR}SAR6TmY%pE9 zv?$-jV0F9W_9(jjXqIRE!zC6Svt6$jbtAa}0xH$6(&@Kf_~0xFazcGr+2CpE3Jr zD;Vs-dw!px4*pdQkYJc-9tV$QQzk(& zCG-{O?WWjj(1e%u!XN&T7>&GW(X%&W(&av7DL2mfr>dKQmcL}5N`|CEwu+_|Q%h5L zdpimeRtGa-b9_ZiFJkh;I=;R+NSvA|*#D|c%Q0ZwHG1pPkP+dKaEg1L)J^D@X3Dph zdF17!Ai{fUH#Vam8^OM#RybDn{je|ru+Dl=+@$?QH8qc@Q%Rh zSexWRux5uv!Em}BsL?5V9qX=g5@Tat%*crjvJE-Li;hU(lj(YYjC{Wp%cFC?t`#y~ z;gi(M@yWsJsED!tb}qScJM*H56a6wBd#+Ll-!GccEh*OB>zTdLl>_C5kD*S&1rGRA zp0qPv)q#^VH6s)qmgH@A7gQ~#+q$Y5AQt3|v<8i8g-fzqG8CC0t$}8oSsSdFDr39R zu095CHPF_Wnv=_&=9h_Yrm7$5e?U>VmB*mN_V#4P9480hihw+W_*v(ZDm1s}dw4c; zc6gWINV-zsdvn-Ee|`b;bKhQ)9G4Bp;NXihx$y=*M1|k(+U7G@ll)c`4S%`r+#ipS zSWx`d|a#QRH*wo6d?jj^tAkkLPYzs?sd%&pDxZS@-advZZ)hwMQJVdzz-0BhY zu;~8Qf$JP^>K8}tIw21#)z)_T-F9tzYqA_QrWr-G>JBxQap4;KvQh}A%=CL@7iPL2 zu0Ql~Il0bNX5VCtWZE$v8P0v=58yaz3_OHdMp}H{U`e-(y08vsI#E1etPO%pv@xfp z`IrlgRrAxQjeoFbB@cRkP*)Rjv=vB^gR~>qKI~4*$OgIqa2jO#($9f$$4F9_!WHo2 zN@l?5ZI~PXBjKN<_1}G;t4u)p)l>h9`M)Rpk8=O>qH})0(*pJSD}-K(aeqNN2Al#P zyZ6vn#6gdxz3)A_B9(mxAnB2hOH<7Yj8gdPYaKY6pF_G&3)=VpJgmQ9Wt*?#v#H6w zZO?usO>MS-6%-VNCB_xtp&!CpleY{b%4%!#z7t#t!&q-m%CH62Ck0g_%#qE%Oh^tA zS?=t2EFcrV@?Xh<1EMfW28MhTpzF4QU2bjEAg7 zWXgh&q)qW}?X5sK@5_z99VwhnNy7gWtg7dfM4ldDEu-NBMizRroul8wqfWKb}x(>>^@fP|Jtf0YUqJH_`yNuBxhP;Qky?tn0)xGfu!V?tG*A;y6MxClmXS zDkez?JsYv5pvZI9VAqEZEpM!r;vHeR!5 zx}eW^f_Iw0TRY8IF zUS81E>)%qB`OrV6_1lZG$f3Fmk9lZzr<Kuj}Z-dV^c-X>sHq?gBUHXArJi&xlQJ6VCsx?{KXoZ%pUq$!%%LL*Ljs< z1AV)u#}%?{=Ll|NB-hIsaM0ne^RpQ@fjOv&RJd~JI zW-;Y>!)j^A%M|tr)9V;EX~hAfJb^Wl#92Zgn|_{~j|D|Qc6Bda^`@FwtaZM22G|IQ zM0?A&AC_|0Rxs8GB%vNs=csWu zSBee=VaVc?DIaH%87T7x$qjejBpNj}^}Ar&QjZj~9|DU?C(eEw(}X*@{blp{)4WCy=`N0oC*ko( z(pN1lz0#!alD~qFyvCE4^09fu;DKUBG^f8b?G$|#ry+P6-h4{^DIuH9{3$sIln_DLdXeU*3*^? z)SjJuAIg#JAjS*TC|ai~`cWm#l3%;MECxz<93Q|oX$3RF+?+&r45FI+pe{^;oR34 z;Bp$pu8DDFD65O17Eg*9q+*;${X;08vZdZiv&8OuG9SLRMW`7NS#bR$D@RS^@_fs9 z0Zf3dG=a4ivgjn=xivnWSf1N#sSEPlx#+SHkSR@sJA;BWLfg$#ibi?xjy0urlgpRPQDYCVLt6d~0RkLwFW}rIk5bgL zzmT1xYF}~ylF6-&P?^3Ce;P&=^mJD%T+6V;2fsy?3FR0EuXmV~Q$(9?pOY7Dn)QH% zgZO^*E(dKIl}Yv_A)!-VC+Y{ts05*`Hc%@U*$Iz z;umP%-u*#~zO$2B=Oe$?6-!pVzZG4&H&TK(F3La2-=|->t@<@YTnHxVQrH z-t)k+(vot>QHQ@*6}i4YR-#$6{{YrBy1nOq!nbR!7=ny8ccohc$QaJWV)K$!f z!cxA0^g6(97P_D|Z0;pg(QsuklNBpwiNVyV2QKHn|D$cG-xA)}+@cEo2~L;oa-Zf| z!e($nFk3cdoxeKcGwsc6UxJ7;t&)XmumrC-6<3;3RE+6?=t36n+Al$lis-ZXEmOo2 z+TKf3qh3gB5ad`xSI`ghReSkhh!; zwvkBYzH`AIF9D0$qBb|rW}P1Kfat}Y-=V+s;T-Qmx$#cUCwv9FXBu}pQ+`?ZCB}|Q#89K6>{caGJcL}1MGRRDF@xS5zqh^pvE<$iTo%?;rrRlb!F(&-%-&D&+RM) zd?Up)sThXTgIkrg;!(rZdb`-j^6Kk9_HPVWGH;BQ0?VXl2=(n69M{(`YbS~?%o|H~ zgRtG$UQ_SgJGkvq+fA`dCrZ z0{r62Y#M#)?Z=IQ76<|;7Y$xB(h{8Anx}}f05NT`E$%@>{(^|x(Un%l$bw}Et2?&x zH&tBCMOAVP<^h!F;Nq7<$6u!-D}0o*=#L}BFvtQJbgBtK>%K(}3pRY(K4$!!Ts_57 zT^ap7QpUDN%smNzi}fq^>0TUvw!p+{A6fRxF8~E4PFyRlUAg~V55NhR9_$gc%K7}m zmXtJ9KzUyM*bfKM?Bm$SeBb|H%}RZ`Rl6F$)DB#)G?b$0N!Q1K0swabF-bnVaqWRo zQS7ph4Pn)fA{@Q79WbB_0C-%n5Dms6K4)gf*@P*<1MaM%ow(qC&y{0;TVL(idiSLC z!l5*tyYwMYUb^>$S5Z-s!Vg;Q2GkgIOj%P-E;KKXUgVV>A2ihEiA)mX`BE+M7eQw$!?%g+A!^QT-xelY-b>nEF&T__K{jB`t$QMn0Q*1F!m|3)3ZXjQ)= zqjvbuqRC?9a5gKE?GXNKBIh6YgAG2%$!@B|WB{dXabo+Za%{b3P5D08JmemQ`%MBOXg;Ebnu5@lXnwRUE8Cm0|gWK^99&ElXeBR+smiCTu_6j@5?NIhG-|1qm4i1qz+io$#A!JO8jh}wY~M} z-05`cyE1Q0?vf=N`Rt>Hah>V1p@j3>uoRPOg^X_ci}U%>kwAlvy+Q*`-5@0l61UTU zTG`txyZsm+S9PnlnBiKNmykqy4fq2r37!o3l6nzs?U}9WDZgKP`#It2vzOc`Jh+@G z&ofImQ^}2(FsA~uvj(5J1`?S^83km^BP|vnc6hScBq1aHJkL355fP2F};Y?A% zE7T6fQ-W#m$LjAp#78%1y!jk*rKsh7R#sM|ndh&;2bL6{EEH{N zM>SZSuY-bby1erc8(%dPTRD8O!7RRwhPCEjyVePr_3-!b9GRQHl~@m#PD?C5%SDMQ zqSs!}Zf8xeZMm`;nc*XQT_6)1wo}W~M{lBssEnL>-uyV+OE=UgQK>-ya|rPrLZcYp zpTuv;OV>%9(Vt>qJ~#P?;KdGtZz*W6l33RLwfu{I=qt<9;gLJ_x+nCx4GYL8}NZrS~`C6jW>on zbL(u{-_WRU}X|00~m|`XxGYNi)uYA#x?EjIBNc=>V zBGls!DntP~i`X-J0ur2Ba2LV-4Y-a0C|8$6W@H^2O_UTxG;iRpH*8*6>ws!Kk60kt%UiAFIojMyFr0YGMB>HQ2q}^mi4cHdP3x=3t(?k}$Kqg*V%Jn* zAxngK#X|NID{Ztr>RDJbEeCOXE-|uku|lXpJ!N+9SWN3Wv7~(tyyP$ z;~AbX=XiN7^W`3n1|DIO2GNtQcgP(oH}ILF=fX*a2f0PxRwCaXK|nYfC0E=({OPvs z??WxUFMF!}>XzATG*jT#_IaPsN@0q{yaR1jt2E)pw*HpGnSJIAIfugwNgh|- zg>FXjST>ups9N_O7CuS|Yz4Jy>AmSP6rZrH)1Jh(oIG~`^Xn0#pTDD@S%)u@_kS5u z8_5w_%t9WL^SyZq1$&Qv=P8f7ms=ns%fr32nEp)uYvR}F#d$*Knrl!e8D5tL4N@q- z#qXYr7Zp~J7go~%s*39FFG3NS%~U=m-r0Sh_;kFs`ZXwikx<<|-(sq{;`wH_?x$UD zx;Nw-ETJ>^qv$fJ%nBL92i8KFbr<~5FT^)dWLB}2VKrATHLW`VXI6vE0I1YyDAlV zaol4RKE=dCUu2vfrNWAUH%r9^{HjA6Yt8fXOB|oaH${Jko3DP+f}1@%Gcj#_lQzPw zTZwI*jLKQ=TOWFm1=FgSOP=me-o3|f%BsorhVRdM7h3m6?3HGSc*75x9*}IXv3~O8&&Z8m>unk_IzPk2UlEw&Gigwf?;Kn z-%Q=Zr(bvQ9fO6uDiN&URGVGXwdSXDdw_UV+`Ft0hxIhpRyRqU*56+iI;+$9+b4NRYbr7HPR9h+S1E zrwl?USEn-gSQm6+VQ+43-jugwQJ)d#CvN(pH#f=XNF6D39Vn(ZUE@BA;(_aq9r@9uyR3*^8<5r zj(@4e%)^LWKEzP2Kh>zksXy>dvRr-C4h);;$bzU>XAos>OH0NX5aC|tkdbs)ChK~1B;sbt zi!V`UCUtBfiEH+obOYfvt*l@MIweYTKf3- zs7>pv45UaB3Y&dZy#~Y^7}G+32C3;B*G+1*F}NS_0GgPPqEjQzA5w61et0@^>;MuS zqELDG!!WhrbVFsYEb}|sOQRFdZ9H1+$MzVjDF|q0J4}GD+(GKy$J%O8hBcIvc;$_Z z*=Xf2eB(;XroK@*Q?ve{$+0thAPfmddnyy*6{!8e1-;xrzBjhAZY=wWQN|246V(B# z|4^-`8a7+H51B|5QiL_lqM{N@%Ok<>kbp#KhX#&7ObEJGVmt3w)39a?F8l8P6!}ye zF?bOf@W$~(uYzYoYs8CM&x`G~(HbKM>pP;3XXBau_aE@eAJSwAxwkhwmt~=0-|$o= zffsDm`RHuV4OcFA?tzzhA-zye@(tdl3iqLVf@)KQIJSFctzZl1B^7w`SMJjDa&GEo z$CX#Oxa$qUzV1SUSSGWA)&jnqMvduQW~3Rnf=L*pZ&%u~gF*x<9JaxQ$E{8kpzaYq$kPK*Gr%kQgLZ%2i2ocL5CdfHYPQ zJNB%2*N6BRmG&c~oCAs%(htMk*&}D^8rDxgtQ&A| zL(v&_$G%A*QWG7j3`{-_h?C?nJ58hAYVSDP}DHxiCaMc|mU$<9}VEZQO98A8p zy3n{ITpuVz#<5uR!#HaaAX*&_J&0oDTPpH^6>&{*dX z-`r_#XBpGiPw%i8Qu2E_;f0D7=PO%dVzpzTUL~`va4BYIY*{j`OSH4Dy(lIW;;5TD zsjK?fQlU-8SXuTmY{twL3V$l`ZTrg(Nf{GaBx4RfkexYhIKOg_}13qpVY3374WYxzO=QjmC5Nfc5w3nPGEirzz7VZaiE zC#?Z~!EnjqF5{}7j(xlJ==iIuFAs(YVIsqUzqh7geHL=m%@g8}LQIRqlJFPRGYtI@epOH#MWZ}5oY z+C~nIx&9}Y_&h{XL0?^Ph~U(XDKTf(H$ z%|+Z4-75Vp@jN?$YGD-MX5I>H$vrp`rYhooCD;X1-*0W-H6Wm_bP_I${bcc|1G5Kk zDQgUAnWsc333PV8?w2RM0kry3?-zHi@EKFY{w6g`KofioX!~W8|I-myGR@y!`Cl%o zzAG6MDxcbCyf7Fxy4rBKd8OouA4@oPp?^fsUoQbV5|Ix1ea3!_kRQg4;J?sNcHVpI z+i5aN7S&ws=?_7N)M~gfF+HiRE^aa+per&2kIzK2(5?H`mpE4%J8VWU3|CM`YTJkx zmYOsf{#Af6BKp8XbIRqYobjT#T*IP%M?B^2+fh*;l(k=LRJR0pR=*xndgE|BQ{hvg zDq|1ZcC1H{l)u)MWx+s(sZlL|{8X%t(8pY<~W`biXEgNF>!iam=HR5R0kCOMZR}pWI-)l1GdiK@k z+G&67s);FnGkzMTEVAC^aaxV;fC)_!blZ~7cd=xAuTu+EeZA>T4CRE9huc%-ZTJl} z2dt*po2Se^Bw2^z71dN5X`2YEjFvRVO{y6TDMq?S5;CwW89mo-zfvfr;XWHM%vk`q z1?byi297&dqMVwtgL|QZZAYXwZQW9hWO$o%qETM|2EE<;u*TFsOS2Q#7u9U3C|@9z zRe~b&mKzCGs5^)vO1aDOO?$ey;CNccX$+JBg&Lmn<);Fj-?~WhRF>)d*bO5BX84$A z-oJRfb4dkR>6QbK$FvVRi&UI2X82uXY#+}(xeC7^io4;=q{t$T3G8huS& zDc6k*2KZC^ufIncm<;p<4b00(x^^?>8`{Aeq&r}^6;H}rqVC^`C?QjghC11{^v?mX zmI%Kn7JQ6i1hRd-|7sc+P0N=3zzXol%sfFJ}9`d*H z`aKZ~mC-UEl&Y=gdCo}Pg|y;g$lbBMn;)R>Q35j^o#UQ`=YuwP6c>ZWg?t1xSV-x? z)U@`(t(xDzioi;~YUCP$y7zb$ipakAWpNGfd$)mm67C0Jg)2X(nDCmRVmAeaQI4#9 z*8?r*c`_?sC`Fs-&0=;RVNLP5jgX_eKs*`AbU<3?B=b%$neD-1KE(E21xxcHEFL7W*= z2ZO$r3W~$~=zY#!tBgiHgm3+P#VzkEfhNp#KNfw!I3tn8TLMm3FG`-<#ySJ!?rb>LO0@ljd*$!`KbnJE| zayz)MFKPIVst)x<26xtx6UFEw!Fok^gH}s++0hu2U^l1C%Qr>b_MwQecnRzKyWRJ_ zJG1}j7{Rs<&g1Bq{zS(*0|s;z;25M$O_z+UU}N&{)bcN@jJyf)iLpdUns{fXmZKZu z`kmD{9)*Uz6OBV>{*CXxa++~9>Tl_E@|M>I3}KE84zlQs8)$yT`wE1~7riiCZ^?2{ ztp5{pu92#=p66S{ryftt+-1@%R$~ijQ+l9!WhRf5#^`J^N))@3yVHo%b30)s*Udbw zFZEV{)-#76QroZfy~<=Rl={^*SW0i9zml>8ud&dl(w7QyDk$ZQI(R9z-^8w0olP}f zzx5aTsVAz*kGghYpX)jl^WKe)XXx_enZBg_xd+yZxXzVsrEEAEs$5y>GZ41jmD__Z zfwL~X_b=sILxLFXL^2_tOl_p5f>lu@-}JydD&k8=exg` z_{nOujCn1awjNrJgTvj&v>&VLE8M{>XX(RJf{Ot^pyX+^xdV29W)`XudC-uRU@g{X zOAyGc%Ae)7^JhAmbVigSYEu4|`@RxkPHYsKXsD&$CD4>_xcKaG1ncOWtRj^iI(jmf z&z4|Mn9cGbzWh9H+)<7}IIQ=aE;+a50yUzRwx)jq-Ag4gLvCvku*6CzdKo~knbTBdGe8x)ItQ$uAlO!1i z9QMx26k=Lhuqrhjnv;dyQzG9u<%rSkg5GaHlnf>AZq96s)iHp+Rp=i*exy=g+r(qD ziW@V^AJ-wd7(jPn)S^7K^{v2wKQfk1wBFI#eXdtQ5k=d=wvEzTz%^0`6fUp~9}})g zR6YJOmuMNFLHj}WsgWzx-6L`q@ zP{OVHp*t9Cbh(9UcdFLMuiXI4yH~*4Jz4iMO!op&y^t6=F07sqrWudFu{zT7=51`{ zt4WdYCGX`nBkivT+Xben5OF|L>9r+~|0}3evRcl~J6_X2;mq;%B?ZK5vPISds+l(7 z-nW3$7~<=y^U)&U=QW(B;7O0FKM-RO=h=@ibfR#Uaj4pQc8SU^0n`vJpu`j<)8TN% z5|=I}+cjbjKW@qKCW&;B^8KacD4l*NyoxO7gg-^Z1IG(GLnCUAQ4i1Z$Ap=e#Lb@h zL+FbBq=^n^2vHKO7y8?6h0R(?cplOBuJGBP5HN%!7KJ4O zWTWe+eRR}Q)T>bT2k+;as(p43s7Cqm*$_ek4bUsm@H<>n~3+(H%}_Uelv+l?6v9=;5( zF)6|@Fbvke#M}UtxFQArsKWm#)FyPS(x<`wq%ZolerMPVdMx$pJ7v#3Qd|2UUzISl zWv)AxuLc4$L^B(7-TWB&_LRXtiDt*v=jvtUuF&^z7*Q@3gz^6T^1Z*6IfNJMwcX2w z8e9LjpcGh>b5maM90j-Aj#{7?EB9NLBx2%!Oa_q$DG#HgIo_6S&IUy0E83D?j}TnX z@%qWs!k_8e{$Hl^j{;y=4=~byDGp}5{)QT1coC-kg1|u=gy4tP>@(L?oJr)P-yE;? zjCSyM1cB#_x;ez3|e0?CV3sK_ztEiX+pSD8?d<-Sr>k4>_N9ikVR*h(+*EBQT)&Y$PnUY3Zp z6$D}E;WRu6KgMF8YU}GQ_Zb-)F4=Q$UFaMJ-xS&CZE)kGwGzEi+kc-oGU3sRlzs4J z;Mm*cQtX)JWs5EbZWL4R=er9@o{I_TJsUj!AipuDgaa=JMMGT^5&7BU?eo_iOOyWL z8&^?lb}(r4s{>Sa&ro@PrgZF4$XOdYfj(23^y0Mief{duTJ-|8aT;o=0ei}bcCzI1 zY}(2%_^-`F6Vp|Hre&GfS98ZE!-=X~q_gk3s-M(OBfzkvj1L`{gDY6cqvmrDj0K=i z$~c!`t8*b)())?EbW3u+S}#v*On9Ni?vY_+mobPRgUvzxOkcU79;ZorFL@}!^?Iby zCk)ODyN~pNvr&5tFSxG;qQC-_l*oVbqp)aQt-IB8CvoP)!$)@m(T< zm+xG+-}`$Euj`$JkMqxX4u%sF9-V&19z;(IZOfFMY=B1ow!Rz=nO<}TMV>&EBDEUq z-1>dr?wx_%kh6&~j&Ckf&p&jb8_%g;pX|1UJ1*BhjB~DLy>M!M=GxzvV*0m*z)m~H z^`^^7pS1i0}r*z$ihBQK#3pO?>nOGh!jB;JdA zQc~vR??id&LNUdWA;9X40Pnww^uxUEDo*iA4#4F2kI`Yc@V{*A@Lx~Pt=A`;Jw5S7 zae{z5n5=+jh$pN=NH#x>B} zSG`!L3B*+QHV6dCxHnHNd8%>spCUGA!RUicZvFPJFQg*#v5fDw_J-9`u_mDRK1u0 diff --git a/Documentation/module.rst b/Documentation/module.rst index e652419..aaca791 100644 --- a/Documentation/module.rst +++ b/Documentation/module.rst @@ -33,9 +33,9 @@ screen: Create a table link ------------------- -To create a new table link, click the :guilabel:`+` button on the top menu bar, -which opens a form. Alternatively, you can use the :guilabel:`Create new table -link` button. +To create a new table link, click the :guilabel:`+ Add table link` button on the +upper menu bar, which opens a form. Alternatively, you can use the +:guilabel:`Create new table link` button. .. _module-create-table-link-types: diff --git a/Resources/Private/Layouts/BackendAdministration.html b/Resources/Private/Layouts/BackendAdministration.html deleted file mode 100644 index 128f6c9..0000000 --- a/Resources/Private/Layouts/BackendAdministration.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/Resources/Private/Templates/Backend/List.html b/Resources/Private/Templates/Backend/List.html index f49beb2..d014581 100644 --- a/Resources/Private/Templates/Backend/List.html +++ b/Resources/Private/Templates/Backend/List.html @@ -4,192 +4,188 @@ xmlns:be="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers" data-namespace-typo3-fluid="true" > - - -

- +

- - - -
- - - - - - - - - - - - -
-
- - -

- - - -
-
-
-
- - -

- - - - - - - - - - - - - -
-
- - -

- - - - - - - - - - - {table.connection.baseUrl}?cmd=JobData&module=jobdata&modcmd=ManageTables_EditTables&guid={table.tableGuid} - - - - - - - -
{table.customTable}
-
+ + +
+ + + + + + + + + + + + +
+
+ + +

+ + + +
+
+
- -

- - + +

+
+ - - - - - - -
-
+ + + + + + + + - -

- - + +

+
+ + + + + + + + + + {table.connection.baseUrl}?cmd=JobData&module=jobdata&modcmd=ManageTables_EditTables&guid={table.tableGuid} - - + + + - - - - {table.connection.baseUrl}?cmd=JobData&module=jobdata&modcmd=ManageTables_EditTables&guid={table.tableGuid} - - - - - - -
{table.customTable}
-
+ + + + - - {table.connection.baseUrl}?cmd=JobData&module=jobdata&modcmd=ManageTables_EditTables&guid={table.tableGuid} + +

+ + - - - + + + - + + + + + + +
-
    - -
  • - - - {column.name} - - ( - , {column.fieldSize} - , {column.decimalPlaces} - ) - - | : - {column.sortingPriority} - - () - - -
  • -
    -
-
+
- - - - - - + +

+ + + + + + + + + + {table.connection.baseUrl}?cmd=JobData&module=jobdata&modcmd=ManageTables_EditTables&guid={table.tableGuid} + + + + + + +
+
- - - {table.name} - - ({f:translate(key: 'LLL:EXT:jobrouter_data/Resources/Private/Language/BackendModule.xlf:status.disabled')}) - - - - {table.handle} - - - {table.connection.name} + + {table.connection.baseUrl}?cmd=JobData&module=jobdata&modcmd=ManageTables_EditTables&guid={table.tableGuid} + + + +
    + +
  • + + + {column.name} + + ( + , {column.fieldSize} + , {column.decimalPlaces} + ) + + | : + {column.sortingPriority} + + () + + +
  • +
    +
- - - {table.tableGuid} + + +
+ + + + + + + + + + + {table.name} + + ({f:translate(key: 'LLL:EXT:jobrouter_data/Resources/Private/Language/BackendModule.xlf:status.disabled')}) + + + + {table.handle} + + + {table.connection.name} + + + + {table.tableGuid} + + + + + + +
+ + + + + + + + - - +
+ +
- - -
- - - - - - - - - -
- -
diff --git a/Tests/Acceptance/Backend/DataModuleCest.php b/Tests/Acceptance/Backend/DataModuleCest.php index 6aeae67..aca7aa9 100644 --- a/Tests/Acceptance/Backend/DataModuleCest.php +++ b/Tests/Acceptance/Backend/DataModuleCest.php @@ -15,7 +15,7 @@ class DataModuleCest { - private const DATA_MODULE_SELECTOR = '#jobrouter_JobRouterDataTables'; + private const DATA_MODULE_SELECTOR = '#jobrouter_data'; public function _before(BackendTester $I): void { diff --git a/ext_tables.php b/ext_tables.php index cf7737f..15158e6 100644 --- a/ext_tables.php +++ b/ext_tables.php @@ -1,26 +1,24 @@ 'list', - ], - [ + 'routeTarget' => TableListController::class . '::handleRequest', 'access' => 'admin', + 'name' => Extension::MODULE_NAME, 'iconIdentifier' => 'jobrouter-module-data', - 'labels' => 'LLL:EXT:' . Extension::KEY . '/Resources/Private/Language/BackendModule.xlf', + 'labels' => Extension::LANGUAGE_PATH_BACKEND_MODULE, 'workspaces' => 'online', ] ); diff --git a/phpstan.baseline.neon b/phpstan.baseline.neon index 79ced59..4f89974 100644 --- a/phpstan.baseline.neon +++ b/phpstan.baseline.neon @@ -30,16 +30,6 @@ parameters: count: 1 path: Classes/Command/TransmitCommand.php - - - message: "#^Call to an undefined method TYPO3\\\\CMS\\\\Extbase\\\\Mvc\\\\View\\\\ViewInterface\\:\\:getModuleTemplate\\(\\)\\.$#" - count: 1 - path: Classes/Controller/BackendController.php - - - - message: "#^Parameter \\#1 \\$href of method TYPO3\\\\CMS\\\\Backend\\\\Template\\\\Components\\\\Buttons\\\\LinkButton\\:\\:setHref\\(\\) expects string, array\\\\|bool\\|string\\|null given\\.$#" - count: 1 - path: Classes/Controller/BackendController.php - - message: "#^Cannot call method getLocale\\(\\) on TYPO3\\\\CMS\\\\Core\\\\Site\\\\Entity\\\\SiteLanguage\\|null\\.$#" count: 1