Bearbeiten von Catalog und Formular vergibt Mitglieder-Gruppenzuweisung

Aus Contao Community Documentation

Version vom 17. Juli 2013, 21:49 Uhr von Zero (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Mitgliedergruppen Vergabe per Formular und Katalog

Anmerkung.png Anmerkung: 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 gibt es hier ein kleines Script das über einen Hook gestartet wird.



Bitte keine Experimente auf produktiven Plattformen. Immer brav im Sandkasten testen. Niemand übernimmt die Garantie für etwaige Schäden

"Information"



Dieses Script wurde getestet mit Contao 2.11.2 ## efg 1.16.0 stable und catalog 2.0.0 beta2 61

"Information"


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.


Die Formel MÜSST ihr natürlich noch ändern, sonst ist die Sicherheit für die Katz.

"Warnhinweis"



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.

Ansichten
Meine Werkzeuge

Contao Community Documentation

<user> Kann es sein, dass sich SyncCto bei Sync->Client anders verhält als umgegekehrt also Sync->Server ?
<xtra> ja, da laufen die Daten in die andere Richtung *scnr*

Navigation
Verstehen
Verwenden
Entwickeln
Verschiedenes
Werkzeuge