Inhaltsverzeichnis
Extension importstudip - Anpassungen an TYPO3-7.6
Zusammenfassung der bisherigen Änderungen
- die Klassen werden nicht geladen, autoload ist bei TYPO3-v7 anders
- die Grafiken werden nicht geladen, der Pfad zu gfx hat sich geändert
- die Bezeichner in den Formularen (Klassen) haben sich geändert; javascript greift dadurch völlig daneben
- die Struktur des Config-arrays der Formularseite hat sich geändert; die Funktion getConfig muß total neu geschrieben werden;
- kleinere Änderungen
kein autoload der Klassen
zunächst werden die Klassen nicht geladen. unser TYPO3 läuft im sogenannten composer Mode. Es gibt eine zentrale composer.json im Root der TYPO3-Installation. Wenn die Studip-Extension im Verzeichnis typo3conf/ext/ installiert ist, müssen diese Zeilen der composer.json hinzugefügt werden:
"autoload": { "psr-4": { "UniPassau\\Importstudip\\": "typo3conf/ext/importstudip/Classes/" }, "classmap": [ "typo3conf/ext/importstudip/Resources/Private/PHP/restclient/" ] }
Ich habe dann noch folgendes gemacht:
php composer.phar dumpautoload rm -rf /var/www/htdocs/typo3temp/Cache/*
dieses „dumpautoload“ soll den compoeser veranlassen, alle Klassen neu zu laden. Ob das wirklich nötig ist weiß ich nicht. Zusätzlich habe ich den TYPO3-Cache gelöscht. Auch dieser Schritt ist vielleicht nicht nötig.
Es werden jetzt alle Klassen aus dem „Classes“-Verzeichnis geladen und zusätzlich eine Klasse RestClient.
FlashMessage Fehler
Nach dem Studium des allwissenden Internet bin ich auf diese Lösung gestoßen:
You are calling your code statically, which is not the case with this function and that is the reason your call fails! Please try this: $flashMessageService = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Messaging\FlashMessageService::class); $messageQueue = $flashMessageService->getMessageQueueByIdentifier(); $messageQueue->addMessage($message);
Ich habe also in der Datei „StudipRESTHelper.php“ diese Zeile
\TYPO3\CMS\Core\Messaging\FlashMessageQueue::addMessage($message);
durch diese Zeilen ersetzt:
$flashMessageService = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Messaging\FlashMessageService::class); $messageQueue = $flashMessageService->getMessageQueueByIdentifier(); $messageQueue->addMessage($message);
fehlende Konfiguration beim StudIP-Gegner, kein auth und keine routen
dieser Fehler ist eine Folge dieses Datenbankfehlers oder umgekehrt:
ERROR => "Column 'data' cannot be null" (28 chars) lastBuiltQuery => "INSERT INTO tx_importstudip_config (route,data,mkdate,chdate) VALUES ('exter n/externalpagetypes',NULL,'1468565423','1468565423')" (128 chars)
hier wird „NULL“ als Daten übergeben, und das ist scheinbar nicht erlaubt.
Beim Gegner finde ich in der access.log:
GET /api.php/extern/externalpagetypes HTTP/1.1" 401 39 "-" "PHP RestClient/0.1.2"
die Anmeldedaten stimmen also nicht!
SQL-Fehler bei UpdateQuery
es gibt erstmal einen anderen Fehler:
array(4 items) caller => "TYPO3\CMS\Core\Database\DatabaseConnection::exec_UPDATEquery" (60 chars) ERROR => "Unknown column 'extern' in 'where clause'" (41 chars) lastBuiltQuery => "UPDATE tx_importstudip_config SET data='[\"0\",\"1\",\"5\",\"9\"]',chdate='1 468823674' WHERE route=extern/externalpagetypes" (123 chars)
Hier wird kein String an den SQL-Updater übergeben. Ich habe folgendes geändert:
diff StudipConnector.php.org StudipConnector.php 337c337 < 'route=' . $route, --- > 'route=' . "'" . $route . "'",
Dieser Fehler taucht vermutlich immer dann auf, wenn der Cache abgelaufen ist und die DB-Tabellen aktualisiert werden müssen.
Fehler Übergabe an simplexml_load_string in getConfig - kein String
hier hängt er fest:
00211: public function chooseUserInstitute($parameters, $config) { 00212: print_r($parameters['row']['pi_flexform']); 00213: $config = self::getConfig($parameters); 00214: $html = '<div id="tx-importstudip-choose-user-institute" data-input-name="'. 00215: $parameters['itemFormElName'].'" data-input-value="'.
und als Folgefehler
00598: // Extract already configured flexform values. 00599: $xml = simplexml_load_string($data['row']['pi_flexform']); 00600: if ($xml) { 00601: $json = json_encode($xml);
es wird ein String erwartet für simplexml_load_string, aber ein array übergeben
Ich habe mir die Struktur der Konfigurationsdaten angeschaut und die Funktion getConfig völlig neu entwickelt auf die Schnelle:
public static function getConfig($data) { $result = array(); // Extract already configured flexform values. $config = $data['row']['pi_flexform']['data']['dataSheet']['lDEF']; if (is_array($config)) { foreach ($config as $key => $value) { $result[$key] = $value['vDEF']; } } return $result; }
Baumansicht Einrichtungen, keine Icons, CSS verwurschtelt
sieht jetzt so aus:
AJAX-Fehler, statisch - dynamisch
PHP Runtime Deprecation Notice: Non-static method UniPassau\Importstudip\Utility\ConfigForm::getStatusgroupForm() should not be called statically, assuming $this from incompatible context in /var/www/hss.dmknet.de/htdocs/typo3conf/ext/importstudip/Classes/Utility/AjaxHandler.php
ich mußte die Klasse AjaxHandler vollständig ändern und alle Aufrufe dynamisch machen, hier ein Beispiel:
< return ConfigForm::getSmallNewsForm($inputname, $value); --- > $configform = new ConfigForm(); > return $configform->getSmallNewsForm($inputname, $value);
OK
alle Input-Felder sind aufgeklappt und sichtbar
eigentlich sollen die nach und nach je nach Anforderung aufgeklappt werden
verfluchte Schweinerei, in TYPO3-7 wurden scheinbar die Bezeichner geändert in den Templates für die Forms. Das Javascript greifr jetzt nicht mehr, weil es die Bezeichner nicht mehr findet. Ich mußte die js-datei anpassen nach folgendem Muster:
26c26 < closest('.t3-form-field-container'); --- > closest('.form-section');
jetzt sieht es so aus:
Fehler in JS, Statusgroups
es erfolgt eine Abfrage von Statusgruppen für ein Institute, obwohl beim Konfigurieren noch kein Institute ausgewählt wurde. Dies erzeugt einen internen AJAX-Fehler.
Ich habe die JS-Datei geändert:
136c136,137 < Tx_ImportStudip.enableInput('tx-importstudip-statusgroups', --- > if (TYPO3.jQuery('#tx-importstudip-institutes').find('input[type="radio"]:checked').length != 0) { > Tx_ImportStudip.enableInput('tx-importstudip-statusgroups', 143c144,145 < ); --- > ); > }
also eine if-abfrage ergänzt. Das Statusgruppenform wird erst aufgerufen, wenn ein radio-Button checked ist.
Fehler bei Ansicht der Seite
aus MVC wurde Mvc, der neue Aufruf ist also
class ImportStudipController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController
OK
HURRA
BINGO !!!! es funktioniert!! Das war ja was.
weitere Fehler
es können keine weiteren Einstellungen vorgenommen werden zur Hauptauswahl, weil die entsprechenden Formulare nicht sichtbar sind:
diff tx_importstudip.js~ tx_importstudip.js 691c691 < var container = element.closest('.form-section'); --- > var container = element.closest('.form-group');
jetzt sieht es so aus:
und nach dem aufklappen
fataler Fehler json-decode beim Bearbeiten des Forms Person-details
PHP Warning: json_decode() expects parameter 1 to be string, array given in /var/www/hss.dmknet.de/htdocs/typo3conf/ext/importstudip/Classes/Utility/ConfigForm.php line 121
der Fehler tritt nur auf, wenn man bei einer neuen Seite sofort „Mitarbeiter“ konfiguriert. Wenn man zunächst „Liste von Mitarbeitern“ anwählt und anschließend zu „Person“ wechselt, tritt der Fehler nicht auf. Vermutlich wird hier ein Parameter nicht gespeichert, zB Institute.
Anzeige Veranstaltungen kann nicht konfiguriert werden, es gibt diesen Ajax-Fehler:
PHP Warning: implode(): Invalid arguments passed in /var/www/htdocs/typo3conf/ext/importstudip/Classes/Utility/StudipConnector.php line 143