Mitgliederfelder automatisch öffentlich setzen

Aus Contao Community Documentation

betrifft
Contao Version ab 2.2

Einleitung

Wenn man als Administrator die Mitgliederdaten in irgendeiner Weise auf seiner Seite ausgeben will, taucht schnell das Problem auf, dass man nicht vorbestimmen kann, dass bestimmte Felder (z.B. Vorname, Nachname) immer öffentlich sind. Das kann zum Nachteil werden, wenn die registrierten Mitglieder in den Personendaten die Felder nicht selbst öffentlich stellen können oder dürfen.

Öffentliche Felder 1.jpg

Mit diesem Hook lassen sich bestimmte (oder auch alle) Felder eines neuen Mitglieds nach der Registrierung automatisch auf öffentlich setzen.

Vorgehen

Um diese Funktion zu implementieren, gibt es folgendes Vorgehen.

Beispielmitglied

Um den später benötigten Code für die öffentlichen Felder herausfinden zu können, muss man ein Beispielmitglied erstellen, das später wieder gelöscht werden kann.

  • Zunächst legt man im Backend ein neues Mitglied an, das als Beispiel für die öffentlichen Felder dient.
  • Für dieses Mitglied setzt man nun die gewünschten Felder auf öffentlich.

Diese Einstellungen werden später für jedes neue Mitglied angewendet.

Ordnerstruktur

Dieser Lösungsansatz wurde durch den Hook createNewUser verwirklicht. Hierfür muss man im contao-Ordner neue Ordner anlegen.

  • [contaoordner]/system/modules/myNewUserHook
  • [contaoordner]/system/modules/myNewUserHook/config

Öffentliche Felder 2.jpg

Öffentliche Felder 3.jpg

In diese Ordner werden auch die folgenen Dateien angelegt.

Dateien und Code

  • In dem eben angelegten Ordner config muss eine .php-Datei erstellt werden die config.php heißt und folgenen Code enthält:

Öffentliche Felder 4.jpg

<?php
 
$GLOBALS['TL_HOOKS']['createNewUser'][] = array('MyNewUserClass', 'myCreateNewUser');
 
?>

Dieser Skript ruft die Klasse 'MyNewUserClass' und in dieser die Methode 'myCreateNewUser' auf. Diese muss nun erstellt werden.

  • Im übergeordneten Ordner [contaoordner]/system/modules/myNewUserHook wird die Klasse angelegt, die später aufgerufen wird. Hierfür erstellt man die Datei MyNewUserClass.php-Datei mit folgenem Code:

Öffentliche Felder 5.jpg

<?php
 
class MyNewUserClass extends Frontend
{
   public function myCreateNewUser($intId, $arrData)
   {
      $sql = "UPDATE `[Datenbankname]`.`tl_member` SET `publicFields` = [Platzhalter] WHERE `tl_member`.`id` = $intId;";
      mysql_query($sql);
   }
}
 
?>
  • Hierbei muss jetzt noch der [Datenbankname] an die entsprechende Datenbank angepasst werden.
  • Außerdem muss noch der [Platzhalter] ersetzt werden. Den Wert hierfür muss jeder selber über den phpmyadmin herausfinden. Es handelt sich hierbei nämlich um einen binär-Code, der je nach gewählten öffentlichen Feldern (beim Beispielmitglied) erzeugt wird.

Code aus phpmyadmin holen

Vorgehen:

  • Man öffnet den phpmyadmin, navigiert in die entsprechende Datenbank und sucht in der Tabelle tl_member

Öffentliche Felder 6.jpg

das Feld publicFields für das Beispielmitglied.

Öffentliche Felder 7.jpg

___________________________________

  • Dort sollte ein BLOB-Wert zu finden sein. Diesen kann man als .bin-Datei auf dem lokalen Computer speichern.

Öffentliche Felder 8.jpg

Er enthält, welche Felder für dieses Mitglied öffentlich sind.

___________________________________

  • Wenn man jetzt im phpmyadmin in der Tabelle tl_member auf "Bearbeiten" für das Beispielmitglied klickt,

Öffentliche Felder 9.jpg

kann man dort für das Feld publicFields diese eben gespeicherte Datei auswählen und ganz unten auf Speichern klicken.

Öffentliche Felder 10.jpg

Der phpmyadmin führt nun diesen Befehl aus und zeigt diesen auf der nächsten Seite oben an.

Öffentliche Felder 11.jpg

___________________________________

  • Den kryptischen Code hinter `publicFields` = bis vor dem WHERE kopiert man nun.
  • Diesen Code setzt man dann für [Platzhalter] ein.

Beispielcode

Ein Beispielcode, bei dem die Felder Vorname und Nachname auf öffentlich gesetzt werden:

//config.php
<?php
 
$GLOBALS['TL_HOOKS']['createNewUser'][] = array('MyNewUserClass', 'myCreateNewUser');
 
?>
//MyNewUserClass.php
<?php
 
class MyNewUserClass extends Frontend
{
   public function myCreateNewUser($intId, $arrData)
   {
      $sql = "UPDATE `[Datenbankname]`.`tl_member` SET `publicFields` = 0x613a323a7b693a303b733a393a2266697273746e616d65223b693a313b733a383a226c6173746e616d65223b7d WHERE `tl_member`.`id` = $intId;";
      mysql_query($sql);
   }
}
 
?>

Anmerkung

  • Diese Lösung wurde auf der contao-Version 2.11 erfolgreich getestet, sollte aber ab der Version 2.2 funktionieren, weil seit dieser Version der ceateNewUser-Hook Bestandteil des cores ist.
Ansichten
Meine Werkzeuge

Contao Community Documentation

Meiner Meinung nach, sollten zu kleine Webspacepakete entweder Webspaß-Pakete (man beachte die Ironie) oder Horsting-Pakete heißen!

Sascha Müller
Navigation
Verstehen
Verwenden
Entwickeln
Verschiedenes
Werkzeuge