Anleitung: geschützte Seiten mit AdvancedContent und FrontEndUsers

Hilfe zu Modulen und Tags
Post Reply
nockenfell
Power Poster
Power Poster
Posts: 751
Joined: Fri Sep 12, 2008 2:34 pm

Anleitung: geschützte Seiten mit AdvancedContent und FrontEndUsers

Post by nockenfell »

Update 22.12.2010
Ich habe den UDT für 1.9.x wieder zum laufen gebracht. Die Anleitung wurde ins deutsche Forum kopiert. Dort ist auch das aktuelle UDT zu finden:
http://forum.cmsmadesimple.de/viewtopic ... 1134#p1134


Update: 26.11.2010
Anscheinend funktioniert dies unter 1.9.x nicht mehr. Sobald ich dazu komme, werde ich das Script aktualisieren.

Mit AdvancedContent kann man sehr einfach Seiten für bestimmte Benutzergruppen freigeben bzw. sperren.

Dazu müssen folgende Module installiert sein:
AdvancedContent
FrontEndUsers

(CustomContent das bisher jeweils für zugriffsgeschützte Seiten benutzt wurde, ist hier nicht nötig)

AdvancedContent

Um eine Seite vor Zugriff schützen zu können, muss als Inhaltstyp "AdvancedContent" gewählt sein. Ansonsten funktioniert der hier beschriebene Zugriffschutz nicht.
Um AdvancedContent als Standard-Inhalt zu definieren, muss die Datei ./admin/addcontent.php bearbeitet werden:
http://forum.cmsmadesimple.org/index.ph ... #msg193390

Folgende Einstellungen müssen oder können dazu eingestellt werden:

Im Reiter Optionen gibt es ziemlich weit unten folgende Optionen:

Frontend access
Hier wird die FrontEndUser-Gruppe gewählt, welche Zugriff auf die Seite hat

Redirect Page if no access
Hier kann eine Seite definiert werden, auf welche weitergeleitet wird, wenn kein Zugriff auf die Seite erlaubt ist. Mit Vorteil wird dazu entweder auf die Loginseite oder auf eine im Menü nicht sichtbare Seite verwiesen, welche die Fehlermeldung "Kein Zugriff" enthaltet.

Show login form
Anstelle des Inhalts kann auch im Haupt-Inhaltselement das Login-Formular angezeigt werden. Diese Variante ist allerdings nicht unbedingt vorteilhaft, da so der Titel der geschützten Seite angezeigt wird.

Image

Template anpassen

Damit die Inhalte auf der Seite nicht angezeigt werden, müssen alle {content} Tags durch

Code: Select all

{AdvancedContent}
ersetzt werden. {AdvancedContent} funktioniert gleich wie der {content} Tag und bindet zusätzlich alle weiteren Funktionen des Moduls, wie z.B. der Frontend Zugriff ein.

Menü anpassen

Damit ist jedoch erst die Hälfte der Miete gemacht. Die geschützen Seiten werden weiterhin im Menü angezeigt. Damit geschütze Seiten nur im Menü angezeigt werden, wenn ein Benutzer eingeloggt ist, welcher auch die Berechtigung für diese Seite hat, muss man folgenden UDT (Benutzerdefinierten Tag) "feuShowMenu" erstellen:

Code: Select all

global $gCms;

