feat: wrote csv export

This commit is contained in:
Leon Etienne 2023-03-24 21:07:34 +01:00
parent 151c2fa7d7
commit ea1bd4fef1
Signed by: leonetienne
SSH Key Fingerprint: SHA256:hs2AZKjRTbd2kYg44u89rM19UT2LyBOpSbIShsdkkfg
4 changed files with 69 additions and 1 deletions

View File

@ -421,3 +421,40 @@ wie beispielsweise seiner Teilnehmernummer oder seiner Nutzergruppenzugehörigke
der Extbase-nativej Domain-Model-FrontendUser-Klasse bedient \cite{bib:typo3-ref-extbase-model-feuser}.
\subsection{CSV-Export}
Das letzte Glied des analogen Prozesses, den es zu digitalisieren gilt, ist der Datenexport der Weindaten je Jahresauswahlprobe.
TYPO3s ListView bietet einen nativen CSV-Exporter an \cite{bib:pixelant-typo3-data-export},
jedoch kommt dieser nicht den Anforderungen gerecht, da das CSV-Dokument Daten verschiedener Datenbanktabellen im Verein
beinhalten muss.
Um eine reibungslose Integration in die restlichen Prozesse von Weinland Mosel zu gewährleisten, muss das exportierte CSV
das selbe Format haben, wie bisher bestehende Excel-Dateien. Dieses Format ist durch genaue Spaltennamen,
Spalteneihenfolgen und den Arten von Daten, die angefragt werden, definiert.
Um einen benutzerdefinierten Exporter im Backend bereitzustellen, wird ein Backendmodul registriert, das immer im linken
Reitermenü verfügbar ist.
Dieses Bankendmodul stellt eine Listenansicht aller Jahresauswahlproben bereit.
Restriktionen gibt es hierbei keine, da diese Listenansicht
nur im Backend, nur für Administratoren und Redakteure, verfügbar ist.
Jeder Listeneintrag ist eine Verlinkung auf eine Detailansicht der jeweiligen Jahresauswahlprobe.
Diese Detailansicht ist der CSV-Exporter. Hierfür werden alle Weine aus der Datenbank angefragt,
die der jeweiligen Jahresauswahlprobe zugeordnet sind. Zusammenhängende Relationen, wie zum Beispiel Teilnehmerdatensätze,
die Attribute dieser Weine sind, werden automatisch von Extbase angefragt \cite{bib:typo3-docs-model-explained}.
Das CSV-Dokument wird über die PHP-native Funktion \enquote{fputcsv} generiert. Diese Funktion nimmt einen
numerisch indizierten Array und schreibt eine darauf basierende CSV-Zeile in eine Datei \cite{bib:php-fputcsv}.
Um gut wartbaren PHP-Code zu erzeugen, werden alle CSV-Zeilen in einem zweidimensionalen Array,
der das gesamte CSV-Dokument darstellt,
durch alphanumerisch indizierte, innere Arrays abgebildet. Somit ist bei jeder Wertzuweisung der zugehörige Spaltenname ersichtlich.
Über die nativen PHP-Funktionen \enquote{array\_keys} und \enquote{array\_values} wird dieser zwar gut lesbare,
aber mit \enquote{fputcsv} inkompatibler
Array zu einer Reihe kompatibler Array konvertiert. Hierbei werden durch \enquote{array\_values} die Kopfzeile und durch
\enquote{array\_values} die Datenzeilen extrahiert. Diese Zeilen werden anschließend mit \enquote{fputcsv}
in die Zieldatei geschrieben. Als Zieldatei wird eine temporäre Datei im Arbeitsspeicher angegeben,
um das fertig erzeugte CSV-Dokument als Zeichenkette in PHP zu erhalten. Das spart vermeidbare Festplattenschreib- und Lesezugriffe.
Im Fluid-Template des Backendmoduls wird das generierte CSV-Dokument in einem nicht beschreibbaren Textarea-Feld präsentiert.
Um Weinland Mosel weitere Arbeitszeit zu sparen und somit den Profit zu fördern, wird eine Download-Funktion für CSV-Dateien
angeboten. Das erspart das manuelle Kopieren und Abspeichern von CSV-Code von IT-Fachfremden, reduziert damit die Anzahl
an benötigten Übergangsschritten in weitere Prozesse und reduziert somit die Komplexität der Umstellung.
Auch im Interesse, Arbeitszeit in der Umsetzung zu sparen,
wurde diese Downloadfunktion JavaScript-seitig umgesetzt. Dadurch ist der Download in derselben Action implementiert.
Somit muss weder abstrahiert werden, noch ein weiterer Exporter gebaut werden.
Hierfür wird ein EventHandler auf den Download-Button angewandt, der bei Betätigung ein vestecktes
\enquote{a}-Element erstellt, über das \enquote{download}-Attribut den Download-Dateinamen festlegt und als \enquote{href}-Attribut
eine Blob-Url zuweist. Diese Blob-Url wird über ein Blob-Objekt generiert \cite{bib:tutorialspoint-js-save-text}.

View File

@ -360,6 +360,22 @@
note = {Zugriff: März 2023}
}
@misc{bib:php-fputcsv,
author = {{The PHP Group}},
howpublished = "\url{https://www.php.net/manual/de/function.fputcsv.php}",
title = {{PHP: fputcsv Manual}},
year = {2023},
note = {Zugriff: März 2023}
}
@misc{bib:tutorialspoint-js-save-text,
author = {Shubham Vora},
howpublished = "\url{https://www.tutorialspoint.com/how-to-create-and-save-text-file-in-javascript}",
title = {{How to Create and Save text file in JavaScript?}},
year = {2022},
note = {Zugriff: März 2023}
}
@misc{bib:typo3-fluid,
author = {{TYPO3 Association}},
howpublished = "\url{https://typo3.org/fluid}",
@ -464,6 +480,14 @@
note = {Zugriff: März 2023}
}
@misc{bib:typo3-docs-model-explained,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://docs.typo3.org/m/typo3/reference-coreapi/11.5/en-us/ExtensionArchitecture/Extbase/Reference/Domain/Model.html}",
title = {{Model - Typo3 explained 11.5 documentaion}},
year = {2023},
note = {Zugriff: März 2023}
}
@misc{bib:typo3-ref-standalone-view,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://api.typo3.org/10.4/class_t_y_p_o3_1_1_c_m_s_1_1_fluid_1_1_view_1_1_standalone_view.html}",
@ -479,3 +503,11 @@
year = {2023},
note = {Zugriff: März 2023}
}
@misc{bib:pixelant-typo3-data-export,
author = {{Pixelant}},
howpublished = "\url{https://www.typo3manual.com/typo3-basics/tips-and-functions/exporting-data-through-list-view/}",
title = {{Tutorial on exporting Data from TYPO3}},
year = {2023},
note = {Zugriff: März 2023}
}

BIN
main.pdf

Binary file not shown.

View File

@ -1,5 +1,4 @@
<?php
// example code
function T($arr, $p) {
foreach ($arr as $a) {