Catalog und Formular vergibt Mitglieder-Gruppenzuweisung
Aus Contao Community Documentation
betrifft | |
---|---|
Contao Version | ab 2.11 |
Extensions | Catalog ab 2.0beta1 |
Mitgliedergruppen Vergabe per Formular und Katalog
Funktion erstellen
FORMULAR(GENERATOR) GRUPPENZUWEISUNG
Für die Werteübermittlung wird ein verstecktes Feld angelegt mit Namen "dex" zum hinzufügen einer Gruppe
und(oder) ein Feld mit namen "kil" zum entfernen einer Gruppe.
Dem versteckten Feld gibt ihr einen echten Wert und einen eigenen Sicherheitscode(Kontrollwert) ein.
Das Script überprüft anhand einer Formel ob der Sicherheitscode gleich dem echten Wert ist.
Der Ausdruck sieht so aus "id*cz#####"
In das Sternchen kommt die echte ID der Mitgliedergruppe und die Raute bekommt den Sicherheitscode.
Den Code errechnet ihr euch selbst indem ihr die Formel benutzt:
FORMEL zum manuellen codieren ((x * 15) + 344) * 23;
Beispiel für Gruppe ID 8: 8*15=120 +344=464 *23=10672
Unser Wert für HIDDEN Feld ist also "id8cz10672"
Bei manipulationsversuche wird das Script also nicht ausgeführt.
Würde ich ein Anmeldeformular nun um das HIDDEN Feld "dex" mit Wert "id8cz10672" erweitern,
so wird der User nach abschicken des Formulars die Gruppenzuweisung mit id 8 bekommen.
Gebe ich dem HIDDEN Feld "kil" den Wert "id8cz10672"
so wird dem User nach abschicken die Gruppenzuweisung ID 8 entzogen
CATALOG GRUPPENZUWEISUNG
Hier ebenfalls ein HIDDEN Feld anlegen. Bis dato ist im Catalog keine vorhanden, daher folgendes:
Unter modules/catalog/templates/
befindet sich das catalog_edit.xyz Template das ihr modifiziert oder euch erstmal eine Kopie davon anlegt.
Im Template setzt ihr unter dem hidden REQUEST_TOKEN ein neues Hidden Feld
<input type="hidden" value="id8cz10672" name="dex"/>
Das neue Template dann auch im CatalogEdit Modul auswählen.
Jetzt zum Eigentlichen...
unter modules/ legt ihr einen neuen Ordner an zb. "eigenefunktionen"
Jetzt erstellt darin eine "Extrafunktionen.php" mit folgedem Inhalt
<?php if (!defined('TL_ROOT')) die('You can not access this file directly!'); /** * TYPOlight webCMS * * The TYPOlight webCMS is an accessible web content management system that * specializes in accessibility and generates W3C-compliant HTML code. It * provides a wide range of functionality to develop professional websites * including a built-in search engine, form generator, file and user manager, * CSS engine, multi-language support and many more. For more information and * additional TYPOlight applications like the TYPOlight MVC Framework please * visit the project website http://www.typolight.org. * * This is not a complete extension. Its only a little Script for group assignment over form submitted and catalog edited * Script powered by www.mediadistrict.de * PHP version 5 * @copyright MediaDistrict e.K. * @author Marco Groß * @package * @license free for all :) * @filesource this file only */ class Extrafunktionen extends Frontend { public function gruppenzuweisung($arrPost, $arrForm, $arrFiles){ /////////////////////////////////////////// Automatische Gruppenzuweisung BEGINN $this->import('FrontendUser','user'); $user_id = $this->user->id; $this->import('FrontendUser', 'Member'); $ok = 0;$okkill = 0; $addgroup_id = array();$killgroup_id = array(); // Beispiel Code id2&cd8602 = ID 2 ok // Beispiel Code id2&cd7489 = ID 2 fail // FORMEL zum manuellen codieren ((x * 15) + 344) * 23; // FORMEL zum auto decodieren ((x / 23) - 344) / 15; if ($arrPost["dex"]){// muss Hiddenfeld haben $inhalt = $arrPost["dex"]; $alle = explode("&", $inhalt); $idnumber = array(); $codenumber = array(); for ($next = 0; $next <= count($alle)-1; $next++){ $zeichen = preg_split('/[id.cz]/', $alle[$next], -1); $newarray = array(); for ($x = 0; $x <= count($zeichen)-1; $x++){//neuen Index if($zeichen[$x]!=''){ array_push($newarray, $zeichen[$x]); } } $idnumber[$next] = $newarray[0]; $codenumber[$next] = $newarray[1]; $codenumber[$next] = (($codenumber[$next] / 23) - 344) / 15;// Sicherheitscode dekodieren if ($codenumber[$next] == floor($codenumber[$next]) && $codenumber[$next] == $idnumber[$next]){// muss ganze Zahl sein und mit ID übereinstimmen $ok = 1; $addgroup_id[$next] = $idnumber[$next]; } } //print_r($codenumber[$next]); } if ($arrPost["kil"]){// muss Hiddenfeld haben $inhalt = $arrPost["kil"]; $alle = explode("&", $inhalt); $idnumber = array(); $codenumber = array(); for ($next = 0; $next <= count($alle)-1; $next++){ $zeichen = preg_split('/[id.cz]/', $alle[$next], -1); $newarray = array(); for ($x = 0; $x <= count($zeichen)-1; $x++){//neuen Index if($zeichen[$x]!=''){ array_push($newarray, $zeichen[$x]); } } $idnumber[$next] = $newarray[0]; $codenumber[$next] = $newarray[1]; $codenumber[$next] = (($codenumber[$next] / 23) - 344) / 15;// Sicherheitscode dekodieren if ($codenumber[$next] == floor($codenumber[$next]) && $codenumber[$next] == $idnumber[$next]){// muss ganze Zahl sein und mit ID übereinstimmen $okkill = 1; $killgroup_id[$next] = $idnumber[$next]; } } } $memberGroups = $this->Member->groups; for ($addit = 0; $addit <= count($addgroup_id)-1; $addit++){//neuen Index // ---------------- neuer Gruppe zuweisen --------------------------------- if ($ok == 1 && !in_array($addgroup_id[$addit], $this->Member->groups)){//wenn nicht schon vorhanden $memberGroups[] = $addgroup_id[$addit];//array push } } for ($killit = 0; $killit <= count($killgroup_id)-1; $killit++){//neuen Index // ---------------- Gruppe entfernen --------------------------------- $this->import('FrontendUser', 'Member'); if ($okkill == 1 && in_array($killgroup_id[$killit], $this->Member->groups)){//wenn vorhanden $key = array_search($killgroup_id[$killit], $memberGroups);// gesuchte Element killen unset($memberGroups[$key]);// Entfernt das gekillte Arrayelement um Index neu aufzubauen $memberGroups = array_values($memberGroups);// Array mit fortlaufendem Index erzeugen um Lücken zu entfernen } } if ($ok == 1 || $okkill == 1){// Tabelle beschreiben $group_ids = serialize($memberGroups); $this->Database->prepare("UPDATE tl_member SET groups = ? WHERE id = ?")->execute($group_ids, $user_id); } ///////////////////////////////////////// Automatische Gruppenzuweisung ENDE } public function gruppenzuweisungcat(){ /////////////////////////////////////////// Automatische Gruppenzuweisung BEGINN $this->import('FrontendUser','user'); $user_id = $this->user->id; $this->import('FrontendUser', 'Member'); $ok = 0;$okkill = 0; $addgroup_id = array();$killgroup_id = array(); // Beispiel Code id2&cd8602 = ID 2 ok // Beispiel Code id2&cd7489 = ID 2 fail // FORMEL zum manuellen codieren ((x * 15) + 344) * 23; // FORMEL zum auto decodieren ((x / 23) - 344) / 15; if ($_REQUEST["dex"]){// muss Hiddenfeld haben $inhalt = $_REQUEST["dex"]; $alle = explode("&", $inhalt); $idnumber = array(); $codenumber = array(); for ($next = 0; $next <= count($alle)-1; $next++){ $zeichen = preg_split('/[id.cz]/', $alle[$next], -1); $newarray = array(); for ($x = 0; $x <= count($zeichen)-1; $x++){//neuen Index if($zeichen[$x]!=''){ array_push($newarray, $zeichen[$x]); } } $idnumber[$next] = $newarray[0]; $codenumber[$next] = $newarray[1]; $codenumber[$next] = (($codenumber[$next] / 23) - 344) / 15;// Sicherheitscode dekodieren if ($codenumber[$next] == floor($codenumber[$next]) && $codenumber[$next] == $idnumber[$next]){// muss ganze Zahl sein und mit ID übereinstimmen $ok = 1; $addgroup_id[$next] = $idnumber[$next]; } } //print_r($codenumber[$next]); } if ($_REQUEST["kil"]){// muss Hiddenfeld haben $inhalt = $_REQUEST["kil"]; $alle = explode("&", $inhalt); $idnumber = array(); $codenumber = array(); for ($next = 0; $next <= count($alle)-1; $next++){ $zeichen = preg_split('/[id.cz]/', $alle[$next], -1); $newarray = array(); for ($x = 0; $x <= count($zeichen)-1; $x++){//neuen Index if($zeichen[$x]!=''){ array_push($newarray, $zeichen[$x]); } } $idnumber[$next] = $newarray[0]; $codenumber[$next] = $newarray[1]; $codenumber[$next] = (($codenumber[$next] / 23) - 344) / 15;// Sicherheitscode dekodieren if ($codenumber[$next] == floor($codenumber[$next]) && $codenumber[$next] == $idnumber[$next]){// muss ganze Zahl sein und mit ID übereinstimmen $okkill = 1; $killgroup_id[$next] = $idnumber[$next]; } } } $memberGroups = $this->Member->groups; for ($addit = 0; $addit <= count($addgroup_id)-1; $addit++){//neuen Index // ---------------- neuer Gruppe zuweisen --------------------------------- if ($ok == 1 && !in_array($addgroup_id[$addit], $this->Member->groups)){//wenn nicht schon vorhanden $memberGroups[] = $addgroup_id[$addit];//array push } } for ($killit = 0; $killit <= count($killgroup_id)-1; $killit++){//neuen Index // ---------------- Gruppe entfernen --------------------------------- $this->import('FrontendUser', 'Member'); if ($okkill == 1 && in_array($killgroup_id[$killit], $this->Member->groups)){//wenn vorhanden $key = array_search($killgroup_id[$killit], $memberGroups);// gesuchte Element killen unset($memberGroups[$key]);// Entfernt das gekillte Arrayelement um Index neu aufzubauen $memberGroups = array_values($memberGroups);// Array mit fortlaufendem Index erzeugen um Lücken zu entfernen } } if ($ok == 1 || $okkill == 1){// Tabelle beschreiben $group_ids = serialize($memberGroups); $this->Database->prepare("UPDATE tl_member SET groups = ? WHERE id = ?")->execute($group_ids, $user_id); } ///////////////////////////////////////// Automatische Gruppenzuweisung ENDE } }
HINWEIS: Bei der eigenen Funktion darf es in der PHP kein Close Tag geben. Das "?>" darf hier am Ende nicht stehen.
Kurz zur Erläuterung
Die "gruppenzuweisung" Funktion ist für das abschicken von Formulardaten
Die "gruppenzuweisungcat" Funktion ist eine seperate für das abschicken von Katalog(item)daten, da es von der
ContaoCore Routine nicht erfasst wird.
Funktion starten
Zum Schluß müssen wir nur noch festlegen wann und wo wir diese Funktion abfrufen möchten.
Im Ordner system/config/
die Datei dcaconfig.php bearbeiten und folgendes einsetzen:
$GLOBALS['TL_HOOKS']['processFormData'][] = array('Extrafunktionen', 'gruppenzuweisung'); //$GLOBALS['TL_HOOKS']['catalogFrontendUpdate'][] = array('Extrafunktionen', 'gruppenzuweisungcat'); $GLOBALS['TL_HOOKS']['catalogFrontendInsert'][] = array('Extrafunktionen', 'gruppenzuweisungcat');
In diesem Beispiel wird unsere Funktion nach dem Abschicken eines Formulars ausgeführt und nachdem der User (im FE)
einen neuen KatalogItem erstellt hat. Je nach dem was man erreichen möchte setzt man es hier fest.
würden man noch mehr nette Features umsetzen können.
Beispiel: Ein neuer User bekommt die Gruppe "Neuling" und "Mitglied"
Alle Neulinge sehen speziell für sie eingerichtete Werbeinfos/Funktion/Anmelde-infos.
Zudem haben Neulinge nicht gleich vollen Zugang.
Meldet er sich für einen Newsletter oder bewirbt sich über ein Formular, oder erstellen sein eigenes Karteprofil über den Katalog, so kann er die Gruppe "vip" erlangen und verliert den Status "neuling".
Dadurch verändert sich für ihn die Website und die Zugangsberechtigung.
Ein anderer User registriert sich als "Partner" und bekommt erweiterte Berechtigungen,
soll aber auch seinen Account umwandeln können zu ein Normales Mitglied.
Ein Käufer soll nach Teilnahme an einem Gewinnspiel besondere Produkte sehen können......
Um diese Vielfalt nutzen zu können gibt es hier ein kleines Script das über einen Hook gestartet wird.