diff --git a/chapters/konzeption-entwicklung.tex b/chapters/konzeption-entwicklung.tex index 3bda5ea..5b4a5ec 100644 --- a/chapters/konzeption-entwicklung.tex +++ b/chapters/konzeption-entwicklung.tex @@ -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}. diff --git a/dexes/literature.bib b/dexes/literature.bib index 9c089fc..f545deb 100644 --- a/dexes/literature.bib +++ b/dexes/literature.bib @@ -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} +} diff --git a/main.pdf b/main.pdf index 4042061..368f26b 100644 Binary files a/main.pdf and b/main.pdf differ diff --git a/test.php b/test.php index c11d940..d6f0256 100644 --- a/test.php +++ b/test.php @@ -1,5 +1,4 @@