|
|
|
@@ -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}.
|
|
|
|
|