feat: wrote on registrierung

This commit is contained in:
Leon Etienne 2023-03-16 03:15:07 +01:00
parent 4e18b44d43
commit 9c190d1d99
Signed by: leonetienne
SSH Key Fingerprint: SHA256:hs2AZKjRTbd2kYg44u89rM19UT2LyBOpSbIShsdkkfg
5 changed files with 142 additions and 6 deletions

View File

@ -54,7 +54,6 @@ Nachdem in Erfahrung gebracht wurde, welche konkreten Datenobjekte benötigt wer
wurden Attribute dieser Objekte dem Pflichtenheft entnommen. Diese wurden in einem
formalen Klassendiagramm festgehalten und in Rücksprache mit dem \ac{PO}
weiter bis zu festen Datentypen und Auswahlmöglichkeiten konkretisiert.
Beispielsweise, dass Wettbewerbskategorien durch TYPO3-Categories repräsentiert werden sollen.
Das hat den Vorteil, dass TYPO3-Categories bereits native Bestandteile eines TYPO3-Redaktionssystemes sind
und bereits alle relevanten Attribute anbieten. Diese sind ein Titel,
@ -64,18 +63,14 @@ Das Parent-Attribut ist benötigt, da $n$ dieser Attribute einen Attributbaum bi
Somit ist es möglich Unterkategorien zu erstellen. Beispiele hierfür sind die
Unterkategorien \enquote{Trockener Riesling} und \enquote{Halbtrockener Riesling} für die Überkategorie
\enquote{Riesling}.
Rebsorten, Geschmack, Weineigenschaften und Qualität sollen eigene Datentypen
anstatt einfacher Zeichenfolgen sein.
Ziel davon 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.
Weinlagen sind im Brown-Field-Projekt bereits vorhanden, also sollen hierfür existierenden Daten
eingebunden werden.
Pro Wein sollen beliebig viele Weineigenschaften auswählbar sein, Wettbewerbskategorien,
Geschmacksrichtung, etc, jeweils nur ein Element.
Weitere Notizen zu diesem Gespräch sind im Anhang unter \fullref{chap:anhang-notizen-digitization}
zu finden.
\\
@ -95,3 +90,112 @@ Schnittstellen werden über die Basisklasse \enquote{Repository} geerbt
\cite{bib:typo3-docs-extdev-tut-tea-repositories}.
Mit Abschluss der Digitization können alle Datenstrukturen im TYPO3-Backend händisch angelegt,
eingesehen, gelöscht und bearbeitet werden.
\section{Teilnehmerregistrierung}
Ein essenzieller Teil des Jahresauswahlprobenwerkzeuges ist die Registrierung von Teilnehmern.
Dieses Modul repräsentiert den ersten Berührungspunkt der Winzer mit dem System.
Dem Pflichtenheft ist zu entnehmen, dass es zwei Kategorien von Teilnehmerregistrierungen gibt:
\begin{enumerate}
\item Nutzer ist \ac{WM}-Mitglied
\item Nutzer ist kein \ac{WM}-Mitglied
\end{enumerate}
Der primäre Unterschied zwischen Mitgliedern und Nicht-Mitgliedern ist, dass Mitglieder bereits einen
Stammdatensatz hinterlegt haben.
Dieser Stammdatensatz bildet die Angaben zum Weingut des zu digitalisierendem Anmeldeformulares ab.
Nicht-Mitglieder sind dem System noch gänzlich unbekannt und müssen im Zuge der Registrierung ihres Nutzers
ihre Stammdaten angeben, während sich Mitglieder lediglich einloggen müssen und eine Schaltfläche
\enquote{Teilnehmer werden} betätigen.
Der mit dem \ac{PO} ausgearbeitete UX-Flow der Registrierung sieht vor, dass der Nutzer zunächst gefragt wird,
ob er Mitglied sei oder nicht. Hierzu gibt es je einen Button. Ist der Nutzer ein Mitglied,
wird er auf ein Loginform, mit der Option zur Registrierung weitergeleitet.
Nach erfolgreichem Login, wird ein Teilnehmerobjekt erstellt.
Wählt der Nutzer \enquote{Nein, ich bin kein Mitglied} aus, würde er auf ein Registrierungsformular
weitergeleitet, auf um sich einen Nicht-Mitgliederaccount anzulegen. Im Zuge dieser Registrierung werden
Stammdaten zum Weingut angefragt.
\begin{nicepic}
\includegraphics[width=0.9\textwidth]{images/ux-flow-registrierung.png}
\captionof{figure}{UX-Flow: Registrierung}
\caption*{Quelle: Eigene Darstellung}
\label{fig:uxflow-registrierung}
\end{nicepic}
Da das Brown-Field-Projekt bereits Accountlogins und -Registrierungen implementiert und nutzt,
werden auf diese Lösungen zurückgegriffen, um einen einheitlichen Workflow beizubehalten. Accountregistrierungen werden über den
\enquote{femanager} \cite{bib:typo3-docs-femanager} realisiert, während Logins via TYPO3's nativem
Frontend-Nutzer-Login gelöst werden. Das ist explizit von femanager so angedacht:
\quotecite{Note: Login and a I forgot my password function is part of the core and not part of femanager.}
\cite{bib:typo3-docs-femanager}.
Im Folgenden wird der Registrierungsprozess im Detail beschrieben:\\
Grundlegend gibt es drei relevante Nutzerzustände vor der Registrierung:
\begin{enumerate}
\item Kein Mitglied
\item Mitglied, mit Konto
\item Mitglied, ohne Konto
\end{enumerate}
Diese Prozesse sehen wie folgt aus:
\subsection*{Kein Mitglied}
Ist ein Nutzer kein Mitglied, so muss er zunächst einen Account erstellen.
Anfangs wählt dieser Nutzer \enquote{Ich bin kein Mitglied} auf der Registrierungsseite aus.
Daraufhin navigiert der Browser zu einem Registrierungs-Formular.
Hierfür muss eine Email-Adresse und ein Passwort vergeben und den Nutzungsbestimmungen zugestimmt werden.
Im Anschluss erhält der Nutzer eine Bestätigungsemail mit einem Aktivierungslink.
Wird dieser Link geöffnet, wird der Account freigeschalten und ein Login-Feld erscheint.
Nach erfolgreichem Login wird der Nutzer mit einem
Stammdatenformular konfrontiert. Dabei handelt es sich um Angaben zum teilnehmenden Weingut.
Wird dieses Formular abgeschickt, ist die Teilnehmerregistrierung abgeschlossen.
\subsection*{Mitglied, mit Konto}
Ist ein Nutzer ein Mitglied und hat bereits ein Mitgliedskonto, muss dieser auf der Registrierungsseite
\enquote{Ich bin ein Mitglied} auswählen. An dieser Stelle navigiert der Browser zu einem Login-Formular.
Hier kann sich das Mitglied nun anmelden. Tut er dies erfolgreich, ist die Teilnehmerregistrierung
abgeschlossen.
\subsection*{Mitglied, ohne Konto}
Ist ein Nutzer ein Mitglied und hat noch kein Mitgliedskonto, muss dieser auf der Registrierungsseite
\enquote{Ich bin ein Mitglied} auswählen. An dieser Stelle navigiert der Browser zu einem Login-Formular.
Auf diesem Login-Formular existiert ein Button \enquote{Jetzt registrieren}, sowie ein Hinsweistext dazu.
Da der Nutzer noch keinen Account hat, muss dieser auf \enquote{Jetzt registrieren} klicken.
Daraufhin navigiert der Browser zu einem Registrierungsformular, das eine Email-Adresse, ein Passwort
und die Zustimmung zur Datenverarbeitung benötigt. Ist dieses Formular abgeschickt, erhält das Mitglied
eine Email mit einem Bestätigungslink. Wird dieser Bestätigungslink angeklickt, wird das Mitgliedskonto
freigegeben und es öffnet sich ein Login-Formular.
Nach erfolgreichem Login wird das Mitgliedskonto um die notwendingen Teilnehmereigenschaften erweitert
und ist somit erfolgreich als Teilnehmer registriert.
\subsection*{Umsetzung}
Um das umzusetzen wurde zunächst ein simples Weichen-Content-Element erstellt.
Dieses Content-Element hat die Parameter \enquote{question}, \enquote{answ-1-link}, \enquote{answ-1-text},
\enquote{answ-2-link} sowie \enquote{answ-2-text}.
Der Zweck dieses Content-Elementes ist es, Nutzer basierend auf einer ausformilierten Frage auf eine
von zwei Seiten weiterzuleiten. Anschließend wurden Registrierungen über Femanager-Plugin-Content-Elemente
realisiert.
Anpassungen der versendeten Emails erfolgen durch Überschreiben der Email-Templates von Femanager.
Weiterleitungen zu bestimmten Seiten nachdem ein Nutzer spezielle Events ausgelöst hat können über TypoScript
konfiguriert werden \cite{bib:typo3-docs-femanager}. Logins werden über das TYPO3-Native Loginformular
gelöst. Im TYPO3-Loginformular kann man Weiterleitungen zu spezialisierten Seiten im Backend-UI festlegen
\cite{bib:typo3-docs-felogin}.
Für alle funktionalen Belange wurde ein TYPO3-Plugin registriert. Dieses Plugin verfügt über einen
ActionController, der Nutzeranfragen an PHP-Funktionen (\enquote{Actions})
bindet.
In diesen Actions wird Fehlerbehandlung durchgeführt, Datenmodelle der Domäne erstellt und in der
Datenbank persistiert sowie Daten für die Anzeige im Frontend aufbereitet \cite{bib:typo3-docs-extbase}.
Neue Datenobjekte werden in Repositories registriert \cite{bib:typo3-docs-extdev-tut-tea-repositories}. Diese Repositories sind Aggregate des Controllers,
werden jedoch nach dem \enquote{Inversion of Control}-Prinzip via Dependency Injection instanziiert und
der ActionController-Klasse über Methode übergeben \cite{bib:typo3-docs-di}.
Als problematisch erweisen sich bidirektionale Verbindungen zwischen Datenmodellen, wenn die Foreign Keys
über das SQL-Schlüsselwort \enquote{AUTO\_INCREMENT} in der Datenbank definiert werden.
In diesem Fall wollen wir
einen MasterRecord, der Betriebsinformationen speichert, bidirektional an ein Teilnehmerobjekt linken.
Als ForeignKeys werden hierfür ihre jeweiligen Uids herangezogen, da diese Werte durch
\enquote{AUTO\_INCREMENT} auf der Datenbankebene gehandhabt werden.
Es gilt also, dass ein MasterRecord $a$ die TeilnehmerUid von einem Teilnehmer $b$ hält und dass
$b$ die MasterRecordUid von $a$ hält.
Die Problematik hierbei ist, dass diese Uids erst nach dem persistieren in der Datenbank bekannt sind,
da diese Werte erst im Zuge der Persistierung erstellt werden. Das ist so, da das
\enquote{AUTO\_INCREMENT}-Schlüsselwort lediglich zu SQL gehört und SQL nur von der Datenbank ausgeführt wird.
Die Lösung hierfür ist es, beide Elemente zu erstellen und zu persistieren, danach ihre Uids gegenseitig
bekannt machen um sie danach erneut zu persistieren.