// Funktionen
if(!function_exists('btGetFeuGroups')) {
	function btGetFeuGroups() { 
		global $gCms;

		$feusers= $gCms->modules['FrontEndUsers']['object'];
		
		// Alle Gruppen einlesen zu welchen der eingeloggte Benutzer gehört
		$groups = $feusers ->GetMemberGroupsArray($feusers ->LoggedInId());
		$gns = array();
		if($groups !== false ) {
			foreach( $groups as $gid ) {
				$gns[] = $gid['groupid'];
			}
		}
		return $gns;
	}
}
if(!function_exists('btGetFeuAccess')) {
	function btGetFeuAccess($id) {
		global $gCms;
		$gns = btGetFeuGroups();
		$feuAccess = $gCms->smarty->_tpl_vars['gCms']->hrinstance->content[$id]->mProperties->mPropertyValues['feu_access'];
		if ($feuAccess != "" and $feuAccess != -1) {
			// Prüfen der Berechtigung
			$feuArray= explode(';',$feuAccess);
			$retval = false;
			foreach ($feuArray as $feu) {
				if (in_array($feu,$gns)) $retval = true;
			}
			return $retval;
		}
		return true;
	}
}
if(!function_exists('btMenuHasChildren')) {
	function btMenuHasChildren($currentnode,$nodelist) {
		// Children suchen
		foreach ($nodelist as $node) {
			if ($node->depth == $currentnode->depth+1 and $currentnode->hierarchy == substr($node->hierarchy,0,strlen($currentnode->hierarchy))) {
				return true;
			}
		}
		return false;
	}
}
if(!function_exists('btMenuHasParent')) {
	function btMenuHasParent($currentnode,$nodelist) {
		// Parent suchen
		foreach ($nodelist as $node) {$pos = strpos($meinString, $findMich);
			if ($node->depth == $currentnode->depth-1 and strpos($currentnode->hierarchy, $node->hierarchy) !== FALSE) {
				return true;
			}
		}
		return false;
	}
}


if (!isset($params['nodelist'])) {
	echo "UDT-feuShowMenu - Nodeliste des Menüs fehlt!";
	return;
}

$nodelist = $params['nodelist'];

// Schreiben welche Seiten sichtbar sind
$modnodelist = array();
foreach($nodelist as $node) {
	$node->hasAccess = btGetFeuAccess($node->id);
	$modnodelist[] = $node;
}

// geschütze Seiten aus dem Array löschen
foreach ($modnodelist as $key=>$node) {
	// geschütze Seiten löschen
	if ($node->hasAccess == false or $node->hasAccess == "") {
		if (false !== ($key = array_search($node,$modnodelist))) {
			unset($modnodelist[$key]);
		}
	}
}

// nicht mehr referenzierte Seiten aus dem Array löschen
foreach ($modnodelist as $key=>$node) {
	// interne Links zu geschütze Seiten löschen
	if ($node->type == "pagelink") {
		foreach ($nodelist as $plnode) {
			if ($plnode->url == $node->url and $plnode->id != $node->id) {
				if (!btGetFeuAccess($plnode->id)) {
					if (false !== ($key = array_search($node,$modnodelist))) {
						unset($modnodelist[$key]);
					}
				}
			}
		}
	}
	// Sectionheader ohne Children löschen
	else if ($node->type == "sectionheader") {
		if (!btMenuHasChildren($node,$modnodelist)){
			if (false !== ($key = array_search($node,$modnodelist))) {
				unset($modnodelist[$key]);
			}
		}
	}
	// Childern ohne Parent löschen
	else if ($node->depth > 1) {
		if (!btMenuHasParent($node,$modnodelist)){
			if (false !== ($key = array_search($node,$modnodelist))) {
				unset($modnodelist[$key]);
			}
		}
	}
}

// $node->prevdepth und $node->haschildren neu setzen
$prevdepth = 1;
foreach ($modnodelist as $node) {
	$node->prevdepth = $prevdepth;
	$prevdepth = $node->depth;
	$node->haschildren = btMenuHasChildren($node,$modnodelist);
}

// Nummerierung Array zurücksetzen
$modnodelist = array_values($modnodelist);

//print_r($modnodelist);

// Assign des Rückgabewertes
if(isset($params['assign'])) 
	$smarty->assign(trim($params['assign']), $modnodelist );
else
	return $modnodelist;
Nun kann das Menü-Template angepasst werden. Da das Menü-Template angepasst werden muss, muss ein eigenes Menü-Template erstellt werden, falls ein Standardtemplate verwendet wird. Dazu kann man einfach das bisher verwendete Standardtemplate kopiert werden.

Code: Select all

{* CSS classes used in this template:
#menuwrapper - The id for the <div> that the menu is wrapped in. Sets the width, background etc. for the menu.
#primary-nav - The id for the <ul>
.menuparent - The class for each <li> that has children.
.menuactive - The class for each <li> that is active or is a parent (on any level) of a child that is active. *}
{if $count > 0}
{feuShowMenu nodelist=$nodelist assign='feuNodeList'}
<div id="menuwrapper">
<ul id="primary-nav">
{foreach from=$feuNodeList item=node} 
Im vorher angezeigten Code wird nur der erste Teil des Menü's angezeigt.  Dies damit der Kontext des folgenden Code's verstanden wird (die Platzierung der einzelnen Elemente)

