feat: feeedback 2

This commit is contained in:
Leon Etienne 2023-03-27 13:10:12 +02:00
parent 00f5f28ed6
commit e2db47a588
Signed by: leonetienne
SSH Key Fingerprint: SHA256:hs2AZKjRTbd2kYg44u89rM19UT2LyBOpSbIShsdkkfg
5 changed files with 62 additions and 53 deletions

View File

@ -22,15 +22,15 @@ Wie oben erwähnt, sind bereits die Constraints und einige funktionale und nicht
\hdashline \hdashline
Constraint & Nutzer-UI im Frontend\\ Constraint & Nutzer-UI im Frontend\\
\hdashline \hdashline
\ac{NFA} & \makecell[l]{Aus dem Papierformular soll ein\\Webformular werden}\\ \ac{NFA} & \makecell[l]{Aus dem Papierformular soll ein\\Webformular werden.}\\
\hdashline \hdashline
\ac{NFA} & \makecell[l]{Angaben zum Weingut des Weines\\sollen aus dem Accountdatensatz anstatt\\aus dem Webform kommen}\\ \ac{NFA} & \makecell[l]{Angaben zum Weingut des Weines\\sollen aus dem Accountdatensatz anstatt\\aus dem Webform kommen.}\\
\hdashline \hdashline
\ac{NFA} & \makecell[l]{Registrierte Weinteilnahmen\\bestehen aus einem Wein und einem Zustand\\(Ausstehend,Eingegangen,Abgelehnt).}\\ \ac{NFA} & \makecell[l]{Registrierte Weinteilnahmen\\bestehen aus einem Wein und einem Zustand\\(ausstehend,eingegangen,abgelehnt).}\\
\hdashline \hdashline
\ac{FA} & \makecell[l]{Beim Erstellen einer Weinteilnahme\\soll ein QR-Code als PDF generiert werden,\\der den Wein identifiziert}\\ \ac{FA} & \makecell[l]{Beim Erstellen einer Weinteilnahme\\soll ein QR-Code als PDF generiert werden,\\der den Wein identifiziert.}\\
\hdashline \hdashline
\ac{FA} & \makecell[l]{Durch scannen des QR-Codes auf dem\\mit einer Weinteilnahme erstellten PDFs soll\\dem Wein der Status \enquote{Eingegangen}\\ zugewiesen werden}\\ \ac{FA} & \makecell[l]{Durch scannen des QR-Codes auf dem\\mit einer Weinteilnahme erstellten PDFs soll\\dem Wein der Status \enquote{Eingegangen}\\ zugewiesen werden.}\\
\hline \hline
\end{tabular} \end{tabular}
\caption{Initial bekannte Anforderungen} \caption{Initial bekannte Anforderungen}
@ -42,7 +42,7 @@ Um nähere Anforderungen zu ermitteln, werden die Befragungstechniken \enquote{I
\section{Interview mit Product Owner} \section{Interview mit Product Owner}
Zunächst wird ein Interview mit dem \ac{PO} geführt. Ziel dieses Interviews ist Zunächst wird ein Interview mit dem \ac{PO} geführt. Ziel dieses Interviews ist
es, konkrete Fragen zu Anforderungen zu beantworten und somit konkrete Anforderungen zu formulieren. es, konkrete Fragen zu Anforderungen zu klären und somit konkrete Anforderungen zu formulieren.
Aufgrund der individuellen Gesprächsführung wurde sich für ein \enquote{Teil-standardisiertes Interview} Aufgrund der individuellen Gesprächsführung wurde sich für ein \enquote{Teil-standardisiertes Interview}
entschieden. Bei einem Teil-standardisiertem Interview gibt es vordefinierte Fragen, entschieden. Bei einem Teil-standardisiertem Interview gibt es vordefinierte Fragen,
aber auch Freiraum für Improvisation und Persönlichkeit. aber auch Freiraum für Improvisation und Persönlichkeit.
@ -83,7 +83,7 @@ Aus dem Interview mit dem \ac{PO} ergibt sich ein Pflichtenheft.
Das Pflichtenheft und das Protokoll zum Interview sind im Anhang unter je Das Pflichtenheft und das Protokoll zum Interview sind im Anhang unter je
\fullref{chap:anhang-pflichtenheft} und \fullref{chap:anhang-interview-protokoll} zu finden. \fullref{chap:anhang-pflichtenheft} und \fullref{chap:anhang-interview-protokoll} zu finden.
Ergebnis dieses Interviews sind zahlreiche Anforderungen und Ideen. Eine der wichtigsten Ideen stellt das Ergebnisse dieses Interviews sind zahlreiche Anforderungen und Ideen. Eine der wichtigsten Ideen stellt das
projektbezogene, wöchentliche Statusmeeting dar: Jeden Donnerstag soll um 9:30 Uhr der aktuelle Stand projektbezogene, wöchentliche Statusmeeting dar: Jeden Donnerstag soll um 9:30 Uhr der aktuelle Stand
des Projektes vorgestellt, diskutiert und Rücksprache gehalten werden. des Projektes vorgestellt, diskutiert und Rücksprache gehalten werden.
@ -97,7 +97,7 @@ Die wichtigsten Erkenntnisse des Interviews sind:
\item[Trennung von Weinen nach Jahresauswahlproben im Frontend]\hfill\\ \item[Trennung von Weinen nach Jahresauswahlproben im Frontend]\hfill\\
Da es $n$ Jahresauswahlproben gibt und Weine immer genau einer Jahresauswahlprobe zugeordnet sein müssen, macht es wenig Da es $n$ Jahresauswahlproben gibt und Weine immer genau einer Jahresauswahlprobe zugeordnet sein müssen, macht es wenig
Sinn alle Weine eines Nutzers auf einmal anzuzeigen. So ist es eine Anforderung, dass die Sinn alle Weine eines Nutzers auf einmal anzuzeigen. So ist es eine Anforderung, dass die
Weinansicht in zwei Ebenen unterteilt ist: Die erste Ebene soll eine Auflistung aller Jahresauswahlprobe sein Weinansicht in zwei Ebenen unterteilt ist: Die erste Ebene soll eine Auflistung aller Jahresauswahlproben sein
und in der Einzelansicht der Jahresauswahlproben sollen alle Weine aufgelistet sein, die dieser Jahresauswahlprobe angehören. und in der Einzelansicht der Jahresauswahlproben sollen alle Weine aufgelistet sein, die dieser Jahresauswahlprobe angehören.
Diese Weine sind ebenso anklickbar und führen zu einer Einzelansicht der Weine. Diese Weine sind ebenso anklickbar und führen zu einer Einzelansicht der Weine.
\item[Genaue Nutzerführung für Teilnehmer]\hfill\\ \item[Genaue Nutzerführung für Teilnehmer]\hfill\\
@ -111,8 +111,8 @@ Die wichtigsten Erkenntnisse des Interviews sind:
Sonstige Aktionen sind im TYPO3-Backend mit nativen Werkzeugen erreichbar. Sonstige Aktionen sind im TYPO3-Backend mit nativen Werkzeugen erreichbar.
\item[Verschiedene Web-Ansichten]\hfill \item[Verschiedene Web-Ansichten]\hfill
\begin{itemize} \begin{itemize}
\item Jahreauswahlproben-ListView \item Jahreauswahlproben-Listenansicht
\item Jahreauswahlproben-SingleView \item Jahreauswahlproben-Detailansicht
\item Wein-Registrierungsformular \item Wein-Registrierungsformular
\item PDF-Url für Versandbriefe \item PDF-Url für Versandbriefe
\item Registrierungsseite mit mehreren Schritten \item Registrierungsseite mit mehreren Schritten

View File

@ -102,4 +102,8 @@ Hierbei muss jedoch berücksichtigt werden, dass es sich hierbei um nur ein konk
verallgemeinerbare Schlüsse gezogen werden können. Eine Forschungsempfehlung ist es daher, weitere Möglichkeiten verallgemeinerbare Schlüsse gezogen werden können. Eine Forschungsempfehlung ist es daher, weitere Möglichkeiten
zur Integration verschiedener Teilprozesse zu recherchieren. zur Integration verschiedener Teilprozesse zu recherchieren.
%\paragraph*{Welche Endgeräte verwenden Weingüter und sind ihre Bedürfnisse bezüglich der Jahresauswahlproben?}
%Um zu beleuchten, welche Endgeräte Weingüter im Kontext der Weinanmeldung verwenden und was ihre individuellen Bedürfnisse
%im Kontext der Jahresauswahlproben sind, wurde versucht eine quantitative Studie in Form eines Online-Formulares abzuhalten.
%\paragraph*{Wie können unangemessen hohe Entwicklungskosten vermieden werden?} %\paragraph*{Wie können unangemessen hohe Entwicklungskosten vermieden werden?}

View File

@ -14,7 +14,7 @@ TYPO3-Extension darstellt, lokal in den versionierten Ordner \enquote{packages}
Dieses Verzeichnis wird als Quelle für Composer-Pakete in der Dieses Verzeichnis wird als Quelle für Composer-Pakete in der
Haupt-composer.json-Datei hinterlegt. Haupt-composer.json-Datei hinterlegt.
Somit wird ein Composer-Paket nur für dieses Projekt bereitgestellt, Somit wird ein Composer-Paket nur für dieses Projekt bereitgestellt,
ohne den Aufwand zu haben, der üblicherweise mit dem Bereitstellen eines Paketes einhergeht. ohne den Aufwand zu betreiben, der üblicherweise mit dem Bereitstellen eines Paketes einhergeht.
\\ \\
\\ \\
Um das grundlegende Setup einer Extension effizient durchzuführen, wurde eine Um das grundlegende Setup einer Extension effizient durchzuführen, wurde eine
@ -31,15 +31,15 @@ Das bedeutet, dass in dieser Phase Datenobjekte definiert und implementiert werd
Ein Datenobjekt besteht nach firmeninternen Konventionen aus zumindest Ein Datenobjekt besteht nach firmeninternen Konventionen aus zumindest
vier Komponenten: vier Komponenten:
\begin{description} \begin{description}
\item{Datenbanktabelle} \\ \item{\textbf{Datenbanktabelle}} \\
Die Datenbanktabelle persistiert Informationen. Die Datenbanktabelle persistiert Informationen.
\item{Domain Model} \\ \item{\textbf{Domain Model}} \\
Das Domain Model (auch Model genannt) ist eine PHP-Klasse, Das Domain Model (auch Model genannt) ist eine PHP-Klasse,
die jeweils die Daten einer Zeile der Datenbanktabelle abbildet. die jeweils die Daten einer Zeile der Datenbanktabelle abbildet.
\item{Repository} \\ \item\textbf{{Repository}} \\
Ein Repository ist eine PHP-Klasse, die die Schnittstelle Ein Repository ist eine PHP-Klasse, die die Schnittstelle
zwischen der Datenbank und der Model-Klasse darstellt. zwischen der Datenbank und der Model-Klasse darstellt.
\item{\ac{TCA}} \\ \item{\textbf{\ac{TCA}}} \\
Der \ac{TCA} des Modells definiert, wie diese Objekte im TYPO3-Backend dargestellt werden Der \ac{TCA} des Modells definiert, wie diese Objekte im TYPO3-Backend dargestellt werden
und bearbeitbar sind. und bearbeitbar sind.
\end{description} \end{description}
@ -72,10 +72,10 @@ Rebsorten, Geschmack, Weineigenschaften und Qualität sollen eigene Datentypen
anstatt einfacher Zeichenfolgen sein. anstatt einfacher Zeichenfolgen sein.
Ziel dessen ist, dass sich Nutzer für einen vorgefertigten, nominalen Eintrag in einem Dropdown-Menü Ziel dessen ist, dass sich Nutzer für einen vorgefertigten, nominalen Eintrag in einem Dropdown-Menü
entscheiden müssen und diese Auswahlmöglichkeiten immer noch im TYPO3-Backend pflegbar sind. entscheiden müssen und diese Auswahlmöglichkeiten immer noch im TYPO3-Backend pflegbar sind.
Weinlagen sind im Brown-Field-Projekt bereits vorhanden, also sollen hierfür existierenden Daten Weinlagen sind im Brown-Field-Projekt bereits vorhanden, also sollen hierfür existierende Daten
eingebunden werden. eingebunden werden.
Je Wein sollen beliebig viele Weineigenschaften auswählbar sein, Wettbewerbskategorien, Je Wein sollen beliebig viele Weineigenschaften auswählbar sein. Wettbewerbskategorien,
Geschmacksrichtung, etc, jeweils nur ein Element. Geschmacksrichtung, etc, sind jeweils nur ein Element.
Weitere Notizen zu diesem Gespräch sind im Anhang unter \fullref{chap:anhang-notizen-digitization} Weitere Notizen zu diesem Gespräch sind im Anhang unter \fullref{chap:anhang-notizen-digitization}
zu finden. zu finden.
\\ \\
@ -130,7 +130,7 @@ anbei in \fullref{chap:anhang-anmeldeformular}.
\label{fig:uxflow-registrierung} \label{fig:uxflow-registrierung}
\end{nicepic} \end{nicepic}
Da das Brown-Field-Projekt bereits Accountlogins und -Registrierungen implementiert und nutzt, Da das Brown-Field-Projekt bereits Accountlogins und -registrierungen implementiert und nutzt,
werden auf diese Lösungen zurückgegriffen, um einen einheitlichen Workflow beizubehalten. werden auf diese Lösungen zurückgegriffen, um einen einheitlichen Workflow beizubehalten.
Accountregistrierungen werden über den Accountregistrierungen werden über den
\enquote{femanager} \cite{bib:typo3-docs-femanager} realisiert, während Logins via TYPO3s nativem \enquote{femanager} \cite{bib:typo3-docs-femanager} realisiert, während Logins via TYPO3s nativem
@ -205,8 +205,8 @@ Es gilt also, dass ein MasterRecord $a$ die Teilnehmer\ac{UID} von einem Teilneh
$b$ die MasterRecord\ac{UID} von $a$ hält. $b$ die MasterRecord\ac{UID} von $a$ hält.
Die Problematik hierbei ist, dass diese \acp{UID} erst nach dem Persistieren in der Datenbank bekannt sind, Die Problematik hierbei ist, dass diese \acp{UID} erst nach dem Persistieren in der Datenbank bekannt sind,
da diese Werte erst im Zuge der Persistierung erstellt werden \cite{bib:w3schools-auto-increment}. da diese Werte erst im Zuge der Persistierung erstellt werden \cite{bib:w3schools-auto-increment}.
Die Lösung hierfür ist, beide Elemente zu erstellen und zu persistieren, erst danach ihre \acp{UID} gegenseitig Die Lösung hierfür ist, beide Elemente zu erstellen und zu persistieren und erst danach ihre \acp{UID} gegenseitig
bekannt machen um sie danach erneut zu persistieren. bekannt zu machen um sie anschließend erneut zu persistieren.
\subsection{Weinregistrierung} \subsection{Weinregistrierung}
Ein Basismerkmal des Jahresauswahlprobenwerkzeuges ist die Möglichkeit, Weine zu Jahresauswahlproben Ein Basismerkmal des Jahresauswahlprobenwerkzeuges ist die Möglichkeit, Weine zu Jahresauswahlproben
@ -218,8 +218,8 @@ Zugriff auf eine Auflistung aller zeitlich freigegebenen Jahresauswahlproben.
Soweit der Registrierungszeitraum dieser Jahresauswahlprobe den aktuellen Zeitpunkt miteinschließt, Soweit der Registrierungszeitraum dieser Jahresauswahlprobe den aktuellen Zeitpunkt miteinschließt,
wird eine \enquote{Jetzt Wein anmelden}-Schaltfläche angeboten. wird eine \enquote{Jetzt Wein anmelden}-Schaltfläche angeboten.
Dadurch, dass Anmeldeformulare elektronisch und automatisiert verarbeitet werden, sinkt der Aufwand, Dadurch, dass Anmeldeformulare elektronisch und automatisiert verarbeitet werden, sinkt der Aufwand,
der seitens \ac{WM} für Anmeldungen gestemmt werden muss. Das ist so, da diese Formular nun nicht mehr von der seitens \ac{WM} für Anmeldungen geleistet werden muss. Das ist so, da diese Formular nun nicht mehr von
Mitarbeitern bearbeitet werden müssen. Davon profitiert \ac{WM}, da diese Zeit nun anderweitig genutzt werden kann. Mitarbeitern bearbeitet werden müssen. Davon profitiert \ac{WM}, da diese Zeit nun für andere Aufgaben genutzt werden kann.
\begin{nicepic} \begin{nicepic}
\includegraphics[width=0.9\textwidth]{images/ux-flow-teilnahme.png} \includegraphics[width=0.9\textwidth]{images/ux-flow-teilnahme.png}
@ -292,7 +292,7 @@ Das ist so, da das in der Rekursion weitergereichte Problem nicht kleiner wird,
sondern gleich groß bleibt. sondern gleich groß bleibt.
Das verletzt die Bedingung $b>1$ des Master-Theorems, definiert als $T(n) = a*T(\frac{n}{b})+f(n)$ Das verletzt die Bedingung $b>1$ des Master-Theorems, definiert als $T(n) = a*T(\frac{n}{b})+f(n)$
\cite{bib:schwarzer-vorlesung-alg}. \cite{bib:schwarzer-vorlesung-alg}.
Der Algortihmus besteht aus $m, m \in \mathbb{N}$ verschachtelten For-Schleifen Der Algorithmus besteht aus $m, m \in \mathbb{N}$ verschachtelten For-Schleifen
gleicher Länge. gleicher Länge.
Somit ist die Zeitkomplexität $O(n^m)$. Normiert dargestellt beträgt die Zeitkomplexität $O(n^2)$. Das lässt sich experimentell bestätigen. Somit ist die Zeitkomplexität $O(n^m)$. Normiert dargestellt beträgt die Zeitkomplexität $O(n^2)$. Das lässt sich experimentell bestätigen.
@ -333,14 +333,14 @@ Formfeld-IDs des Formfeldparameter-Arrays heraus, die den Wert \enquote{<formfel
aller Formfeld-IDs der Checkboxen des SelectMultiples, die angehakt wurden. aller Formfeld-IDs der Checkboxen des SelectMultiples, die angehakt wurden.
Mit der eingebauten PHP-Funktion \enquote{array\_map} wird nun eine Operation auf alle Schlüssel Mit der eingebauten PHP-Funktion \enquote{array\_map} wird nun eine Operation auf alle Schlüssel
der Liste angewandt, die \enquote{strlen('formfeldname-')} Zeichen, von links ausgehend, von der Formfeld-ID der Liste angewandt, die \enquote{strlen('formfeldname-')} Zeichen, von links ausgehend, von der Formfeld-ID
entfernt. Somit wird beispielsweise die Formfeld-ID \enquote{winekind-18} zu \enquote{18} transformiert. Übrig bleiben die \acp{UID} aller angehakten Elemente $a$, in Form einer Zeichenkente. entfernt. Somit wird beispielsweise die Formfeld-ID \enquote{winekind-18} zu \enquote{18} transformiert. Übrig bleiben die \acp{UID} aller angehakten Elemente $a$, in Form einer Zeichenkette.
Über die eingebaute PHP-Funktion \enquote{intval} ist es trivial diese zu Zahlen zu übersetzen, Über die eingebaute PHP-Funktion \enquote{intval} ist es trivial diese zu Zahlen zu übersetzen,
wodurch die tatsächlichen Objekte aus der Datenbank angefragt werden können. wodurch die tatsächlichen Objekte aus der Datenbank angefragt werden können.
\subsection{PDF- und QR-Code-Generierung} \subsection{PDF- und QR-Code-Generierung}
Das dynamische Erstellen und Ausgeben des Versandbeilageblattes als PDF ist ein essenzieller Bestandteil des Das dynamische Erstellen und Ausgeben des Versandbeilageblattes als PDF ist ein essenzieller Bestandteil des
Jahresauswahlprobenwerkzeuges, da dieses PDF die Schnittstelle zwischen ankommenden Weinen und dem System darstellt. Jahresauswahlprobenwerkzeuges, da dieses PDF die Schnittstelle zwischen ankommenden Weinen und dem System darstellt.
Daher ist der Profit, der durch dieses Werkzeug generiert wird, ohne dieses PDF stark eingeschränkt, da Daher ist der Gewinn, der durch dieses Werkzeug generiert wird, ohne dieses PDF stark eingeschränkt, da
einkommende Weine händisch, von Mitarbeitern, zugeordnet werden müssten. einkommende Weine händisch, von Mitarbeitern, zugeordnet werden müssten.
Wie im \fullref{chap:stand-der-forschung} erläutert, werden für die dynamische Wie im \fullref{chap:stand-der-forschung} erläutert, werden für die dynamische
Generierung dieses PDFs die Bibliotheken \enquote{chillerlan/php-qrcode} und Generierung dieses PDFs die Bibliotheken \enquote{chillerlan/php-qrcode} und
@ -348,43 +348,44 @@ Generierung dieses PDFs die Bibliotheken \enquote{chillerlan/php-qrcode} und
\subsubsection{QR-Code-Generierung} \subsubsection{QR-Code-Generierung}
Der QR-Code beinhaltet lediglich die Wein-\ac{UID} anstatt einer vollständigen URL. Hintergrund dessen ist, dass Der QR-Code beinhaltet lediglich die Wein-\ac{UID} anstatt einer vollständigen URL. Hintergrund dessen ist, dass
die URL, die benötigt ist, um einen Wein einzuscannen, bis auf die Wein-\ac{UID} immer identisch ist. die benötigte URL, um einen Wein einzuscannen, bis auf die Wein-\ac{UID} immer identisch ist.
Somit wird redundanz vermieden. Somit wird redundanz vermieden.
Es ist Aufgabe der QR-Code-App, die den Code einscannt, aus der Wein-\ac{UID} eine vollständige URL herzuleiten. Es ist Aufgabe der QR-Code-App, die den Code einscannt, aus der Wein-\ac{UID} eine vollständige URL herzuleiten.
Um Resourcen zu sparen und somit den Profit zu erhöhen, wird der QR-Code zu einem Base64-kodiertem Bild gerendert. Um Resourcen zu sparen und somit den Gewinn zu erhöhen, wird der QR-Code zu einem Base64-kodiertem Bild gerendert.
Das ist der Standardrückgabewert des QR-Code-Generators Das ist der Standardrückgabewert des QR-Code-Generators
und erfordert somit keine nähere Konfiguration. Ebenfalls lässt sich ein Base64-kodiertes Bild als Quellurl eines und erfordert somit keine nähere Konfiguration. Ebenfalls lässt sich ein Base64-kodiertes Bild als Quell-URL eines
IMG-HTML-Tags angeben, womit das Bild eingebettet ist. Hier wird der Profit erhöht, indem Arbeitszeit gespart wird, IMG-HTML-Tags angeben, womit das Bild eingebettet ist. Hier wird der Gewinn erhöht, indem Arbeitszeit gespart wird,
die sonst in das anderweitige Einbetten eines Bildes in einem PDF mit \enquote{mpdf} fließen müsste. die sonst in das anderweitige Einbetten eines Bildes in einem PDF mit \enquote{mpdf} fließen müsste.
Die QR-Codegenerierung funktioniert konkret, indem ein neues QRCode-Objekt der QRCode-Klasse erstellt wird. Die QR-Codegenerierung funktioniert konkret, indem ein neues QRCode-Objekt der QRCode-Klasse erstellt wird.
Diese Klasse nimmt ein QROptions-Objekt im Konstruktor, das in diesem Falle einige Stilattribute mit sich trägt. Diese Klasse nimmt ein QROptions-Objekt im Konstruktor, das in diesem Falle einige Stilattribute mit sich trägt.
Das QRCode-Objekt bietet nun eine Methode \enquote{render} an, die, sofern nicht anders konfiguriert, den QR-Code als Das QRCode-Objekt bietet nun eine Methode \enquote{render} an, die sofern nicht anders konfiguriert, den QR-Code als
Base64-kodiertes Bild zurückgibt \cite{bib:chillerlan-php-qrcode}. Base64-kodiertes Bild zurückgibt \cite{bib:chillerlan-php-qrcode}.
\subsubsection{PDF-Generierung} \subsubsection{PDF-Generierung}
Firmenintern ist es Standard das Aussehen sowie die Inhalte der PDF-Dokumente, die \enquote{mpdf} erzeugt, mit HTML zu definieren, Firmenintern ist es Standard, das Aussehen sowie die Inhalte der PDF-Dokumente, die mit \enquote{mpdf} erzeugt werden,
mit HTML zu definieren,
das an \enquote{mpdf} gereicht wird. Um die Gestaltung und die Präsentation von Variablen in der HTML-Zeichenfolge technisch das an \enquote{mpdf} gereicht wird. Um die Gestaltung und die Präsentation von Variablen in der HTML-Zeichenfolge technisch
kontinuierlich mit dem restlichen Projekt zu halten und um eine gute Wartbarkeit zu gewährleisten, kontinuierlich mit dem restlichen Projekt zu halten und um eine gute Wartbarkeit zu gewährleisten,
wird diese HTML-Zeichenfolge mit TYPO3-Fluid getemplated. Das heißt, dass eine HTML-Templatedatei bereitgestellt wird, wird diese HTML-Zeichenfolge mit TYPO3-Fluid getemplated. Das heißt, dass eine HTML-Templatedatei bereitgestellt wird,
diese mit TYPO3-Fluid befüllt wird und in PHP gerendert wird, um eine HTML-Zeichenkette als Ergebnis zu erhalten. diese mit TYPO3-Fluid befüllt wird und in PHP gerendert wird, um eine HTML-Zeichenkette als Ergebnis zu erhalten.
Hierfür wird ein TYPO3-StandaloneView des instanziiert, mit einem Pfad zur Template-Datei ausgestattet, Variablen angegeben, Hierfür wird ein TYPO3-StandaloneView instanziiert, mit einem Pfad zur Template-Datei konfiguriert, Variablen angegeben,
die in Fluid verfügbar sein sollen und anschließend über die \enquote{render}-Methode zu einem String gerendert die in Fluid verfügbar sein sollen und anschließend über die \enquote{render}-Methode zu einer Zeichenkette gerendert
\cite{bib:typo3-ref-standalone-view}. \cite{bib:typo3-ref-standalone-view}.
Anschließend wird ein \enquote{mpdf}-Objekt erstellt und mit einer rudimentären Konfiguration in Form eines Arrays im Konstruktor Anschließend wird ein \enquote{mpdf}-Objekt erstellt und mit einer rudimentären Konfiguration in Form eines Arrays im Konstruktor
konfiguriert. Diese Konfiguration definiert in diesem Falle Seitenabstände, Papierformat, Zeichenkodierung und Schriftarten. konfiguriert. Diese Konfiguration definiert in diesem Falle Seitenabstände, Papierformat, Zeichenkodierung und Schriftarten.
Abschließend wird dem \enquote{mpdf}-Objekt das zuvor generierte HTML übergeben und über die Methode \enquote{OutputBinaryData} Abschließend wird dem \enquote{mpdf}-Objekt das zuvor generierte HTML übergeben und über die Methode \enquote{OutputBinaryData}
als Bytes zurückgegeben und in einer Variable gespeichert \cite{bib:mpdf-ref}. als Bytes zurückgegeben und in einer Variable gespeichert \cite{bib:mpdf-ref}.
Um dieses PDF-Dokument über die Verbindung an den Nutzer zu übertragen, wird ein TYPO3-Response-Objekt erstellt. Um dieses PDF-Dokument über die Verbindung an den Nutzer zu übertragen, wird ein TYPO3-Response-Objekt erstellt.
Über dieses Response-Objekt werden einige Header gesetzt und direkt übertragen. Dieser Header sind Content-Type und Content-Length. Über dieses Response-Objekt werden einige Header gesetzt und direkt übertragen. Diese Header sind Content-Type und Content-Length.
Abschließend werden als Response-Body die Bytes des generierten PDFs abgeschickt. Damit ist die Verbindung beendet und das Abschließend werden als Response-Body die Bytes des generierten PDFs übertragen. Damit ist die Verbindung beendet und das
PDF zum Nutzer übertragen. PDF zum Nutzer übertragen.
\subsection{Jahresauswahlproben- und Wein-Detailansichten} \subsection{Jahresauswahlproben- und Wein-Detailansichten}
Weine und Jahresauswahlproben sollen unter bestimmten Gegebenheiten einsichtig sein. Weine und Jahresauswahlproben sollen unter bestimmten Gegebenheiten einsehbar sein.
Hierzu gibt es eine Auflistung aller Jahresauswahlproben. Diese sind anklickbar, um eine Detailansicht der ausgewählten Hierzu gibt es eine Auflistung aller Jahresauswahlproben. Diese sind anklickbar, um eine Detailansicht der ausgewählten
Jahresauswahlprobe zu öffnen. Hier wird neben Metadaten der Jahresauswahlprobe eine Liste aller zur Einsicht berechtiger Weine Jahresauswahlprobe zu öffnen. Hier wird neben Metadaten der Jahresauswahlprobe auch eine Liste aller zur Einsicht berechtiger Weine
angezeigt. Diese Weine sind anklickbar, um auf eine Detailansicht der Weine zu gelangen. angezeigt. Diese Weine sind anklickbar, um auf eine Detailansicht der Weine zu gelangen.
Die Detailansichten für Jahresauswahlproben und Weine benötigen spezieller Autorisierung. Die Detailansichten für Jahresauswahlproben und Weine benötigen spezielle Autorisierung.
Diese sind: Jahresauswahlproben sind nur einsichtig, wenn sich das aktuelle Datum innerhalb des Diese sind: Jahresauswahlproben sind nur einsichtig, wenn sich das aktuelle Datum innerhalb des
Sichtbarkeitszeitraumes der Jahresauswahlprobe befindet. Sichtbarkeitszeitraumes der Jahresauswahlprobe befindet.
Detailansichten für Weine sind immer für den zugehörigen Teilnehmer einsichtig. Detailansichten für Weine sind immer für den zugehörigen Teilnehmer einsichtig.
@ -392,15 +393,15 @@ Nach Abschluss einer Jahresauswahlprobe sind alle ihr angehörigen Weine öffent
Das hat den Hintergrund, dass Jahresauswahlproben Blindverkostungen sind Das hat den Hintergrund, dass Jahresauswahlproben Blindverkostungen sind
und niemand die Möglichkeit haben sollte, im Voraus Informationen über die teilnehmenden Weine in Erfahrung zu bringen. und niemand die Möglichkeit haben sollte, im Voraus Informationen über die teilnehmenden Weine in Erfahrung zu bringen.
Die Ergebnisse der Jahresauswahlproben sind öffentlich, also sind es die Weine nach Abschluss einer Jahresauswahlprobe auch. Die Ergebnisse der Jahresauswahlproben sind öffentlich, also sind es die Weine nach Abschluss einer Jahresauswahlprobe auch.
Mitarbeiter von Weinland Mosel, wenn mit einem solchen Account angemeldet, haben immer Einsicht in Wein-Detailansichten. Mitarbeiter von Weinland Mosel, wenn sie mit einem solchen Account angemeldet sind, haben immer Einsicht in Wein-Detailansichten.
Die Wein-Detailseite verfügt außerdem über einen \enquote{Versandetikett drucken}-Button, der auf das Versand-PDF verlinkt. Die Wein-Detailseite verfügt außerdem über einen \enquote{Datenblatt drucken}-Button, der auf das Datenblatt-PDF verlinkt.
Dieser Button ist nur für den zugehörigen Teilnehmer und Mitarbeiter verfügbar. Dieser Button ist nur für den zugehörigen Teilnehmer und Mitarbeiter verfügbar.
Diese Daten, Fakten und Restriktionen werden serverseitig kontrolliert, um Manipulationen des Nutzers auszuschließen. Diese Daten, Fakten und Restriktionen werden serverseitig kontrolliert, um Manipulationen des Nutzers auszuschließen.
Um das zu realisieren werden Daten mit Fluid-Templates konditionell dargestellt und über Fluid-ViewHelper Links Um das zu realisieren werden Daten mit Fluid-Templates konditionell dargestellt und über Fluid-ViewHelper Links
zu anderen Ansichten generiert. Diese ViewHelper übergeben Parameter. Die hierfür relevanten Parameter der verschiedenen zu anderen Ansichten generiert. Diese ViewHelper übergeben Parameter. Die hierfür relevanten Parameter der verschiedenen
Ansichten sind beispielsweise Wein-\acp{UID} und Jahresauswahlprobe-\acp{UID}. Um Informationen über den angemeldeten Nutzer, Ansichten sind beispielsweise Wein-\acp{UID} und Jahresauswahlproben-\acp{UID}. Um Informationen über den angemeldeten Nutzer,
wie beispielsweise seiner Teilnehmernummer oder seiner Nutzergruppenzugehörigkeit, zu erlangen, wird sich wie beispielsweise seiner Teilnehmernummer oder seiner Nutzergruppenzugehörigkeit, zu erlangen, wird sich
der Extbase-nativej Domain-Model-FrontendUser-Klasse bedient \cite{bib:typo3-ref-extbase-model-feuser}. der Extbase-nativen Domain-Model-FrontendUser-Klasse bedient \cite{bib:typo3-ref-extbase-model-feuser}.
\section{Digitalization} \section{Digitalization}
@ -450,18 +451,22 @@ Um gut wartbaren PHP-Code zu erzeugen, werden alle CSV-Zeilen in einem zweidimen
der das gesamte CSV-Dokument darstellt, der das gesamte CSV-Dokument darstellt,
durch alphanumerisch indizierte, innere Arrays abgebildet. Somit ist bei jeder Wertzuweisung der zugehörige Spaltenname ersichtlich. 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, Über die nativen PHP-Funktionen \enquote{array\_keys} und \enquote{array\_values} wird dieser zwar gut lesbare,
aber mit \enquote{fputcsv} inkompatibler aber mit \enquote{fputcsv} inkompatible
Array zu einer Reihe kompatibler Array konvertiert. Hierbei werden durch \enquote{array\_values} die Kopfzeile und durch Array zu einer Reihe kompatibler Array konvertiert. Hierbei werden durch \enquote{array\_keys} die Kopfzeile und durch
\enquote{array\_values} die Datenzeilen extrahiert. Diese Zeilen werden anschließend mit \enquote{fputcsv} \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, 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. 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. 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 Um Weinland Mosel weitere Arbeitszeit zu ersparen 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 angeboten. Das erspart das manuelle Kopieren und Abspeichern von CSV-Zeichenketten durch IT-Fachfremde, reduziert damit die Anzahl
an benötigten Übergangsschritten in weitere Prozesse und reduziert somit die Komplexität der Umstellung. an benötigten Übergangsschritte in weitere Prozesse und reduziert somit die Komplexität der Umstellung.
Auch im Interesse, Arbeitszeit in der Umsetzung zu sparen, Auch im Interesse, Arbeitszeit in der Umsetzung zu sparen,
wurde diese Downloadfunktion JavaScript-seitig umgesetzt. Dadurch ist der Download in derselben Action implementiert. wurde diese Downloadfunktion JavaScript-seitig umgesetzt.
Somit muss weder abstrahiert werden, noch ein weiterer Exporter gebaut werden. Dadurch ist der Download in derselben Action, die CSV für das Textarea-Feld generiert, implementiert.
Somit muss weder abstrahiert werden, noch ein weiterer CSV-Exporter gebaut werden.
Hierfür wird ein EventHandler auf den Download-Button angewandt, der bei Betätigung ein vestecktes 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 \enquote{a}-Element erstellt, über das HTML-Attribut \enquote{download} des \enquote{a}-Elementes den Download-Dateinamen
eine Blob-Url zuweist. Diese Blob-Url wird über ein Blob-Objekt generiert \cite{bib:tutorialspoint-js-save-text}. festlegt und als \enquote{href}-HTML-Attribut
eine Blob-URL zuweist. Diese Blob-URL wird über ein Blob-Objekt generiert.
Wird nun der Download-Button gedrückt, wird JavaScript-seitig eine Datei erzeugt und gespeichert
\cite{bib:tutorialspoint-js-save-text}.

View File

@ -10,7 +10,7 @@
\newcommand{\cfgDocClassification}{Abschlussarbeit} \newcommand{\cfgDocClassification}{Abschlussarbeit}
% Document version % Document version
\newcommand{\cfgDocVersion}{1.5} \newcommand{\cfgDocVersion}{1.7}
% Last modification date % Last modification date
\newcommand{\cfgDateLastModification}{22. Dezember 2022} \newcommand{\cfgDateLastModification}{22. Dezember 2022}

BIN
main.pdf

Binary file not shown.