Ein kleiner Kniff für den Joomla Community Builder
Neulich erhielt ich eine kleine Auftragsanfrage. Ein bestehende Webanwendung wird stark erweitert und dabei auf das CMS „Joomla“ umgestellt. Zur Mitgliederverwaltung wird die Erweiterung „Community Builder“ eingesetzt.
Bisher hatten die Nutzer eine Nummer als Loginnamen. Diese Nummer soll jetzt für alle alten Nutzer in ein Feld „Mitgliedsnummer“ überführt werden. So weit die Anforderung aus Kundensicht.
Analyse
Joomla verwaltet die Benutzer in einer Tabelle jos_user. Der „Community Builder“ ermöglicht es, zu einem Nutzerdatensatz weitere Felder hinzuzufügen. Die Felder landen in der gesonderten Tabelle jos_profiler. Mithilfe der ID sind diese beiden Datensätze verknüpft. Auf diese Weise muss der Community Builder keine Tabellen des Joomla-Kerns verändern. Allerdings ist das Hantieren mit zwei Tabellen natürlich programmtechnisch aufwendiger und fehleranfälliger.
Die Anforderung lautet demnach: Für alle jos_user Datensätze, die eine Zahl im Feld username haben, setze diese Zahl in das Feld Mitgliedsnummer des dazugehörigen Datensatzes in der Tabelle jos_profiler.
Geht das mit SQL?
Man kann das Problem sicherlich durch ein kleines PHP-Programm lösen. Wenn es mit einem SQL Befehl funktioniert, ist das viel einfacher. Ein Grund für mich, die Dokumentation zu MySQL genauer durchzusehen.
Auswahl aller Zahlen
Glücklicherweise unterstützt die verwendete MySQL Datenbank reguläre Ausdrucke. Alle usernamen, die nur aus Ziffern bestehen, lassen sich so abrufen:
SELECT username FROM jos_users WHERE username REGEXP '^[0-9]+$' |
Verknüpfung beider Tabellen
DieVerknüpfung zweier Datenbanktabellen wird auch als „join“ bezeichnet, in unserem Fall ein „inner equijoin“.
Um das Feld username und die Mitgliedsnummer gleichzeitig anzuzeigen, verwenden wir:
SELECT jos_users.username, jos_comprofiler.cb_mitgliedsnummer FROM jos_comprofiler, jos_users WHERE jos_comprofiler.user_id = jos_users.id |
Diese Anweisung hilft auch bei der Kontrolle, ob am Ende alles richtig gesetzt ist.
Setzen der Daten
Als letzter Schritt bleibt noch, das Feld des einen Datensatzes mit dem Inhalt des Felds des korrespondierenden Datensatzes der anderen Tabelle zu setzen. Zum Glück funktionieren die beiden obigen Techniken auch im UPDATE Befehl von SQL.
UPDATE jos_comprofiler, jos_users SET jos_comprofiler.cb_mitgliedsnummer = jos_users.username WHERE jos_comprofiler.user_id = jos_users.id AND jos_users.username REGEXP '^[0-9]+$' |
Mit einem einzigen SQL-Befehl konnte das Kundenproblem gelöst werden. Möglich macht diese Magie der mathematische Unterbau von SQL, die relationale Algebra.
The article is usefull for me. I’ll be coming back to your blog.