Author Topic: GenerateNavigation - Klasse um Menüs zu generieren (Bootstrap Menüs auch möglich  (Read 5672 times)

Offline Onur Sahin

  • Posts: 77
  • Gender: Male
  • wbSecure Author
    • onur-sahin.de
Hallo,

ich wollte mein Codesnippet eigentlich in "Unterstützung zu Droplets & Snippets" veröffentlichen aber dort stand in der Beschreibung "Hier bitte keine neuen Droplets oder Snippets veröffentlichen! " was mich ziemlich verwundert hat. Hoffe das es wenigstens hier ok ist.

Wie die Überschrift schon verrät ist es sowas wie show_menu. Ich versuche nicht Show_Menu2 zu ersetzen. Es soll eine Alternative darstellen und vielleicht kommen damit andere besser zu Recht. Die Standard Bootstrap Navigation soll auch möglich sein (Auch mit Unterpunkten)

Eine Github Seite existiert für dieses Projekt:
https://github.com/onur-sahin-de/GenerateNavigation

Auf der Github Seite werde ich die Dokumentation noch erweitern nur schaffe ich es zur Zeit gerade nicht. Aber guckt euch die Klasse in der include.php an. Vieles ist eigentlich selbsterklärend und 2 Beispiele gibt es auch schon auf der Github-Seite.

Über Feedback würde ich mich freuen.

lg,
Onur
« Last Edit: April 23, 2015, 11:39:44 PM by DarkViper »

Offline DarkViper

  • Forum administrator
  • *****
  • Posts: 3021
  • Gender: Female
Hallo Onur,
sieht vom Prinzip nicht schlecht aus. Allerdings vermisse ich zwei wichtige Dinge:
Zum einen fehlt jegliche Kommentierung des Codes, so dass bei Änderungen etc. jedesmal der Code an sich analysiert werden muss um sinnvoll eingreifen zu können. Ist aber längst nicht so wichtig wie der 2. Punkt, der 'lebensnotwendig' ist:
Ich vermisse zu 100% komplett die Zugriffskontrolle. Was nichts anderes bedeutet, dass sowohl der unangemeldete Gast sowie auch der 'Superadmin' grundsätzlich alle Seiten zu sehen bekommt. Die eingestellten Rechte der Seiten werden vollständig ignoriert. Alleine dieser letzte Punkt macht den Menügenerator im aktuellen Zustand leider praktisch komplett unbrauchbar (Es gibt Seiten, die alle sehen dürfen, welche die nur registrierte User zu Gesicht bekommen, welche die nur ausgewählte User sehen oder gar nur Admins oder nur der Superadmin... und gleiches gilt selbstverständlich auch noch für Usergruppen... und das sollte sich natürlich auch im Menü auswirken). SM2 ist nicht ganz umsonst so komplex. ;-) Zumindest die wichtigsten Grundfunktionalität en sollten bzw. müssen schon vorhanden sein.

LG,
Manuela
Der blaue Planet - er ist nicht unser Eigentum - wir haben ihn nur von unseren Nachkommen geliehen

"You have to take the men as they are… but you can not leave them like that !" :-P
Das tägliche Stoßgebet: Oh Herr, wirf Hirn vom Himmel !

Offline Onur Sahin

  • Posts: 77
  • Gender: Male
  • wbSecure Author
    • onur-sahin.de
Alles klar ich check das nochmal ab und verbessere es dann :-)

Offline Onur Sahin

  • Posts: 77
  • Gender: Male
  • wbSecure Author
    • onur-sahin.de
So damit ich weitermachen kann bin ich auf Hilfe angewiesen.

Wir müssten mal auf die Berechtigungen genauer eingehen



1)
  • Öffentlich = Die Seite kann jeder sehen
  • Privat = Welcher User ist unter Privat einzuordnen? Wie kann ich ermitteln ob der User "privat" ist? Brauche dazu ein Codesnippet
  • Registriert = Die Seite können registrierte User einer Seite sehen welches ein Login erfordert? Brauche dazu ebenfalls ein Codesnippet um diese Art von User zu ermitteln
  • Versteckt = Ich vermute mal das egal welcher User aktiv ist diese Seite IMMER unsichtbar bleibt sprich nicht als Link generiert wird. Sehe ich das so richtig?
  • Inwiefern unterscheidet sich "Keine" von "Versteckt"?

