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"

die Anmeldedaten stimmen also 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.

bis hierhin, es gibt erstmal keinen Fehler mehr bei der Konfiguration

Fehler bei Ansicht der Seite

Fatal error: Class 'TYPO3\CMS\Extbase\MVC\Controller\ActionController' not found in /var/www/htdocs/typo3conf/ext/importstudip/Classes/Controller/ImportStudipController.php on line 26

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.

Feinarbeit

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
typo3/studip.1470127767.txt.gz · Zuletzt geändert: 2016/08/02 10:49 von 2007