Benutzer-Werkzeuge

Webseiten-Werkzeuge


typo3:studip

Dies ist eine alte Version des Dokuments!


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

TYPO3\CMS\Core\Utility\GeneralUtility::callUserFunctionNo class named UniPassau\Importstudip\Utility\ConfigForm

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

PHP Fatal error: Call to undefined method UniPassau\\Importstudip\\Utility\\StudipRESTHelper::enqueue()

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

PHP Warning: Invalid argument supplied for foreach() in /var/www/hss.dmknet.de/htdocs/typo3conf/ext/importstudip/Classes/Utility/StudipConnector.php line 39

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"

und bei direktem Aufruf der api:

HTTP/1.1 403 Route not activated

das ist es aber nicht, die Anmeldedaten stimmen nicht

Nutzer in Stud.IP eingerichtet, Routen konfiguriert in der api bei Stud.IP

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

00597:         #$data=$data[0];
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 in der ConfigForm.php diese Zeile in der funktion getConfig hinzugefügt:
$data=$data[0];

die vollständige Funktion sieht jetzt so aus:

 public static function getConfig($data) {
        $result = array();
        // Extract already configured flexform values.   
        $data=$data[0];
        $xml = simplexml_load_string($data['row']['pi_flexform']);
        if ($xml) {
            $json = json_encode($xml);
            $fullConfig = json_decode($json, true);
            $fullConfig = $fullConfig['data']['sheet']['language']['field'];  
            foreach ($fullConfig as $c) {
                $result[$c['@attributes']['index']] = $c['value'];
            }
        }
        return $result;
    }

die Fehlermeldung mit dem simplexml_load_string ist jetzt weg!

der Fehler ist weg, die Funktion macht aber jetzt rein garnix mehr, es werden keine Konfigurationsdaten gespeichert. Mit python wäre das nicht passiert ;-)

neuer Versuch mit dieser komplett neuen Funktion, nachdem ich die Struktur des Arrays durchsucht habe:

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

grafiken werden nicht geladen, Ansicht Einrichtungsbaum verwurschtelt

css-file angepasst, eventuell browserabhängig, Grafiken liegen bei TYPO3-7 unter sysext/t3skin/icons/gfx/ol, Pfade angepasst in ConfigForm.php

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');
der Bezeichner t3-form-field-container ist nicht mehr vorhanden im Backend von TYPO3-v7.6

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.

typo3/studip.1469089027.txt.gz · Zuletzt geändert: 2016/07/21 10:17 von 2007