Mitgliedergruppen Vergabe per Formular oder Katalog oder Inserttag
Die Mitgliedergruppen Vergabe automatisieren und für Formulare sowie Catalog Interaktionen nutzen
Die Mitgliedergruppen Funktion in Contao ist wirklich ein feine Sache. Wenn man sie noch flexibler gestalten könnte,
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 habe ich ein Script geschrieben das über einen Hook gestartet wird.
Zitat:
HINWEIS: Bitte keine Experimente auf produktiven Plattformen. Immer brav im Sandkasten testen. Ich übernehme keine Garantie für etwaige Schäden
FORMULAR(GENERATOR) GRUPPENZUWEISUNG
Für die Identifizierung habe ich 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 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.
Die Formel und alles, könnt ihr natürlich selbst ändern.
Würde ich ein Anmeldeformular nun um das HIDDEN Feld "dex" mit Wert "id8cz10672" erweitern,
so wird der User nach abschicken die Gruppenzuweisung mit id 8 bekommen.
Gebe ich ein HIDDEN Feld "kil" mit Wert "id8cz10672"
so wird dem User nach abschicken die Gruppenzuweisung ID 8 entzogen
CATALOG GRUPPENZUWEISUNG
Hier ebenfalls ein HIDDEN Feld anlegen. Bis dato ist mir nicht bekannt das es im Katalog eins gibt, 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
PHP-Code:
<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 eine "Extrafunktionen.php" mit folgedem Inhalt
PHP-Code:
<?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 https://contao.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 id2cz8602 = ID 2 ok
// Beispiel Code id2cz7489 = ID 2 fail
// FORMEL zum manuellen codieren ((x * 15) + 344) * 23;
// FORMEL zum auto decodieren ((x / 23) - 344) / 15;
if ($arrPost["dex"] && $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"] && $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"] && $_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"] && $_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
}
}
zur Hölle ich muss das hier erwähnen :D bei der eigenen Funktion darf es in der PHP kein Close Tag geben. Das "?>" darf hier am Ende nicht stehen. Es hat mich einen blöden Nachmittag gekostet das zu erfahren *grml*
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.
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:
PHP-Code:
$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.
Danke fürs Lesen. Und viele Grüße.
Genial - und so gehts automatisiert
hallo,
klasse! funktioniert einwandfrei.
wenn man auf der seite mit dem formular über javascript dieses automatisch absenden lässt, kann man dem mitglied eine gruppe zuweisen, indem man es auf eine seite schickt und dort eben automatisch, das formular absenden lässt.
Code:
document.getElementById("myform").submit();
dann kommt man erst zur eigentlichen seite, die man dem mitglied anzeigen lässt.
ich verkaufe zugänge zu online-videoportalen (für medizinische ausbildungen ... hast du was anderes gedacht?).
die will ich über die mitgliedsgruppen freigeben.
nach einem einkauf wird nun einer auf die seite mit dem autoformversand geleitet, bekommt die mitgliedsgrupe und wird dann auf die bestätigunsgseite geleitet.
sehr fein.
danke!
stefan
Mitgliedervergabe per InsertTag AddOn ^^
Hi stefansan
danke für die positive Kritik. Ich habe das ganze auch noch mal in eine zweite Variante gepackt, mittels Inserttag
Das Geben oder Nehmen der Mitgliedergruppe kann man nun an jedem Ort per InsertTag starten.
Das ganze sollte natürlich nicht unüberlegt benutzt werden. Für einige Dinge macht es aber eventuell Sinn.
Initialisiert wird der Hook wie immer in der dcaconfig.php
mit folgendem Inhalt:
PHP-Code:
$GLOBALS['TL_HOOKS']['replaceInsertTags'][] = array('Extrafunktionen', 'gruppenzuweisungstag');
Unsere Extrafunktionen.php müssen wir erweitern mit dieser Funktion:
PHP-Code:
public function gruppenzuweisungstag($strTag)
{
$arrSplit = explode('::', $strTag);
$yeah = 0;
if(preg_match("/^addgroup[0-9]/", $arrSplit[0])){
$group = explode("addgroup", $arrSplit[0]);
if (isset($arrSplit[1])){
$secure = $arrSplit[1];
$groupid = $group[1];
$yeah = 1;
}
} else if (preg_match("/^cache_addgroup[0-9]/", $arrSplit[0])){
$group = explode("cache_addgroup", $arrSplit[0]);
if (isset($arrSplit[1])){
$secure = $arrSplit[1];
$groupid = $group[1];
$yeah = 1;
}
} else if(preg_match("/^killgroup[0-9]/", $arrSplit[0])){
$group = explode("killgroup", $arrSplit[0]);
if (isset($arrSplit[1])){
$secure = $arrSplit[1];
$groupid = $group[1];
$yeah = 2;
}
} else if (preg_match("/^cache_killgroup[0-9]/", $arrSplit[0])){
$group = explode("cache_killgroup", $arrSplit[0]);
if (isset($arrSplit[1])){
$secure = $arrSplit[1];
$groupid = $group[1];
$yeah = 2;
}
} else {
return false;
}
if($yeah == 1 || $yeah == 2){
/////////////////////////////////////////// Automatische Gruppenzuweisung BEGINN
$this->import('FrontendUser','user');
$user_id = $this->user->id;
$this->import('FrontendUser', 'Member');
$ok = 0;$okkill = 0;
$addgroup_id;$killgroup_id;
// {{addgroup*::####}}
// Beispiel Inserttag {{addgroup21::15157}}
// Beispiel Inserttag {{killgroup22::15502}}
// FORMEL zum manuellen codieren ((x * 15) + 344) * 23;
// FORMEL zum auto decodieren ((x / 23) - 344) / 15;
$memberGroups = $this->Member->groups;
$idnumber = $groupid;
$codenumber = $secure;
if ($yeah == 1){
$codenumber = (($codenumber / 23) - 344) / 15;// Sicherheitscode dekodieren
if ($codenumber == floor($codenumber) && $codenumber == $idnumber){// muss ganze Zahl sein und mit ID übereinstimmen
$ok = 1;
$addgroup_id = $idnumber;
}
if ($ok == 1 && !in_array($addgroup_id, $this->Member->groups)){//wenn nicht schon vorhanden
$memberGroups[] = $addgroup_id;//array push
}
}
if ($yeah == 2){
$codenumber = (($codenumber / 23) - 344) / 15;// Sicherheitscode dekodieren
if ($codenumber == floor($codenumber) && $codenumber == $idnumber){// muss ganze Zahl sein und mit ID übereinstimmen
$okkill = 1;
$killgroup_id = $idnumber;
}
$this->import('FrontendUser', 'Member');
if ($okkill == 1 && in_array($killgroup_id, $this->Member->groups)){//wenn vorhanden
$key = array_search($killgroup_id, $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
} else {
return false;
}
}
Der InsertTag sieht dann wie folgt aus:
PHP-Code:
{{addgroup*::####}}
oder {{killgroup*::####}}
zb.: {{addgroup21::15157}}
HINWEIS: Derzeit funktioniert nur EINE Vergabe. Das heisst das InsertTag kann nur EINMAL auf einer Seite benutzt werden (weil die Datenbank erst aktualisiert werden muss) Wenn ich Zeit hab erarbeite ich eine Lösung.