diff --git a/chapters/konzeption-entwicklung.tex b/chapters/konzeption-entwicklung.tex index fbcda84..8bd3546 100644 --- a/chapters/konzeption-entwicklung.tex +++ b/chapters/konzeption-entwicklung.tex @@ -292,7 +292,7 @@ Grundlegend, kann für diese Funktion kein Master-Theorem angewandt werden, da es sich hierbei nicht um einen Divide-and-Conquer-Algorithmus handelt \cite{bib:schwarzer-vorlesung-alg}. Das ist so, da das in der Rekursion weitergereichte Problem nicht kleiner wird, sondern gleich groß bleibt. -Das verletzt die Bedingung $b>1$ des Master-Theorem, dargestellt als\\$T(n) = a*T(\frac{n}{b})+f(n)$. +Das verletzt die Bedingung $b>1$ des Master-Theorem, dargestellt als $T(n) = a*T(\frac{n}{b})+f(n)$. Betrachten wir den Algortihmus, besteht er aus $m, m \in \mathbb{N}$ verschachtelten For-Schleifen 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. @@ -329,10 +329,53 @@ Hierfür wird die eingebaute PHP-Funktion \enquote{array\_keys} verwendet. Diese Keys eines Arrays in Form eines numerisch indizierten Arrays zurück. Der optionale Parameter \enquote{filter\_values} bestimmt, dass ausschließlich die Keys der Key-Value-Pairs, die einen bestimmten -Wert tragen, extrahiert werden. D.h., der Funktionsaufruf filtert alle Keys und somit alle Formfeld-IDs des Formfeldparameter-Arrays heraus, die den Wert \enquote{-true} haben. Das ist eine Liste +Wert tragen, extrahiert werden \cite{bib:php-array-keys}. D.h., der Funktionsaufruf filtert alle Keys und somit alle +Formfeld-IDs des Formfeldparameter-Arrays heraus, die den Wert \enquote{-true} haben. Das ist eine Liste aller Formfeld-IDs der Checkboxen des SelectMultiples, die angehakt wurden. Mit der eingebauten PHP-Funktion \enquote{array\_map} wenden wir nun eine Operation auf alle Schlüssel der Liste an, 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. Ü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. + +\subsection{PDF- und QR-Code-Generierung} +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. +Daher ist der Profit, der durch dieses Werkzeug generiert wird, ohne dieses PDF stark eingeschränkt, da +einkommende Weine händisch, von Mitarbeitern, zugeordnet werden müssten. +Wie im \fullref{chap:stand-der-forschung} erläutert, werden für die dynamische +Generierung dieses PDFs die Bibliotheken \enquote{chillerlan/php-qrcode} und +\enquote{mpdf/mpdf} herangezogen und über Composer installiert. + +\subsubsection{QR-Code-Generierung} +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. +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. +Um Resourcen zu sparen und somit den Profit zu erhöhen, wird der QR-Code zu einem Base64-kodiertem Bild gerendert. +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 +IMG-HTML-Tags angeben, womit das Bild eingebettet ist. Hier wird der Profit 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 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. +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}. + +\subsubsection{PDF-Generierung} +Firmenintern ist es Standard das Aussehen sowie die Inhalte der PDF-Dokumente, die \enquote{mpdf} erzeugt, mit HTML zu definieren, +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, +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. +Hierfür wird ein TYPO3-StandaloneView instanziiert, mit einem Pfad zur Template-Datei ausgestattet, Variablen angegeben, +die in Fluid verfügbar sein sollen und anschließend über die \enquote{render}-Methode zu einem String gerendert +\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 +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} +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. +Über dieses Response-Objekt werden einige Header gesetzt und direkt übertragen. Dieser 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 +PDF zum Nutzer übertragen. diff --git a/dexes/literature.bib b/dexes/literature.bib index 4a6efd2..f63c531 100644 --- a/dexes/literature.bib +++ b/dexes/literature.bib @@ -319,6 +319,14 @@ note = {Zugriff: März 2023} } +@misc{bib:mpdf-ref, + author = {{Mpdf Contributors}}, + howpublished = "\url{https://mpdf.github.io/reference/mpdf-functions/overview.html}", + title = {{Overview mPDF Functions by Category}}, + year = {2023}, + note = {Zugriff: März 2023} +} + @misc{bib:qrbot, author = {{TeaCapps}}, howpublished = "\url{https://qrbot.net}", @@ -335,6 +343,14 @@ note = {Zugriff: März 2023} } +@misc{bib:php-array-keys, + author = {{The PHP Group}}, + howpublished = "\url{https://www.php.net/manual/en/function.array-keys.php}", + title = {{PHP: array-keys - Manual}}, + year = {2023}, + note = {Zugriff: März 2023} +} + @misc{bib:typo3-fluid, author = {{TYPO3 Association}}, howpublished = "\url{https://typo3.org/fluid}", @@ -438,3 +454,11 @@ 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}", + title = {{TYPO3\\CMS\\Fluid\\View\\StandaloneView Class Reference}}, + year = {2023}, + note = {Zugriff: März 2023} +} diff --git a/main.pdf b/main.pdf index 79ad711..6d44c0d 100644 Binary files a/main.pdf and b/main.pdf differ