2)
  • Öffentlich = Jede Art von User sieht diese Seite
  • Privat = Private User können private Seiten sehen und öffentliche Seiten
  • Registriert = Registrierte User können Seiten sehen die einen Login erfordern + öffentliche Seiten
  • Versteckt = Kein User sieht diese Seite
  • "Keine" ist wie oben angegeben unklar...

Bitte 1) beantworten wie die technische Identifaktion der User erfolgt 2) Welche Art von User welche Seite sehen darf (Sichtbarkeitsstufe)

Wenn mir diese beiden Aspekte klar sind kann ich sofort mit der Bug-Beseitigung anfangen. Ich danke im Vorraus

lg,
Onur
« Last Edit: April 22, 2015, 07:13:30 PM by Onur Sahin »


Offline Onur Sahin

  • Posts: 77
  • Gender: Male
  • wbSecure Author
    • onur-sahin.de
@Yetiie

Danke dir.

Wäre cool wenn die Core Entwickler auf meine technischen Fragen eingehen könnten da die Dokumentation meiner Meinung nach leider nicht gerade informativ ist. Würde den Prozess beschleunigen ansonsten müsste ich es selber mühsam suchen und testen. Danke euch im Vorraus.

Offline Luisehahne

  • WebsiteBaker Org e.V.
  • **
  • Posts: 4359
  • Gender: Male
    • Webdesign und Entwicklung WebsiteBaker
Denke DarkViper wird dir gleich antworten. Wir hatten uns darüber unterhalten. Ich möchte nichts verkehrtes erzählen.

Vorab die 'Option "keine" bedeuted, wenn du im Frontend versucht diese Seite aufzurufen die Meldung "Sie sind nicht berechtigt, diese Seite zu sehen" angezeigt wird.

Versteckte Seiten werden ebenfalls im Menu nicht angezeigt, lassen sich aber mit dem Droplet Section Picker anzeigen oder in der Sitemap mit SM2_SHOWHIDDEN auflisten.

Option "private" musst der Anwender eingeloggt sein um den Eintrag im Menu zu sehen.
Option "registered" wird im Menu angezeigt. Wenn der Anwender nicht eingeloggt ist, wird er beim Click darauf zur Loginmaske weitergeleitet.

Ich hoffe, dass ich das richtig erklärt habe, sonst möge Manu es korrigieren.

Dietmar
« Last Edit: April 22, 2015, 09:54:47 PM by Luisehahne »
Immer nur von der Zukunft reden, die Gegenwart vergessen und auf die Vergangenheit schimpfen
Neues Unwort: Schnappatmung

Offline DarkViper

  • Forum administrator
  • *****
  • Posts: 3021
  • Gender: Female
So damit ich weitermachen kann bin ich auf Hilfe angewiesen.
Wir müssten mal auf die Berechtigungen genauer eingehen

Bitte 1) beantworten wie die technische Identifaktion der User erfolgt 2) Welche Art von User welche Seite sehen darf (Sichtbarkeitsstufe)

Wenn mir diese beiden Aspekte klar sind kann ich sofort mit der Bug-Beseitigung anfangen. Ich danke im Vorraus
Versuch mers mal zu beantworten.. ;-)

Das Kapitel 'Recht zum Sehen einer Seite' ist etwas komplex und umfasst mehr als nur das 'visibility'-Dropdown.
Da muss grundsätzlich erst einmal zwischen derAnzeige der jeweiligen Menüeinträge und den eigentlichen Seiten unterschieden werden.
Im Fall eines Menüs dreht es sich nur um die Anzeige der Menüpunkte.


PUBLIC => der Menüeintrag kann grundsätzlich immer und jedem angezeigt werden


REGISTERED => der Menüeintrag kann grundsätzlich immer und jedem angezeigt werden (Wird die Seite aufgerufen, fordert WB automatisch ein Login an)