Folgender Code wird nach dem {if $count > 0} eingefügt:

Code: Select all

{feuShowMenu nodelist=$nodelist assign='feuNodeList'}
Damit wird die NodeList des Menüs neu geschrieben mit berücksichtigung welche Seiten sichtbar sind und welche nicht. Nun muss die foreach Schleife noch angepasst werden:

Code: Select all

{foreach from=$feuNodeList item=node} 
($nodelist durch $feuNodeList ersetzen)

Viel Spass beim ausprobieren.

EDIT von 31.7.2010:10.38 - UDT und MenüTemplate angepasst
EDIT von 4.8.2010:00.12 - Hinweis wie der {AdvancedContent} im Template eingesetzt werden muss
Attachments
FrontEndAccess.png
Last edited by nockenfell on Wed Dec 22, 2010 8:44 pm, edited 1 time in total.
[this message is written with 100% recycled bits]
NashBridges
Forum Members
Forum Members
Posts: 75
Joined: Sun Jun 15, 2008 2:29 pm

Re: Anleitung: geschützte Seiten mit AdvancedContent und FrontEndUsers

Post by NashBridges »

hi
also besser hätte das timing nicht sein können! grad heut wollt ich sowas einbauen und suchen wie das denn funktioniert!!
vielen dank :)

allerdings hab ich eine frage:
ich kann menueinträge für bestimmte benutzergruppen anzeigen, gut. wie mache ich das aber mit abschnittsüberschriften? also ich hab zb ein menu:

1. überschrift
1.a restricted 1
1.b restricted 2
usw.

wie definiere ich jetzt 1. überschrift, damit bei klick auf den menupunkt einfach nichts passiert? oder kann das modul damit von haus aus umgehen?
lg
Last edited by NashBridges on Sat Jul 31, 2010 9:32 pm, edited 1 time in total.
nockenfell
Power Poster
Power Poster
Posts: 751
Joined: Fri Sep 12, 2008 2:34 pm

Re: Anleitung: geschützte Seiten mit AdvancedContent und FrontEndUsers

Post by nockenfell »

Ich habe den UDT noch ein wenig ausgebaut:

Code: Select all

global $gCms;

// FrontEndUsers Object einlesen
$feusers= $gCms->modules['FrontEndUsers']['object'];

// Alle Gruppen einlesen zu welchen der eingeloggte Benutzer gehört
$groups = $feusers ->GetMemberGroupsArray($feusers ->LoggedInId());
$gns = array();
if( $groups !== false ) {
	foreach( $groups as $gid ) {
		$gns[] = $gid['groupid'];
	}
}

// ContentID einlesen
if( isset($params['node'])) {
        $content_id = $params['node']->id;
        $pagetype = $params['node']->type;

}
else {
        $content_id = $gCms->variables['pageinfo']->content_id;
}

// FeuAccess des Contents einlesen
$feuAccess = $gCms->smarty->_tpl_vars['gCms']->hrinstance->content[$content_id]->mProperties->mPropertyValues['feu_access'];

if ($feuAccess != "" and $feuAccess != -1) {
	// Prüfen der Berechtigung
	$feuArray= explode(';',$feuAccess);
	$retval = false;
	foreach ($feuArray as $feu) {
		if (in_array($feu,$gns))			$retval = true;
	}
}
else {
	// Ansonsten immer TRUE
	$retval = true;
}

