Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 24. Januar 2012 21:34

ampelmann
probiert CMS/ms aus
Registriert: 24. Januar 2012
Beiträge: 35

Menü nur bei angemeldeten Benutzern zeigen

Hallo liebe Experten,

ich benutze CMSMS V. 1.10 und habe das schöne Modul 'AdvancedContent' sowie FrontEndUsers installiert.

Es gibt im Layout eine horizontale Top-Navigation, welche alle Seiten anzeigt.

Nun möchte ich aber eingeloggten Benutzern über eine vertikale Sidebar-Navigation nur solche Seiten anzeigen, auf die ich in "Erweiterte Einstellungen" den Frontend-Zugriff auf eine Benutzergruppe festgelegt habe.

Das vertikale Menü anzuzeigen, wenn der Benutzer angemeldet ist, kann ich. Aber wie filtere ich die $nodelist auf eine bestimmte Benutzergruppe?

Wie ist die Lösung?

Danke
Ampelmann

Offline

#2 25. Januar 2012 23:58

Janl
Server-Pate
Ort: Freistadt, Österreich
Registriert: 13. Dezember 2010
Beiträge: 1.231
Webseite

Re: Menü nur bei angemeldeten Benutzern zeigen

Hi,

Wenn die Seite bearbeitet wird, kann man bei Tab Hauptmenü, Inhaltstyp angeben "Geschützter Inhalt" und dann bei Tab "Berechtigungen" welche Gruppe(n) diese Seite sehen dürfen.

M.fr.Gr.
Jan


Kubuntu 22.04 - Win 11 pro / Kubuntu 20.04  - win10 pro

Offline

#3 25. Januar 2012 06:42

nockenfell
Moderator
Ort: Gontenschwil, Schweiz
Registriert: 09. November 2010
Beiträge: 2.934
Webseite

Re: Menü nur bei angemeldeten Benutzern zeigen

Diesen Wunsch kannst du nicht so ohne weiteres umsetzen. Um dies zu machen, müsstest du die Nodelist manipulieren. Eine Beispiel dazu findest du hier:
http://www.cmsmadesimple.de/forum/viewtopic.php?id=156

Falls du was von PHP verstehst, kannst du damit selber was programmieren (ist nicht sehr preformant, sollte aber funktionieren)


[dieser Beitrag wurde mit 100% recycled bits geschrieben]
Mein Blog  /   Diverse Links rund um CMS Made Simple
Module: btAdminer, ToolBox

Offline

#4 25. Januar 2012 20:56

ampelmann
probiert CMS/ms aus
Registriert: 24. Januar 2012
Beiträge: 35

Re: Menü nur bei angemeldeten Benutzern zeigen

Danke für die Anwort!

nockenfell schrieb:

Um dies zu machen, müsstest du die Nodelist manipulieren. Eine Beispiel dazu findest du hier:
http://www.cmsmadesimple.de/forum/viewtopic.php?id=156

Ich bekomme eine Fehlermeldung aus dem UDT: Fatal error: Call to a member function Execute() on a non-object in C:\xampp\htdocs\testseite\lib\classes\class.usertagoperations.inc.php(260) : eval()'d code on line 73

Die betreffende Codezeile aus dem UDT:

71: $sql = "select content_id, prop_name, content from ".cms_db_prefix()."content_props where prop_name = 'feu_access'";
72: $db = cmsms()->db;
73: $dbresult = $db->Execute($sql);

Hast Du eine Idee, warum die Abfrage scheitert?

Edit: Ich habe $db = cmsms()->db; ersetzt durch:

global $gCms;
...
$db =& $gCms->GetDB();

So gibt es keine Fehlermeldung mehr.

Beitrag geändert von ampelmann (25. Januar 2012 21:23)

Offline

#5 25. Januar 2012 21:47

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.437

Re: Menü nur bei angemeldeten Benutzern zeigen


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#6 25. Januar 2012 21:48

Andynium
Moderator
Ort: Dohna / SN / Deutschland
Registriert: 13. September 2010
Beiträge: 7.018
Webseite

Re: Menü nur bei angemeldeten Benutzern zeigen

ampelmann schrieb:

Die betreffende Codezeile aus dem UDT:

71: $sql = "select content_id, prop_name, content from ".cms_db_prefix()."content_props where prop_name = 'feu_access'";
72: $db = cmsms()->db;
73: $dbresult = $db->Execute($sql);

Hast Du eine Idee, warum die Abfrage scheitert?

Schau mal hier wink

http://www.cmsmadesimple.de/forum/viewtopic.php?id=1452

Offline

#7 25. Januar 2012 22:11

ampelmann
probiert CMS/ms aus
Registriert: 24. Januar 2012
Beiträge: 35

Re: Menü nur bei angemeldeten Benutzern zeigen

Vielen Dank für die Tipps: nockenfell, NaN und cyberman.

Ich bin von der Performance von php ja grundsätzlich beeindruckt, ich komme von .net und sql-server...

Doch wie kann der code geändert werden, um nur noch die geschützten Seiten in der nodelist zu haben?
Und habt Ihr da empfehlenswerte Lektüre für den Um- bzw. Einsteiger in php + smarty?

// UDT feuShowMenu written by Nockenfell 12.2010

// Funktionen

if(!function_exists('btGetFeuGroups')) {
    function btGetFeuGroups() { 
        $feusers = cms_utils::get_module('FrontEndUsers');
    $user_id = $feusers->LoggedInId();
    
        // Alle Gruppen einlesen zu welchen der eingeloggte Benutzer gehört
        $groups = $feusers->GetMemberGroupsArray($user_id);

        $gns = array();
        if($groups !== false ) {
            foreach( $groups as $gid ) {
                $gns[] = $gid['groupid'];
            }
        }
        return $gns;
    }
}

if(!function_exists('btGetFeuAccess')) {
    function btGetFeuAccess($id) {
        $gns = btGetFeuGroups();
        $btFeuAccess = cms_utils::get_app_data('btFeuAccess');
        $feuAccess = $btFeuAccess[$id];
        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;
}

// Seiten mit feu_access Eintrag auslesen

$sql = "select content_id, prop_name, content from ".cms_db_prefix()."content_props where prop_name = 'feu_access'";
$db = &cmsms()->GetDb();
$dbresult = $db->Execute($sql);
$btFeuAccess = Array();
while ($dbresult && $row = $dbresult->FetchRow())
        $btFeuAccess[$row['content_id']] = $row['content'];
cms_utils::set_app_data('btFeuAccess',$btFeuAccess);

$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);


// Assign des Rückgabewertes
if(isset($params['assign'])) 
    $smarty->assign(trim($params['assign']), $modnodelist );
else
    return $modnodelist;

Offline

#8 26. Januar 2012 23:21

Andynium
Moderator
Ort: Dohna / SN / Deutschland
Registriert: 13. September 2010
Beiträge: 7.018
Webseite

Re: Menü nur bei angemeldeten Benutzern zeigen

ampelmann schrieb:

Und habt Ihr da empfehlenswerte Lektüre für den Um- bzw. Einsteiger in php + smarty?

http://www.amazon.de/PHP-MySQL-Schritt- … 932&sr=8-1
http://www.packtpub.com/smarty/book

Offline