PRIVATE => der Menüeintrag wird nur Usern angezeigt, die angemeldet sind und zusätzlich die Berechtigung zum Sehen der Seite haben. Zusätzlich noch alle User, die für diese Seite Adminrechte haben.


HIDDEN =>  der Menüeintrag wird im Normalfall nie angezeigt. Die Rechte sind wie bei PUBLIC. HIDDEN-Seiten werden in der Regel benutzt um sie aus dem Menü herauszunehmen, andererseits jedoch die Möglichkeit zu bieten, sie per Sectionpicker oder [WBLINKxxx] in 'normalen' Seiten zu verlinken (Diese Methode wird auf der WB-Homepage z.B. zur Einbindung ein und derselben Downloadgalerie in den verschiedenen Sprachen verwendet).


NONE => Dieser Menüeintrag wird nur Usern angezeigt, die angemeldet sind und zusätzlich für diese Seite Adminrechte haben. Die Seite kann jedoch von niemandem aufgerufen werden.
Der Parameter 'NONE' ist derzeit noch unvollständig umgesetzt und sollte noch nicht verwendet werden.  Auch SM2 berücksichtigt diesen Eintrag derzeit noch nicht.

Für 'public' und 'registered' ist die Sache ja klar. Die können immer angezeigt werden (die Menüpunkte!!).
Am interessantesten ist es bei 'private'. Da sind einige Abfragen erforderlich.
Bevor wir damit anfangen, erst noch eine kleine Korrektur an der derzeitigen Klasse GenerateNavigation.
Bitte keine globalen Variablen aus einer Klasse heraus aufrufen bzw. importieren (z.B. global $database;), das bricht die Datenkapselung der Klasse auf, ein absolutes NoGo in der objektorientierten Programmierung. Fremddaten müssen immer explizit an eine Klasse übergeben werden. Das 'aber wie dann einbinden?' kommt jetzt sofort..

Erst mal brauchen wir in der Klasse 2 zusätzliche, klassenglobale Variablen sowie 4 zusätzliche Klassenkonstanten und dazu einen passenden Konstruktor.
Code: [Select]
<?php

const PAGE_ADMIN_GROUPS 'admin_groups';
const 
PAGE_ADMIN_USERS  'admin_users';
const 
PAGE_VIEW_GROUPS  'viewing_groups';
const 
PAGE_VIEW_USERS   'viewing_users';

protected 
$oDb  null;
protected 
$oApp null;

public function 
__construct(wb $oApplicationdatabase $database)
{
    
$this->$oApp $oApplication;
    
$this->$oDb  $database;
}

// Erzeugen einer neuen Instanz:

$oMyMenu = new GenerateNavigation($wb$database);