View File

@ -359,3 +359,35 @@
year = {2023},
note = {Zugriff: März 2023}
}
@misc{bib:typo3-docs-femanager,
author = {{in2code}},
howpublished = "\url{https://docs.typo3.org/p/in2code/femanager/main/en-us/Introduction/Index.html}",
title = {{femanager}},
year = {2023},
note = {Zugriff: März 2023}
}
@misc{bib:typo3-docs-felogin,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://docs.typo3.org/c/typo3/cms-felogin/main/en-us/Configuration/Index.html}",
title = {{cms-felogin}},
year = {2023},
note = {Zugriff: März 2023}
}
@misc{bib:typo3-docs-extbase,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ExtensionArchitecture/Extbase/Index.html}",
title = {{Extension development / Extbase}},
year = {2023},
note = {Zugriff: März 2023}
}
@misc{bib:typo3-docs-di,
author = {{TYPO3 Contributors}},
howpublished = "\url{https://docs.typo3.org/m/typo3/reference-coreapi/11.5/en-us/ApiOverview/DependencyInjection/Index.html}",
title = {{Dependency Injection}},
year = {2023},
note = {Zugriff: März 2023}
}

View File

@ -1 +1 @@
<mxfile host="Electron" modified="2023-02-23T16:51:19.490Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="Vzgu0uUPVd5yI4iqsqog" version="20.8.16" type="device"><diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">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</diagram></mxfile>
<mxfile host="Electron" modified="2023-03-16T00:02:16.040Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="gIfJ7zOkVKn1Np3lvPmu" version="20.8.16" type="device"><diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">7VxZd5s4FP41fnQPIDY/xtnaLJ00S5PMmwwyaCyjFOQ49q8fyewgbzHYbmdyTlMkhLZ773c/Xd22A07HH5chfPNvqYtIR1Pcjw4462iaqgCb/yVqZnGNpVpxhRdiN2mUVzzgOUq/TGon2EVRqSGjlDD8Vq50aBAgh5XqYBjSabnZkJLyqG/QQ7WKBweSeu0zdpkf19qaldd/Rdjz05FVsxe/GcO0cbKSyIcunRaqwHkHnIaUsvhp/HGKiNi8dF+ev82eyc3IvLz6Ef2CT/3rx+8/u3FnF9t8ki0hRAFrtmst7vodkkmyX8la2SzdwJBOAheJTpQO6PtsTPijyh//QYzNEoHDCaO8iobMpx4NILmh9C1pN6QBS5qpoowC90QIlpcHhDqjuOoCE5KMwUtJe5uXIhbSUSY70UEmCNGYwAEifeiMvMVETymhIX8V0ACJrlyuDMla8smd57V8MBbOXkRnX4y0+JpNhBfOPkqlWVr6wOyl8Pyad8FL+UeikH6zoRwTeUd0EjpoRTuQmBMMPbSqPzNuJ/aiYBOJllwiOkZ8YbxBiAhk+L1sODCxPy9rl316RzFfh6akWGEmhpIghdpTyl3EE02+yjWVKwOcFZq9iQbR8nGsyjBmSe/5Q9xhWiosMa9a2MYWdgJqdvJ9wuYoFDjROQWdvun4DIlFBPzXFfRDFMFJNIU+eQvpQLxhCJMA+WMUrDAxod5THzP08AYXsp9yVC6bXdGc+Bb1PQKjKFGwNbYy5DaWGkhHA2jxk31WeANM0APu1hr7jkKGPlbqWPpWrwhRM+LyNMfoTH/8Aj5bynK1LKjA9hLWaxK+gv9dLCwhYQ6MS7CwYVwzN8Q1VdsQ2BKl6ypfbFOxyoqX6NNnsS9tQofDCJVgrYZbGZFIhgbKXvDRVo328dGo4yPCdaBbr4K/t4XtxX62UHfO3u2SMmj7U3fVqKh7CvFr1L3ekdr70gM6N1VDM4FqgMqSNP5at4Bpx00qo8Ros7NRqaC8Gg0oqycN5Ktv1QrNmhX2UYiwWJfymNIPrq8Xdcfm0/FgEq1nH2U+wW3tAo4xEYv8isg7YtiBEo4CCfYCXnC4gosJyMyMD4kDj5fMvPS4MGvum9tjItoS0lokIoqEiNhtEZHUqxWxFI/HLKGQ/5PHXB5pSMKWyMxqiTxOYDQYnUXOUP+hvM5Vxbn+MLtqS/5P6uEknrAg4bX+7vNkTb70rZ2Syn8OxcFAhRzpLXGw6jgV+N94Xk25i78fzn9e/bi9UeD9YOJcR2fDq6f0ULtv/dwx3pLFWF7THluIt6xS9eK5RLqvmx5Ldoy3aCnVSXWsxwlf4UfdUbNLiNiAum10whabdiNIdllragRCeAvONchJ8mKMXTdWUBThORws+hM6kKyHd270O8aZVCtWWUfNLWWh6mSQTjEavAzyLKPXFsZ9QjyrtLsUCjYJ36H+IORPnnj6Fom5PHPXRmDgdm9phEi33uwWM49ggRI7MM3W2EPlXKLJ2IMhYQ/VcGZj7CE9KvzZRKG3J1RcRg4b9vDLxmnKY6/aw4KN5se6EHmYc3GMwgk/RvGNDoeUeGLG1A9EAHrKT4L8OMifziBDATdiD4rI9C7nidaMtBIfNjWJkeoSIzUbMNLbSPuFLu3Xx/nsia9Enb/e290D2WhGlrQeKNIlEdzRsibLOJMo3aEQ8y0QXjONd21i9xU7bZJG6XUeJcdFfUeE2O1MV+crubFBx+GyFcY1xuL3+RiKo7nC5c1/3/FD9ZSLW0wrIMjb9cqnLSsDypLT0D6sTEq61IObmWpXzUzRWjSzxqxKk9yaHNIPq5UTrdnSSVu1ysEEo7cmMFuZV6V9O35bq0dmb6gnCRDtK5jXFqLYlc2VuW1NAih6a4CiHxRQ1M5WF0HrL6uyKAhQrEIcRPnS663OPRGFKkZ9HoKkFEkSH9nt3nY7CNo+RldGjqYvSqV7dKCY29o70MwBAqXGM1XrMw6wbRoJJDRyuVo27t+qEVujpXNmbRxrtX9b074d/wbqXDllxAMUMZEhdaIzfLxEWN/Ab8luAZvwW9Id1evhuAeuUVzQF+eB+zYJRqw58qD8rjeBoFeWmzSNTCY3rTW51TMFT0YM0wap3pbS2tveGxvaTHt7X0ehZ4QdXxLjai/dQZHdVhxPukNNataGFgMakNo1eXiB79pd8Jd2Yimvtz0yIGlgTXLv4OL39EYhu2MoydH8NaGL2iwhq+vE6HMiRg0ww5DEXyct0/6eXroXhAtWU7r8z30pdCo+jkfj6xlUZ8DrJPNqcarl2xYRa+JljIaLyUZTFI7maOKtmnJ+MbNsEUuhSdkAmgreIMmDKzuCpLItja5mg0hgKItX7SWG1avt535DWLZRvljnBF4/sgiWdN8SeRwogLX1/Y+5HS9f076dDI86tt5Xbomyq9o/LRKVZRUdTSjKOgwu7NeI2wntrLcmtVfuoqlb3kqOjW5vZ+Xbtk/X0Soq2DVUWJqseBypONYS4/9MKo5mpEe0o0jFkQettZqElqRKHWuy3mFQZy110Nr5p5Bb31lVwk062AMXqOtUn9snm7MCC4i6J8nF9lFmblXAEshy9YHEpTeRq7/qxqMcpBuPXZFfE0E2r5/AfCxQs7GcAAkkbrbvG4dCpZk3sgDBJ85TvJj/8/lYz/P/hACc/ws=</diagram></mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 KiB

After

Width:  |  Height:  |  Size: 56 KiB

BIN
main.pdf

Binary file not shown.