Moodle: Primärschlüssel für Einträge in Aktivität Datenbank:

Mitunter benötigt man für die Datenbankaktivität in Moodle einen Primärschlüssel. Das ist eine Zeichenfolge, die einen Datenbankeintrag eindeutig identifiziert. Es gibt ihn wohl, aber leider leider kann/darf man ihn nicht als Feld verwenden. Die Frage ist also: wie kann ich einen eigenen Primärschlüssel erstellen?

Einen Primärschlüssel kann man gut brauchen, wenn man zum Beispiel ID-Selektoren in JavaScript oder für CSS in der Listenansicht verwendet. Eine Möglichkeit ist es, das Feld ##moreurl## zu verwenden. Dieses Feld generiert einen Link zum entsprechenden Eintrag und enthält die ID für die Aktivität und für die Einzelansicht. Damit ist die Zeichenfolge eindeutig. Das Feld funktioniert aber nicht immer, da der Link Sonderzeichen enthält. Der Quelltext ist außerdem für Dritte schlecht nachvollziehbar.

Ein bessere Möglichkeit ist es, selbst ein Feld anzulegen und dort eine ID automatisch generieren zu lassen. Dazu legen wir zunächst ein Feld mit dem Namen “ID” als Textzeile an. In der Vorlage für neue Einträge bauen wir uns dann selbst ein Eingabefeld. Das kopiert man einfach aus dem Quelltext heraus und tauscht die Feldnummern aus. Glücklicherweise lassen sich die Feldnummern – zum Beispiel [[ID#id]] – als Platzhalter verwenden:

<div class="hidden">
<label for="[[ID#id]]"><span class="accesshide">ID</span></label>
<input class="basefieldinput form-control d-inline mod-data-input" type="text" name="[[ID#id]]" id="[[ID#id]]" value=""></div>

Mit einer entsprechenden CSS-Klasse, nämlich hidden für {display:none}, wird das Ganz für den Nutzer ausgeblendet.

Mit JavaScript erhält das Eingabefeld eine zufällige Zahl:

<script>
let idnummer = Date.now() + Math.random();
document.getElementById("[[ID#id]]").value = idnummer;
</script>

Date.now() gibt die Anzahl der Millisekunden zurück, die seit dem 01.01.1970 00:00:00 UTC vergangen sind. Für den schon sehr unwahrscheinlichen Fall, dass zwei oder mehrere Nutzer in der selben Millisekunde einen Eintrag abgeben, addieren wir mit Math.random() zusätzlich eine zufällige Gleitkommazahl zwischen 0 und 1. Das sollte ausreichend sein und damit wird stets ein eindeutiger und auch neuer Wert erzeugt.

Fortan kann das Feld als ID benutzt werden und auch ein Buchstabe, zum Beispiel bei Verwendung als Variable, vorangestellt werden:

A[[ID]]

Dieses Feld ist kein richtiger Primärschlüssel. Wenn der Eintrag in der Datenbank bearbeitet wird, wird ein neuer Primärschlüssel generiert. Das macht aber nichts. Ziel war ja nur, einen eindeutigen Wert zu haben, nicht immer den selben.

Kompletter Code