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.
Template anpassen
Damit die Inhalte auf der Seite nicht angezeigt werden, müssen alle {content} Tags durch
Code: Select all
{AdvancedContent}
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;
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}
Folgender Code wird nach dem {if $count > 0} eingefügt:
Code: Select all
{feuShowMenu nodelist=$nodelist assign='feuNodeList'}
Code: Select all
{foreach from=$feuNodeList item=node}
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