Kopfdaten und Grenzen
- Release
- 7.0.12 → 7.0.13
- Commits
- 5
- Geänderte Dateien
- 155
- Analyse
- 2026-09-03
- Schwerpunkt
- Statistik-API neu geschnitten
Nicht untersucht
Verglichen wurden die im Repository vorhandenen Tags 7.0.12+260833 und 7.0.13+260903 mit git log --oneline 7.0.12+260833..7.0.13+260903 und git diff --stat 7.0.12+260833..7.0.13+260903. Nicht untersucht wurden die vorgebauten Auslieferungsdateien unter editor/build, die binären Sprachkataloge unter locale sowie die React-Quellen des Editors, soweit sie nicht die Nutzung der beiden geänderten Endpunkte betreffen; Aussagen über das tatsächliche Verhalten der Editor-Oberfläche stützen sich daher auf die serverseitigen Schnittstellen und nicht auf die ausgelieferten Bundles. Die Datei docs/release_notes.txt nennt zwei weitere Korrekturen zur Massenbearbeitung von Teilnehmern und zu einer Paginierungskomponente, deren Codeänderungen im Diff nicht als eigener Änderungsblock erkennbar sind; sie bleiben hier unbeschrieben. Indirekte Effekte über transitive Drittabhängigkeiten sind durch reine Diff-Analyse nicht vollständig erfassbar. Aus dem Kapitel „Weitere relevante Änderungen" sind vier Kandidaten geringerer Relevanz aus dem Editor-Frontend nicht aufgeführt, darunter die Neufassung der Tabellenkomponente und neue Oberflächenbausteine ohne Schnittstellenwirkung.
Executive Summary
Dieses Release ist im Kern ein Umbau der Auswertungsschnittstellen: Der Statistikendpunkt und der Antwortendpunkt der REST-Schnittstelle liefern beide eine andere Nutzdatenform als bisher, die Statistikauswertung wurde von Einzelabfragen je Diagramm auf einen gemeinsamen Tabellendurchlauf umgestellt, und deutlich mehr Fragetypen erzeugen überhaupt ein Diagramm. Dazu kommt eine Korrektur, ohne die Aktualisierungen auf PostgreSQL scheitern. Am ehesten unbemerkt kaputt geht der Statistikabruf: Er ist jetzt seitenweise und liefert ohne ausdrückliche Seitenangabe nur die ersten fünfzehn Diagramme, ohne dass ein Fehler entsteht. Ebenso still verschwindet beim Antwortendpunkt die bisherige Zwischenebene der Nutzdaten, und unbekannte Filterschlüssel werden nun übergangen statt abgewiesen.
- Antwortendpunkt der REST-API neu geschnitten
- Statistikendpunkt liefert nur eine Diagrammseite
- Filterschlüssel werden gegen die Feldkarte geprüft
- Diagramm-Metadaten auf feste Felder reduziert
- Statistikauswertung in einem Tabellendurchlauf
- Prozessorvertrag der Statistikklassen geändert
Upgrade-Empfehlung
🧪 Vorher testen
Für Installationen ohne eigene Nutzung der beiden Endpunkte ist das Release unkritisch und behebt einen Fehler, der Aktualisierungen auf PostgreSQL verhindert. Wer den Antwort- oder Statistikendpunkt aus eigenem Code anspricht, muss die geänderte Nutzdatenform und die neue Seitenaufteilung vorher prüfen, weil beide Änderungen ohne Fehlermeldung wirken. Erweiterungen, die von den Statistik-Prozessorklassen erben, brechen zur Laufzeit.
Lesepfad
| Zielgruppe | Relevante Kennungen und Kapitel |
|---|---|
| Administratoren | A5 · Weitere relevante Änderungen · Empfehlung |
| Plugin-Entwickler | A6 · Weitere relevante Änderungen · Empfehlung |
| Theme-Entwickler | keine Kennung · Weitere relevante Änderungen · Empfehlung |
| Integratoren | A1 · A2 · A3 · A4 · A5 · Weitere relevante Änderungen · Empfehlung |
| API-Nutzer | A1 · A2 · A3 · A4 · A5 · Weitere relevante Änderungen · Empfehlung |
Die wichtigsten Änderungen
A1: Antwortendpunkt der REST-API neu geschnitten
Hintergrund: Das Kommando hinter der Route für Umfrageantworten baute seine Ausgabe bisher in zwei Stufen: Es sammelte Antwortdatensätze, Fragenfeldkarte und Metadaten in einem Array und übergab dieses Array als Wert des Schlüssels responses an die Erfolgsantwort. Das Ergebnis war eine doppelte Ebene gleichen Namens. Mit diesem Release wird das gesammelte Array direkt als Nutzdaten übergeben. Gleichzeitig wurde die Parameterliste der Route umgestellt: Der bisher eigenständig deklarierte Seitengrößenparameter entfällt, dafür kommen eine Sprachangabe und eine Feldauswahl hinzu. Die Feldkarte der Umfrage wird jetzt vor dem Abfragen der Daten und mit der angeforderten Sprache erzeugt, statt danach und in der Basissprache.
Konsequenz: Wer die Nutzdaten über den Pfad responses.responses ausliest, erhält nichts mehr; die Schlüssel responses, surveyQuestions und _meta liegen nun auf derselben Ebene. Die Feldauswahl fields beschränkt die gelesenen Spalten, behält aber die für die Ausgabe benötigten Systemspalten bei; eine nicht leere Auswahl, die keiner echten Spalte entspricht, wird als fehlerhafte Anfrage abgewiesen. Die Sprachangabe language wählt die Beschriftungssprache und fällt bei unbekanntem Wert auf die Basissprache der Umfrage zurück. Eine ungültige Umfragekennung führt jetzt zu einer Fehlerantwort mit Anfragebezug statt zu einem unbehandelten Fehler. Die Seitengröße ist innerhalb des Objekts page zu übergeben; ob eine bislang außerhalb übergebene Seitengröße überhaupt gewirkt hat, ist aus dem Diff nicht bestimmbar.
Vorher / Nachher:
// Vorher (application/libraries/Api/Command/V1/SurveyResponses.php)
$data = $this->process($request);
return $this->responseFactory->makeSuccess(['responses' => $data]);
// Nachher
return $this->responseFactory->makeSuccess($this->process($request));
// Vorher (application/config/rest/v1/survey-responses.php)
'filters' => ['type' => 'array'],
'sort' => ['type' => 'array'],
'pageSize' => ['type' => 'array'],
'page' => ['type' => 'array']
// Nachher
'filters' => ['type' => 'array'],
'sort' => ['type' => 'array'],
'page' => ['type' => 'array'],
'language' => ['type' => 'string'],
'fields' => ['type' => 'array']
Neuer Bezugswert: Die bisherige Zwischenebene entfällt vollständig; Antwortdatensätze stehen unter responses, die Fragenfeldkarte unter surveyQuestions, Seiten- und Filterangaben unter _meta der Nutzdaten.
Nach dem Update testen: Den Endpunkt einmal ohne Parameter aufrufen und die Schlüssel der Nutzdaten protokollieren, um die entfallene Ebene im eigenen Code nachzuziehen. Anschließend eine Feldauswahl mit genau einer Fragespalte senden und prüfen, dass Kennung, Absendezeitpunkt und Sprache trotzdem enthalten sind. Zuletzt eine Feldauswahl mit einem erfundenen Spaltennamen senden und die Fehlerantwort auswerten.
Betroffene Dateien: application/libraries/Api/Command/V1/SurveyResponses.php, application/config/rest/v1/survey-responses.php, application/libraries/Api/Command/V1/SurveyResponses/SurveyRequestTrait.php
Relevante Commits: 805768402b
A2: Statistikendpunkt liefert nur eine Diagrammseite
Hintergrund: Der Statistikdienst lieferte bisher für jede diagrammfähige Frage einer Umfrage ein Diagramm in einer Antwort. Das zugehörige Kommando setzt jetzt bei jedem Aufruf eine Seitenaufteilung auf dem Dienst, liest Seitenindex und Seitengröße aus den Abfrageparametern und gibt die zugehörigen Seitenangaben neben den Diagrammen zurück. Die Auswertung schneidet die Liste der diagrammfähigen Fragen auf die angeforderte Seite zu, bevor überhaupt Datenbankabfragen geplant werden. Fragetypen ohne Prozessor belegen dabei keinen Platz auf der Seite.
Konsequenz: Ein Aufruf ohne Seitenparameter liefert nur die ersten fünfzehn Diagramme, ohne dass eine Fehlermeldung oder ein Hinweis auf fehlende Inhalte entsteht; Auswertungen, die bisher alle Diagramme in einem Aufruf erwarteten, sind damit unvollständig. Die Seitengröße ist nach oben begrenzt, sodass auch ein sehr großer Wert nicht die vollständige Liste erzwingt. Der Rückgabewert enthält zusätzlich einen Block mit Seitenindex, Seitengröße, Gesamtzahl und einem Kennzeichen, ob weitere Seiten folgen; dieses Kennzeichen ist der vorgesehene Weg, die Diagramme in Folgeaufrufen vollständig einzusammeln. Die Umschaltung greift unabhängig davon, ob Filter gesetzt sind.
Vorher / Nachher:
// Vorher (application/libraries/Api/Command/V1/Statistics.php)
return $this->responseFactory
->makeSuccess([
'statistics' => $statistics,
]);
// Nachher
return $this->responseFactory
->makeSuccess([
'statistics' => $statistics,
'pagination' => $this->statisticsService->getPaginationMeta(),
]);
// Neu (application/libraries/Api/Command/V1/Statistics.php)
/** Default number of charts returned per page */
private const DEFAULT_PAGE_SIZE = 15;
private const MAX_PAGE_SIZE = 100;
...
private function getPageSize(): int
{
$pageSize = Yii::app()->getRequest()->getQueryParams()['pageSize'] ?? self::DEFAULT_PAGE_SIZE;
return min(self::MAX_PAGE_SIZE, max(1, (int)$pageSize));
}
Konfiguration: Die Routendefinition unter application/config/rest/v1/statistics.php deklariert die zulässigen Abfrageparameter des Endpunkts und wurde um vier Einträge erweitert:
// Neu (application/config/rest/v1/statistics.php)
'search' => ['type' => 'array'],
'language' => ['type' => 'string'],
'page' => ['type' => 'integer'],
'pageSize' => ['type' => 'integer'],
Die Datei gehört zum ausgelieferten Code und ist nicht zur Bearbeitung durch Administratoren gedacht. Fehlt einer der Einträge, weil eine ältere Fassung der Datei aus einem unvollständigen Update stammt, ist der zugehörige Parameter im Endpunkt nicht deklariert; die serverseitige Seitenaufteilung im Kommando wirkt davon unabhängig, weil sie die Abfrageparameter direkt aus der Anfrage liest.
Nach dem Update testen: Eine Umfrage mit mehr als fünfzehn diagrammfähigen Fragen abrufen und die Anzahl der zurückgegebenen Diagramme mit der Gesamtzahl aus dem Seitenblock vergleichen. Danach mit dem Kennzeichen für weitere Seiten so lange nachladen, bis es ausbleibt, und prüfen, ob alle erwarteten Fragen genau einmal vorkommen. Zuletzt eine Seitengröße oberhalb der Obergrenze senden und die tatsächlich gelieferte Anzahl gegenprüfen.
Betroffene Dateien: application/libraries/Api/Command/V1/Statistics.php, application/config/rest/v1/statistics.php, application/models/services/SurveyStatistics/StatisticsService.php, application/models/services/SurveyStatistics/Charts/Questions/QuestionStatistics.php
Relevante Commits: 805768402b
A3: Filterschlüssel werden gegen die Feldkarte geprüft
Hintergrund: Die Filter- und Sortierlogik des Antwortendpunkts löste einen übergebenen Schlüssel bisher erst innerhalb der Handlerschleife auf und gab ihn ungeprüft an die Abfrage weiter. Ein Schlüssel ohne zugehörige Spalte führte damit zu einer Datenbankausnahme, die das Kommando in eine Fehlerantwort über einen ungültigen Schlüssel umsetzte. Die Auflösung wandert nun vor die Handlerschleife, und der aufgelöste Schlüssel wird gegen eine Menge zulässiger Bezeichner geprüft, die aus den echten Spalten der Antworttabelle und den Feldern der Ausgabeabbildung gebildet wird. Der Aufrufer übergibt diese Spaltenliste als neuen fünften Parameter; bleibt sie leer, findet keine Prüfung statt.
Konsequenz: Ein unbekannter oder falsch geschriebener Filterschlüssel führt nicht mehr zu einer Fehlermeldung, sondern wird übergangen — die Anfrage liefert dann Daten, die weniger stark gefiltert sind als angefordert. Wer Filter aus Benutzereingaben oder aus einer eigenen Feldzuordnung aufbaut, verliert damit die bisherige Rückmeldung über ungültige Schlüssel und sollte die Rückgabe gegen die eingesetzten Filter prüfen. Umgekehrt sind Filter auf verschachtelte Frage- und Teilfragespalten jetzt ausdrücklich vorgesehen und werden auf Abfrageebene angewandt. Die Prüfung ist unabhängig von Groß- und Kleinschreibung. Ob es Spalten gibt, die in der Antworttabelle existieren, aber nicht in der Feldkarte auftauchen und daher nun als Filterziel entfallen, ist aus dem Diff nicht bestimmbar.
Vorher / Nachher:
// Vorher (application/libraries/Api/Command/V1/SurveyResponses/FilterPatcher.php)
public function apply(array $filterParams, \LSDbCriteria &$criteria, \CSort &$sort, array $dataMap = array()): void
{
// Nachher
public function apply(
array $filterParams,
\LSDbCriteria &$criteria,
\CSort &$sort,
array $dataMap = array(),
array $validColumns = array()
): void {
// Neu (application/libraries/Api/Command/V1/SurveyResponses/FilterPatcher.php)
// Validate the resolved key(s) against the survey's real
// columns so nested question/subquestion columns are filtered
// at query level and unknown keys never reach the SQL.
if (!$this->isAllowedKey($key, $dataMap, $validColumns)) {
continue;
}
Nach dem Update testen: Einen Filter mit einem erfundenen Schlüssel senden und prüfen, ob die Antwort ungefiltert zurückkommt, statt einen Fehler zu melden. Danach einen Filter auf eine Teilfragespalte einer Matrixfrage senden und die Trefferzahl gegen eine Auswertung in der Datenbank halten. Zuletzt den Schlüssel für abgeschlossene Antworten prüfen, der intern auf das Absendedatum umgeschrieben wird.
Betroffene Dateien: application/libraries/Api/Command/V1/SurveyResponses/FilterPatcher.php, application/libraries/Api/Command/V1/SurveyResponses.php
Relevante Commits: 805768402b
A4: Diagramm-Metadaten auf feste Felder reduziert
Hintergrund: Die Diagrammobjekte entstanden bisher in den einzelnen Fragenprozessoren, die den vollständigen intern zusammengetragenen Fragedatensatz als Metadaten mitgaben, samt Attributen, Antwortoptionen und Rohtexten. Aufgebaut werden die Objekte nun zentral in der Auswertungsklasse, die die Metadaten anschließend auf eine feste Feldliste zuschneidet. Diese enthält Fragekennung, Gruppenkennung, Fragecode, Typ, eine lesbare Typbezeichnung, den Fragethemennamen, den Hilfetext und die Spaltennamen der Frage in der Antworttabelle. Für Matrixfragen mit zwei Skalen kommen die beiden Spaltenüberschriften hinzu.
Konsequenz: Auswertungen, die Felder aus den bisherigen Metadaten gelesen haben, die nicht in der neuen Liste stehen, finden diese nicht mehr vor und erhalten keinen Fehler, sondern einen fehlenden Wert. Neu verfügbar sind dafür die lesbare Typbezeichnung in der angeforderten Sprache, der Fragethemenname sowie die Liste der Antwortspalten, mit der sich der Antwortendpunkt gezielt auf die Spalten einer Frage einschränken lässt. Der bisher unter dem Fragetitel geführte Wert erscheint jetzt unter einem eigenen Feld für den Fragecode. Frage- und Hilfetexte werden beim Zusammentragen mit dekodierten HTML-Entitäten geliefert.
Vorher / Nachher:
// Vorher (application/models/services/SurveyStatistics/Charts/Questions/Processors/SingleOptionProcessor.php)
return new StatisticsChartDTO(
$title,
$legend,
$dataItems,
$totalResponses,
['question' => $this->question]
);
// Nachher
$meta['question'] = [
'qid' => $question['qid'] ?? null,
'gid' => $question['gid'] ?? null,
'code' => $question['title'] ?? null,
'type' => $question['type'] ?? null,
...
'themeName' => $question['question_theme_name'] ?? null,
'help' => $question['help'] ?? null,
...
'fields' => $this->questionFields[(int) ($question['qid'] ?? 0)] ?? [],
];
Der Nachher-Auszug stammt aus der Auswertungsklasse, in die der Aufbau der Diagrammobjekte verlagert wurde.
Neuer Bezugswert: Fragedetails, die nicht mehr in den Diagramm-Metadaten stehen, sind über die Fragenkommandos der Schnittstelle oder über die mitgelieferten Spaltennamen und den Antwortendpunkt zu beziehen. Welche der bisher mitgelieferten Felder in der Praxis genutzt wurden, ist aus dem Diff nicht bestimmbar; die Zuordnung muss je Auswertung geprüft werden.
Nach dem Update testen: Ein Diagramm einer Listenfrage abrufen und die Feldnamen der Metadaten mit den im eigenen Code gelesenen Feldern vergleichen. Danach eine Matrixfrage mit zwei Skalen abrufen und prüfen, ob die beiden Spaltenüberschriften vorhanden sind. Zuletzt die gelieferten Spaltennamen als Feldauswahl an den Antwortendpunkt senden und die Rückgabe gegenprüfen.
Betroffene Dateien: application/models/services/SurveyStatistics/Charts/Questions/QuestionStatistics.php, application/models/services/SurveyStatistics/Charts/StatisticsChartDTO.php, application/models/services/SurveyStatistics/Charts/Questions/Processors/SingleOptionProcessor.php
Relevante Commits: 805768402b
A5: Statistikauswertung in einem Tabellendurchlauf
Hintergrund: Jeder Fragenprozessor führte bisher eigene Zählabfragen auf der Antworttabelle aus, teils eine je Antwortoption. Neu ist eine Sammelklasse, bei der die Prozessoren ihre Kennzahlen zunächst nur anmelden; anschließend werden sie als bedingte Aggregate in einem gemeinsamen Durchlauf über die Antworttabelle ausgeführt und erst danach in die Diagrammwerte eingesetzt. Die Anzahl der Ausdrücke je Abfrage ist begrenzt, Mediane laufen als eigene sortierte Abfragen nach dem Hauptdurchlauf. Zugleich erhalten mehrere bislang nicht ausgewertete Fragetypen einen Prozessor, die Diagrammreihenfolge folgt jetzt der Gruppenreihenfolge der Umfrage, und ein neuer Suchfilter prüft Begriffe gegen die Freitextspalten einer Umfrage.
Konsequenz: Statistikaufrufe erzeugen deutlich weniger Einzelabfragen, was bei großen Antworttabellen die Antwortzeit senkt, dafür aber breitere Abfragen mit vielen Bedingungen je Zeile stellt; die Last verschiebt sich von der Anzahl der Abfragen auf die Kosten je Zeile. Für Zahleneingaben, mehrfache Zahleneingaben, Mehrzeilenfreitext, mehrfache Kurztexte, Matrixtexte und Listen mit Kommentar entstehen erstmals Diagramme. Auswertungen, die Diagramme über ihre Position in der Liste ansprechen, greifen daher auf andere Inhalte als bisher, und die geänderte Reihenfolge verstärkt das. Anteile und Segmentwerte werden serverseitig berechnet und sind nicht mehr aus den Rohwerten abzuleiten. Der Suchfilter erlaubt bis zu zehn Begriffe begrenzter Länge, verknüpft sie mit „und" und liefert für Umfragen ohne Freitextspalte kein Ergebnis.
Vorher / Nachher:
// Vorher (application/models/services/SurveyStatistics/Charts/Questions/QuestionStatistics.php)
// No statistics for these types of questions
Question::QT_K_MULTIPLE_NUMERICAL => fn() => null,
...
Question::QT_U_HUGE_FREE_TEXT => fn() => null,
Question::QT_Q_MULTIPLE_SHORT_TEXT => fn() => null,
Question::QT_SEMICOLON_ARRAY_TEXT => fn() => null,
// Nachher
Question::QT_U_HUGE_FREE_TEXT => fn() => new TextProcessor(),
Question::QT_Q_MULTIPLE_SHORT_TEXT => fn() => new MultipleChoiceProcessor(),
...
Question::QT_K_MULTIPLE_NUMERICAL => fn() => new MultipleNumericalProcessor(),
...
Question::QT_SEMICOLON_ARRAY_TEXT => fn() => new ArrayTextProcessor(),
// Neu (application/models/services/SurveyStatistics/Charts/Questions/Processors/ResponseAggregateBatch.php)
/**
* Collects every aggregate needed for survey statistics and executes them
* as conditional aggregates over a single scan of the responses table.
*
* Usage is two-phased:
* 1. Registration: countValue()/countBlank()/countNonEmpty()/countTotal()
* each return an alias for the requested aggregate (deduplicated).
* 2. execute() runs the merged SELECT (chunked only when the expression
* list is very large), after which value($alias) returns the count.
*/
Nach dem Update testen: Eine Umfrage mit vielen Fragen und großer Antworttabelle auswerten und Laufzeit sowie Abfragezahl im Datenbankprotokoll mit dem Stand vor dem Update vergleichen. Danach für eine Zahleneingabe und eine Liste mit Kommentar prüfen, ob die neuen Diagramme plausible Werte und Summen liefern. Zuletzt einen Suchbegriff setzen, der in Freitextantworten vorkommt, und die Trefferzahl gegen eine eigene Abfrage auf der Antworttabelle halten.
Betroffene Dateien: application/models/services/SurveyStatistics/Charts/Questions/Processors/ResponseAggregateBatch.php, application/models/services/SurveyStatistics/Charts/Questions/QuestionStatistics.php, application/models/services/SurveyStatistics/StatisticsResponseFilters.php, application/models/services/SurveyStatistics/Charts/Questions/Processors
Relevante Commits: 805768402b
A6: Prozessorvertrag der Statistikklassen geändert
Hintergrund: Die Basisklasse der Fragenprozessoren hat mit dem Umbau ihren Vertrag gewechselt. Die Prozessormethode liefert nicht mehr ein fertiges Diagrammobjekt, sondern einen Plan aus Titel, Legende und Datenzeilen, in dem die Werte als aufrufbare Platzhalter stehen. Vor dem Planen muss die gemeinsame Sammelklasse gesetzt werden; die bisherigen Setzmethoden für die Filter nach Abschlussstatus und Kennungsbereich entfallen, weil die Filter nun an der Sammelklasse hängen. Die Zählmethoden geben statt Zahlen aufrufbare Werte zurück, der klasseninterne Zwischenspeicher für die Gesamtzahl entfällt, und die öffentliche Methode zum Abholen aggregierter Antworten wurde entfernt.
Konsequenz: Erweiterungen, die von der Basisklasse erben, eigene Prozessoren registrieren oder die genannten Methoden aufrufen, brechen beim nächsten Statistikaufruf sichtbar, entweder weil die Sammelklasse nicht gesetzt ist, weil ein Diagrammobjekt anstelle eines Plans zurückkommt oder weil eine entfernte Methode aufgerufen wird. Wer die Rückgabe der Zählmethoden weiterverarbeitet, erhält jetzt einen aufrufbaren Wert statt einer Zahl und muss die Auflösung nach dem Ausführen der Sammelabfrage nachziehen. Da die Klassen nicht als dokumentierte Erweiterungsschnittstelle ausgewiesen sind, dürfte der Kreis der betroffenen Erweiterungen klein sein; das ist eine Vermutung, gestützt darauf, dass der Diff keine Registrierungspunkte für fremde Prozessoren zeigt.
Vorher / Nachher:
// Vorher (application/models/services/SurveyStatistics/Charts/Questions/Processors/AbstractQuestionProcessor.php)
public function getTotalCount(): int
{
if (!isset(self::$totalCountCache[$this->surveyId])) {
...
}
return self::$totalCountCache[$this->surveyId];
}
// Nachher
public function getTotalCount(): callable
{
return $this->read($this->batch->countTotal());
}
Neuer Bezugswert: Gesamt- und Spaltenzahlen sind über die Sammelklasse und deren Ausführung zu beziehen; die entfernte Methode für aggregierte Antworten hat im Diff keine Nachfolgemethode mit gleicher Aufgabe, sodass eigener Code die benötigten Aggregate über die Anmeldemethoden der Sammelklasse abbilden muss.
Nach dem Update testen: Den Statistikaufruf einmal mit aktivierten Erweiterungen ausführen und das Fehlerprotokoll auf Aufrufe entfernter Methoden prüfen. Eigene Prozessoren gegen den neuen Plan umstellen und dabei kontrollieren, dass jeder Wert nach dem Ausführen der Sammelabfrage aufgelöst wird. Zuletzt eine Umfrage mit Filter nach Abschlussstatus auswerten und die Zahlen gegen die ungefilterte Auswertung halten.
Betroffene Dateien: application/models/services/SurveyStatistics/Charts/Questions/Processors/AbstractQuestionProcessor.php, application/models/services/SurveyStatistics/Charts/Questions/Processors/ResponseAggregateBatch.php, application/models/services/SurveyStatistics/Charts/Questions/QuestionStatistics.php
Relevante Commits: 805768402b
Sammel-Commit 805768402b; umfasst die 6 vorstehenden Einträge.
Weitere relevante Änderungen
Sequenzabfrage für PostgreSQL-Updates korrigiert
Datenbank · Kein Bruch · Administratoren
Der Aktualisierungshelfer ermittelt Sequenzen jetzt über die Namensräume des Systemkatalogs, wodurch das Update auf PostgreSQL wieder durchläuft. (76237d254d)
-- Vorher (application/helpers/update/updatedb_helper.php)
FROM pg_class AS S,
pg_depend AS D,
pg_class AS T,
pg_attribute AS C,
pg_tables AS PGT
...
AND T.relname = PGT.tablename";
-- Nachher
pg_namespace AS SN,
pg_namespace AS TN
...
AND S.relnamespace = SN.oid
AND T.relnamespace = TN.oid
AND D.classid = 'pg_class'::regclass
AND D.refclassid = 'pg_class'::regclass
AND D.deptype IN ('a', 'i')
AND C.atttypid IN ('int2'::regtype, 'int4'::regtype, 'int8'::regtype)
AND NOT C.attisdropped";
Die Änderung liegt in der Funktion zur Sequenzreparatur und betrifft die Auswahl der zu setzenden Sequenzen, nicht die Tabellenstruktur. Ob die zuvor erzeugten Anweisungen auf Installationen mit mehreren Namensräumen falsche Sequenzwerte gesetzt haben, ist aus dem Diff nicht bestimmbar.
Enthältfilter verwendet eindeutige Platzhalter
RemoteControl API · Kein Bruch · Integratoren, API-Nutzer
Mehrere Enthält-Filter einer Anfrage erhalten nun eindeutige Platzhalternamen und werden geklammert, sodass kombinierte Filter das erwartete Ergebnis liefern. (805768402b)
Antwortausgabe nennt die Antwortbeschriftung
RemoteControl API · Kein Bruch · Integratoren, API-Nutzer
Jede zugeordnete Antwort trägt zusätzlich das Feld answerLabel mit der Beschriftung aus dem gemeinsamen Antwortzwischenspeicher. (805768402b)
Seitenangaben der Antwortliste werden normalisiert
RemoteControl API · Kein Bruch · Integratoren, API-Nutzer
Seitengröße und Seitenindex werden jetzt als Ganzzahl ausgewertet und bei ungültigen oder negativen Werten auf die Vorgabewerte zurückgesetzt. (805768402b)
Anfragehelfer für Antwortkommandos in Trait ausgelagert
Plugin-Kompatibilität · Kein Bruch · Plugin-Entwickler
Umfrageauflösung, Kennungsprüfung und Seitenvorgaben liegen jetzt in einem eigenen Trait, den mehrere Antwortkommandos gemeinsam nutzen. (805768402b)
Fragetexte der Statistik mit dekodierten Entitäten
RemoteControl API · Stiller Fehler · Integratoren, API-Nutzer
Frage- und Hilfetexte der Diagrammausgabe enthalten dekodierte HTML-Entitäten, sodass eigene Weiterverarbeitung eine doppelte Kodierung vermeiden muss. (805768402b)
Editor-Bundle neu gebaut und ausgeliefert
Themes und Rendering · Kein Bruch · Administratoren
Die vorgebauten Dateien des Editors sind unter neuen Namen ausgeliefert, sodass vorgelagerte Zwischenspeicher die alten Namen nicht mehr finden. (805768402b)
Sammel-Commit 805768402b; umfasst die 6 vorstehenden Einträge.
Versions- und Assets-Kennung angehoben
Themes und Rendering · Kein Bruch · Administratoren, Theme-Entwickler
Die angehobene Assets-Kennung erzwingt ein Neuladen der veröffentlichten Asset-Dateien im Browser und in vorgelagerten Zwischenspeichern. (39b7a4ed76)
Löschsymbol der Frage nur bei Fokus eingeblendet
Themes und Rendering · Kein Bruch · Administratoren
Kopier- und Löschsymbol werden im Fragenfuß nur bei fokussierter Frage gerendert, was die Anzeige während der Editor-Einführung korrigiert. (91173c8dc1)
Übersetzungen und Textvorlage aktualisiert
Themes und Rendering · Kein Bruch · Administratoren
Neun Sprachkataloge und die Textvorlage sind aktualisiert und enthalten die Texte der neuen Statistikansicht. (7111b4086b)
Zuordnung nach Bereich
| Bereich | Vollständig beschrieben | Weitere Einträge |
|---|---|---|
| Sicherheit | keine | – |
| Datenbank | A5 | ja |
| RemoteControl API | A1, A2, A3, A4, A5 | ja |
| Survey Runtime | keine | – |
| Themes und Rendering | keine | ja |
| Plugin-Kompatibilität | A6 | ja |
| Performance | A5 | – |
Nicht betroffene Bereiche
Die klassische RemoteControl-Schnittstelle bleibt unangetastet: application/helpers/remotecontrol/remotecontrol_handle.php kommt im Diff nicht vor, die beschriebenen Änderungen betreffen die Kommandoklassen der REST-Schnittstelle.
Für die Anzeige und Auswertung laufender Umfragen zeigt der Diff keine Änderung: Weder application/helpers/qanda_helper.php noch application/helpers/expressions/em_manager_helper.php sind enthalten.
Ausgelieferte Views und Themes bleiben unverändert: Der Diff enthält keine Datei unter application/views und keine unter themes/survey, also auch keine Twig-Vorlage und keine Theme-Konfiguration.
Die Plugin-Ereignisinfrastruktur bleibt unverändert: application/libraries/PluginManager/PluginEvent.php ist im Diff nicht enthalten, ebenso keine Datei des Ereignisverzeichnisses.
Abhängigkeiten und Mindestanforderungen bleiben unverändert: composer.json, composer.lock und application/config/config-defaults.php kommen im Diff nicht vor.
Am Datenbankschema ist keine Änderung erkennbar: Die interne Datenbank-Versionsnummer trägt vor und nach dem Update denselben Wert, und der Diff des Aktualisierungshelfers zeigt keinen neuen Migrationsblock, sondern ausschließlich die oben zitierte Sequenzabfrage.
// Vorher (application/config/version.php)
$config['versionnumber'] = '7.0.12';
$config['dbversionnumber'] = 711;
$config['buildnumber'] = '';
$config['updatable'] = true;
$config['templateapiversion'] = 3;
$config['assetsversionnumber'] = '30500';
// Nachher
$config['versionnumber'] = '7.0.13';
$config['dbversionnumber'] = 711;
$config['buildnumber'] = '';
$config['updatable'] = true;
$config['templateapiversion'] = 3;
$config['assetsversionnumber'] = '30501';
Empfehlung
Administratoren
Vor dem Update: Datenbanksicherung anlegen, insbesondere auf PostgreSQL-Installationen, weil das Update die Sequenzreparatur ausführt. Prüfen, ob eigene Auswertungen, Berichtsskripte oder angebundene Werkzeuge den Statistik- oder Antwortendpunkt nutzen, und diese gemeinsam mit den Integratoren einplanen (A1, A2). Vorgelagerte Zwischenspeicher und Auslieferungsnetze so vorbereiten, dass die neuen Dateinamen des Editor-Bundles ausgeliefert werden.
Unmittelbar nach dem Update: Die Statistikansicht einer großen Umfrage öffnen und Laufzeit sowie Vollständigkeit der Diagramme prüfen (A5). Auf PostgreSQL eine Testantwort speichern, um zu bestätigen, dass die Sequenzen brauchbare Werte tragen. Antwortliste und Filter der Antwortansicht durchgehen und das Fehlerprotokoll auf Meldungen aus den Statistikklassen sichten.
Rollback: Da im Diff kein neuer Migrationsblock und keine geänderte interne Datenbank-Versionsnummer erkennbar ist, spricht der Befund für einen Rückschritt auf den Dateistand der Ausgangsversion ohne Schemaeingriff. Nicht rückgängig gemacht werden dabei die Wirkungen der Sequenzreparatur auf die Sequenzwerte; ob diese Werte einen Rückschritt unbeschadet überstehen, ist aus dem Diff nicht bestimmbar und vorher in einer Testumgebung zu prüfen. Neue Konfigurationsdateien legt das Update nach dem Diff nicht an.
Plugin-Entwickler
Eigene Erweiterungen, die von der Basisklasse der Statistikprozessoren erben oder deren Zählmethoden aufrufen, auf den geänderten Vertrag umstellen und dabei die entfernte Methode für aggregierte Antworten ersetzen (A6). Danach den Statistikaufruf mit aktivierten Erweiterungen ausführen und das Fehlerprotokoll auswerten. Wer Antwortkommandos ableitet, sollte zusätzlich die in einen Trait verschobenen Anfragehelfer prüfen, beschrieben unter Weitere relevante Änderungen.
Theme-Entwickler
Keine vollständig beschriebene Änderung betrifft diese Gruppe; der Diff enthält keine Datei unter themes/survey und keine Twig-Vorlage. Zu beachten bleibt die angehobene Assets-Kennung, die ein Neuladen veröffentlichter Asset-Dateien erzwingt, beschrieben unter Weitere relevante Änderungen.
Integratoren
Zuerst alle Zugriffe auf den Antwortendpunkt auf die entfallene Zwischenebene umstellen und die Seitengröße innerhalb des Seitenobjekts übergeben (A1). Danach den Statistikabruf auf Seitenaufteilung umstellen und das Kennzeichen für weitere Seiten auswerten (A2). Anschließend die gelesenen Felder der Diagramm-Metadaten gegen die neue Feldliste abgleichen (A4) und die geänderte Diagrammmenge sowie deren Reihenfolge in eigenen Zuordnungen nachziehen (A5). Zuletzt die eingesetzten Filterschlüssel gegen die Feldkarte prüfen, weil unbekannte Schlüssel nun stillschweigend entfallen (A3).
API-Nutzer
Bestehende Abrufe zunächst gegen eine Testinstallation fahren und die Nutzdatenform beider Endpunkte protokollieren (A1, A2). Danach eine Schleife über die Diagrammseiten einbauen, statt eine vollständige Liste zu erwarten (A2), und die Feldauswahl des Antwortendpunkts nutzen, um Abrufe auf die benötigten Spalten zu begrenzen (A1). Filterergebnisse nach dem Update einmal gegen die erwartete Treffermenge halten, weil unbekannte Schlüssel keine Fehlermeldung mehr erzeugen (A3), und die Auswertung der Diagramm-Metadaten auf die verbleibenden Felder umstellen (A4, A5).