@@ -12,17 +12,22 @@ Ein Anmeldeset stellt einen Rahmen für Veranstaltungen dar, die gemeinsame Rege
...
@@ -12,17 +12,22 @@ Ein Anmeldeset stellt einen Rahmen für Veranstaltungen dar, die gemeinsame Rege
### Aufbau einer Anmelderegel
### Aufbau einer Anmelderegel
Alle Anmelderegeln liegen im Ordner `lib/admissionrules`. Pro Regeltyp gibt es dort einen Ordner, in dem typischerweise die Klassendefinition der Regel liegt (`Regeltyp.class.php`, SQL-Anweisungen, die bei (De-)Installation der Regel ausgeführt werden müssen und templates zur Konfiguration und zur Kurzanzeige der Regel.
Anmelderegeln liegen in zwei Ordnern:
- der PHP-Teil liegt in `lib/admissionrules`.
- die zugehörige Vue-Komponente liegt in `resources/vue/components/admission`.
In `lib/admissionrules/<unterordner>` liegen typischerweise die Klassendefinition der Regel (`Regeltyp.php`, SQL-Anweisungen, die bei (De-)Installation der Regel ausgeführt werden müssen und ein Template zur Kurzanzeige der Regel.
Im Folgenden soll das Beispiel `NightAdmission` entwickelt werden, eine Regel, die eine Anmeldung nur zwischen 22 und 6 Uhr zulässt.
Im Folgenden soll das Beispiel `AdditionalDataAdmission` entwickelt werden, eine Regel, die die Eingabe zusätzlicher Daten (Telefonnummer und Semesteradresse) vor der Anmeldung erfordert.
#### Speichern und Laden der Daten
#### Speichern und Laden der Daten
Die Regel vom Typ `NightAdmission` sollen alle in einer eigenen Tabelle `nightadmissions` in der Datenbank gespeichert werden. Da dieser Regeltyp neben dem standardmäßig vorhandenen Infotext keine weiteren Attribute besitzt, sieht diese Tabelle so aus:
Die Regel vom Typ `AdditionalDataAdmission` sollen alle in einer eigenen Tabelle `additionaldataadmissions` in der Datenbank gespeichert werden. Diese kann so aussehen:
Wir legen eine Datei `NightAdmission.class.php` an, die von der bereits vorhandenen Klasse `AdmissionRule` erbt. Da wir nur die aktuelle Uhrzeit berücksichtigen müssen, braucht diese Klasse keine eigenen, weiteren Attribute. Wir definieren nur, mit welchen anderen Anmelderegeltypen diese Regel kombinierbar ist (nämlich alle Standardregeln außer zeitgesteuerter und komplett gesperrter Anmeldung).
Die PHP-Klasse für die Regel wird von `AdmissionRule` abgeleitet. Damit das Zusammenspiel mit der zugehörigen Vue-Komponente funktionieren kann, müssen mindestens diese beiden Methoden implementiert sein:
-`getPayload()` liefert ein Array mit den Attributen (und deren Werten), die für diesen Regeltyp spezifisch sind. In unserem Fall wären das also `phone` und `address` für die Telefonnummer und Semesteradresse.
Einige Standardmethoden müssen wir ebenfalls implementieren, um das Laden und Speichern in eigene Tabellen zu realisieren.
-`setAllData($data)` empfängt ein Array mit den Werten, die für diese Regel spezifisch sind. Hier also wieder `phone` und `address`.
```php
- Weiter ist die Methode `ruleApplies($user_id, $course_id)` wichtig, die ermittelt, ob die angegebene Person in die angegebene Veranstaltung eingetragen werden darf.
<?php
classNightAdmissionextendsAdmissionRule{
#### Regeldefinition (Vue)
Die Vue-Komponente `AdditionalDataAdmission` implementiert sowohl die Oberfläche zur Regelkonfiguration als auch die Logik, die Daten an das PHP-Backend zu übergeben.
/**
Die Komponente sollte das Mixin `AdmissionRuleMixin` verwenden und bekommt damit bereits die gesamte Kommunikations- und Wertetransferlogik eingebaut. Darüber hinaus braucht die Komponente neben ihrem Template nur folgende Attribute und Methoden:
* Standardkonstruktor
-`data()` legt fest, welche eigenen Attribute es in dieser Komponente gibt. Das wären hier `phone` und `address` für Telefonnummer und Semesteradresse
Am wichtigsten sind die beiden Methoden `ruleApplies` und `getTemplate`.
Damit Stud.IP weiß, welche Vue-Komponente zu diesem Regeltyp gehört, muss diese Verknüpfung in `STUDIP.Admission.availableRules` hergestellt werden:
```javascript
Erstere Methode spezifiert das Verhalten der Regel, also wann und unter welchen Voraussetzungen überhaupt eine Anmeldung erfolgreich sein kann. Hier können im Prinzip beliebige Datenbankabfragen oder sonstige anderen Funktionen aufgerufen werden.
Das Template definiert die GUI zur Konfiguration der jeweiligen Regel. Standardmäßig wird nur ein Textfeld angeboten, das einen Text aufnehmen kann, der vor der Anmeldung auf der Veranstaltungsseite erscheint. Will man hier weitere Werte, Checkboxen oder anderes einstellbar machen, muss man selbst ein [Flexi-Template](FlexiTemplates) dafür schreiben.
Hier muss der Pfad der Komponente relativ zu `resources/vue/components/admission` angegeben werden.
Daneben kann es noch ein Info-Template geben, das nur zur Anzeige der Regel in normalem Prosatext dient.
### Zusammenfassung
Um diese Beispielregel in Stud.IP zu installieren, reicht es, in `lib/admissionrules` einen Ordner `nightadmissions` zu erstellen, dort die obige Klasse `Nightadmission.class.php` hineinzukopieren und die nötigen SQL-Anweisungen auszuführen. Da kein eigenes Template benötigt wird, ist hier auch kein Unterordner `templates` von Nöten. In der **globalen Konfiguration** unter **Anmelderegeln ** kann die Regel dann aktiviert werden. An gleicher Stelle muss dann unter **Regelkompatibilität** eingestellt werden, mit welchen vorhandenen Regelndie neue Regel kombinierbar ist.
## Verteilungsalgorithmus
## Verteilungsalgorithmus
Der Algorithmus, der die Plätze der Veranstaltungen eines Anmeldesets verteilt, kann ebenfalls frei selbst implementiert werden. Standardmäßig wird bereits ein Algorithmus mitgeliefert.
Der Algorithmus, der die Plätze der Veranstaltungen eines Anmeldesets verteilt, kann ebenfalls frei selbst implementiert werden. Standardmäßig wird bereits ein Algorithmus mitgeliefert.