Hier werden der Instanz das Frontendobjekt und das Datenbankobjekt übergeben.
(und schon sind die 'global $database' Probleme beseitigt. Speicherverbrauch spielt keine Rolle, da Objekte grundsätzlich automatisch 'ByReference' übergeben werden.

Jetzt die Abfrage für 'PRIVATE'. Dazu benutzen wir diverse Methoden aus der Klasse wb, die hier durch das Objekt $this->oApp zur Verfügung gestellt werden.

Code: [Select]
<?php

if ($this->oApp->is_authenticated()) {
    
// current user is logged in
    
if (
        
// is user in a group which is listed in PAGE_VIEW_GROUPS ?
        
$this->oApp->ami_group_member($row[self::PAGE_VIEW_GROUPS]) ||
        
// is user in the list of PAGE_VIEW_USERS ?
        
$this->oApp->is_group_match($this->oApp->get_user_id(), $row[self::PAGE_VIEW_USERS]) ||
        
// is user in a group which is listed in PAGE_ADMIN_GROUPS ?
        
$this->oApp->ami_group_member($row[self::PAGE_ADMIN_GROUPS]) ||
        
// is user in the list of PAGE_ADMIN_USERS ?
        
$this->oApp->is_group_match($this->oApp->get_user_id(), $row[self::PAGE_ADMIN_USERS])
    ) {
//  ok, current user can see this entry
    
}
}

Damit wäre jetzt also der wichtigste Teil des Code 'erschlagen'.

'HIDDEN' und 'NONE' sind im Prinzip identisch, nur dass NONE-Seiten nicht aufgerufen werden können..

Achtung: Wird ein Element nicht angezeigt, dann dürfen auch dessen Kinder und Enkel nicht mehr angezeigt werden, ganz egal, welche Sichtbarkeit diese haben.
Ist eigentlich ganz normale, hierarchische Regel: Fällt ein Elternelement aus, verlieren dessen Kinder ihren Ankerpunkt und verschwinden ebenfalls.

Ich hoffe, dass diese Erklärungen und Beispiele etwas weiterhelfen.

Manuela
« Last Edit: April 23, 2015, 01:50:27 PM by DarkViper »
Der blaue Planet - er ist nicht unser Eigentum - wir haben ihn nur von unseren Nachkommen geliehen

"You have to take the men as they are… but you can not leave them like that !" :-P
Das tägliche Stoßgebet: Oh Herr, wirf Hirn vom Himmel !

Offline Onur Sahin

  • Posts: 77
  • Gender: Male
  • wbSecure Author
    • onur-sahin.de
Vielen Dank für die Antwort Manuela! Das hilft mir schon um einiges.

Ich glaube dir ist ein kleiner Fehler unterlaufen. Du meintest den Code bezüglich des Konstruktors wie folgt:

Code: [Select]
protected $oDb  = null;
protected $oApp = null;

public function __construct(wb $oApplication, database $database) {
$this->oApp = $oApplication;
$this->oDb  = $database;
}

An den Rest versuche ich mich dann und hoffe das ich das dann mit deiner Info hinbekomme.

lg,
Onur

Offline DarkViper

  • Forum administrator
  • *****
  • Posts: 3021
  • Gender: Female
*gg* typischer Typo bei mir morgens um eins...

2 Dinge habe ich im letzten Post noch nicht berücksichtigt:

  • die Visibility 'DELETED' ist noch nicht berücksichtigt
  • Inaktive Seiten (die keine aktive Sections enthalten) sind ebenfalls noch nicht berücksichtigt.

Für letzteren Punkt gibt es ebenfalls bereits eine fertige Methode, die benutzt werden kann:

$bPageIsActive = $this->$oApp->page_is_active($row);

hiermit werden alle in der Seite enthaltenen Sections überprüft, ob wenigstens eine aktiv und im Veröffentlichungs - Zeitfenster ist. Über Sectionpicker eingebundene Sections werden nicht rekursiv verfolgt.

Manuela
Der blaue Planet - er ist nicht unser Eigentum - wir haben ihn nur von unseren Nachkommen geliehen

"You have to take the men as they are… but you can not leave them like that !" :-P
Das tägliche Stoßgebet: Oh Herr, wirf Hirn vom Himmel !

Offline Onur Sahin

  • Posts: 77
  • Gender: Male
  • wbSecure Author
    • onur-sahin.de
Komisch ich kann irgendwie meinen Beitrag nicht mehr editieren.

Auf jeden Fall hat sich die URL zum Projekt geändert: https://github.com/onur-sahin-de/GenerateNavigation
Könnte man das nochmal ganz oben editieren? done

Manuela wenn du Lust hast schau nochmal in den Code rein. Die Zugriffskontrolle sollte jetzt hoffentlich richtig implementiert sein! :-)

Ich werde auf jeden Fall noch eine Doku einbauen.
« Last Edit: April 23, 2015, 11:40:28 PM by DarkViper »

Offline Onur Sahin

  • Posts: 77
  • Gender: Male
  • wbSecure Author
    • onur-sahin.de
Dokumentations-Update

Wenn ihr das Codesnippet installiert habt könnt ihr unter Erweiterungen -> Module ->Details zum Modul -> GenerateNavigation auf den Dokumentations-Link klicken

Offline Onur Sahin

  • Posts: 77
  • Gender: Male
  • wbSecure Author
    • onur-sahin.de
Könnte man das schon als Addon auf der WB Seite anbieten oder muss von der Qualität noch was verbessert werden?