// SectionHeader ausblenden wenn keine Kinder angezeigt werden
if ($pagetype == "sectionheader" and isset($params['nodelist'])) {
	$hasVisibleSubPos = FALSE;
	foreach ($params['nodelist'] as $node) {
		if ($node->depth == $params['node']->depth + 1 and $params['node']->hierarchy == substr($node->hierarchy,0,strlen($params['node']->hierarchy))) {
			$feuAccess = $gCms->smarty->_tpl_vars['gCms']->hrinstance->content[$node->id]->mProperties->mPropertyValues['feu_access'];
			if ($feuAccess != "" and $feuAccess != -1) {
				// Prüfen der Berechtigung
				$feuArray= explode(';',$feuAccess);
				foreach ($feuArray as $feu) {
					if (in_array($feu,$gns)) $hasVisibleSubPos = true;
				}	
			}
			else {
				$hasVisibleSubPos = true;
			}
			if ($hasVisibleSubPos) {
				$retval = true;
				break;
			}
		}
	}
	if ($hasVisibleSubPos == FALSE)
		$retval = false;
		
}

// Prüfen ob das Ziel des internen Links sichtbar ist
if ($pagetype == "pagelink" and isset($params['nodelist'])) {
	foreach ($params['nodelist'] as $node) {
		if ($node->url == $params['node']->url and $node->id != $params['node']->id) {
			$feuAccess = $gCms->smarty->_tpl_vars['gCms']->hrinstance->content[$node->id]->mProperties->mPropertyValues['feu_access'];
			if ($feuAccess != "" and $feuAccess != -1) {
				// Prüfen der Berechtigung 
				$retval = false;
				$feuArray= explode(';',$feuAccess);
				foreach ($feuArray as $feu) {
					if (in_array($feu,$gns)) $retval = true;
				}	
			}
			else 
				$retval = true;
			break;
		}
		
	}
}

// Assign des Rückgabewertes
if(isset($params['assign'])) 
	$smarty->assign(trim($params['assign']), $retval );
else
	echo $retval;
Neu wird das UDT im Menü wie folgt aufgerufen:

Code: Select all

{feuShowMenu node=$node nodelist=$nodelist assign='showMenu'}
Neu wird abgefragt, ob ein SectionHeader sichtbare Kinder hat und ob das Ziel des internern Seitenlinks sichtbar ist.

Allerdings ist das ganze noch nicht ganz korrekt. Im Moment laboriere ich noch mit den {repeat} im Menü rum. Es schreibt für die nicht angezeigten Seiten noch HTML Tags die nicht rein dürften. Ev hat einer eine Idee. Ansonsten probiere ich mich hier weiter.
[this message is written with 100% recycled bits]
NaN

Re: Anleitung: geschützte Seiten mit AdvancedContent und FrontEndUsers

Post by NaN »

Erstmal danke für die ausführliche Erklärung.
Das mit dem UDT und dem Template werde ich mir mal anschauen.

Die Version 0.4.1 des AdvancedContent moduls ist jetzt auch im Downloadbereich.
nockenfell
Power Poster
Power Poster
Posts: 751
Joined: Fri Sep 12, 2008 2:34 pm

Re: Anleitung: geschützte Seiten mit AdvancedContent und FrontEndUsers

Post by nockenfell »

Ich habe nochmals alles über den Haufen geworfen. Wenn ich beim Menü willkürlich Daten nicht anzeige, stimmen die Verweise der Nodes nicht mehr.

Deshalb habe ich das UDT umgeschrieben und modifiziere die Nodelist des Menüs. Damit habe ich alle eventualitäten in der Hand.

Ich habe den Code des UDT wie auch des Menü's im ersten Post angepasst.
Last edited by nockenfell on Mon Aug 02, 2010 5:43 pm, edited 1 time in total.
[this message is written with 100% recycled bits]
NashBridges
Forum Members
Forum Members
Posts: 75
Joined: Sun Jun 15, 2008 2:29 pm

Re: Anleitung: geschützte Seiten mit AdvancedContent und FrontEndUsers

Post by NashBridges »

hi
also das ganze ist echt lässig, allerdings habe ich noch ein problem mit dem ich nicht so ganz klarkomm...

das selektieren im menu funktioniert wunderbar, allerdings kann ich die geschützten seiten direkt über die URL nach wie vor anwählen. ich hab eigentlich alles so gemacht wie in der anleitung, der pagetyp ist auf activecontent und auch in der db scheint alles zu stimmen und richtig eingetragen zu sein...
woran kann das liegen? brauch ich eventuell CgSimpleSmarty oder sowas ähnliches??
lg
NaN

Re: Anleitung: geschützte Seiten mit AdvancedContent und FrontEndUsers

Post by NaN »

NashBridges wrote:
allerdings kann ich die geschützten seiten direkt über die URL nach wie vor anwählen.
Klar, die Seite ist ja auch aktiv usw.
Sie wird nur beim Rendern aus dem Menü herausgenommen.
Wird dir denn auch der Inhalt angezeigt?

Was hast Du denn für diese Seiten als Aktion angegeben, wenn man nicht eingeloggt ist?
Verwendest Du im Template {content} oder {AdvancedContent} ?
Für einige Frontend-Funktionen (wie z.B. die Feu-Access-Geschichte) muss der {AdvancedContent} Tag verwendet werden, da der reguläre {content} Tag ja nicht über entsprechende Funktionen verfügt.

Weitere Module sind dazu nicht nötig.
Last edited by NaN on Tue Aug 03, 2010 6:00 pm, edited 1 time in total.
NashBridges
Forum Members
Forum Members
Posts: 75
Joined: Sun Jun 15, 2008 2:29 pm

Re: Anleitung: geschützte Seiten mit AdvancedContent und FrontEndUsers

Post by NashBridges »

ha das wars!! hatte im template {content} stehen... :)

du das bedeutet aber, daß man zb inhalte für sidebars etc nicht nach berechtigungen anzeigen kann oder? ist nicht so wichtig, wär aber vll eine gute erweiterung!
in der zwischenzeit lassen sich diese dinge ja auch über globalcontentblocks u.ä. in den seiten direkt regeln, muß man eben das template umbauen, ist ja kein problem an sich...

was is eigentlich feu-access?? (hatte mit den ganzen feu zeugs noch nix zu tun vorher)

vielen dank!!
lg
Last edited by NashBridges on Tue Aug 03, 2010 6:25 pm, edited 1 time in total.
NaN

Re: Anleitung: geschützte Seiten mit AdvancedContent und FrontEndUsers

Post by NaN »

NashBridges wrote:
du das bedeutet aber, daß man zb inhalte für sidebars etc nicht nach berechtigungen anzeigen kann oder?
Daran arbeite ich noch ;)
NashBridges wrote:
was is eigentlich feu-access?? (hatte mit den ganzen feu zeugs noch nix zu tun vorher)
Feu = FrontEndUsers ( = das Modul für die Userverwaltung)
Access = Zugriff

Und jetzt einfach eins und eins zusammenzählen ;)

FEU-Access heißt die Inhalts-Eigenschaft, die mit dem Inhaltstyp "AdvancedContent" hinzukommt, und steuert welche FrontEndUser Zugriff auf die Seiten haben.
Ist dort eine Gruppe ausgewählt, werden, wenn man nicht eingeloggt ist, die darunter angegebenen Aktionen ausgeführt.
Last edited by NaN on Tue Aug 03, 2010 6:28 pm, edited 1 time in total.
NashBridges
Forum Members
Forum Members
Posts: 75
Joined: Sun Jun 15, 2008 2:29 pm

Re: Anleitung: geschützte Seiten mit AdvancedContent und FrontEndUsers

Post by NashBridges »

ok danke, alles klar! dachte das is wieder so ein eigenes modul, gibt ja einige feu-module :)

hey, weltklasse arbeit, das ich echt mal ein wirklich nützliches modul!!!!!
danke
nockenfell
Power Poster
Power Poster
Posts: 751
Joined: Fri Sep 12, 2008 2:34 pm

Re: Anleitung: geschützte Seiten mit AdvancedContent und FrontEndUsers

Post by nockenfell »

Ich habe in der Anleitung ein Hinweis erfasst, dass der {AdvancedContent} Tag im Template eingesetzt werden muss.
[this message is written with 100% recycled bits]
nockenfell
Power Poster
Power Poster
Posts: 751
Joined: Fri Sep 12, 2008 2:34 pm

Re: Anleitung: geschützte Seiten mit AdvancedContent und FrontEndUsers

Post by nockenfell »

Die Anleitung wird in einem neuen Thread weitergeführt und aktualisiert:
http://forum.cmsmadesimple.de/viewtopic ... 1134#p1134
[this message is written with 100% recycled bits]
Post Reply

Return to “Module und Tags”