UserOption & PageMenü

  • Moin,

    Gibt es eine Möglichkeit, wie ich statt den Permissions im ACP bestimmen kann, wer welchen Menüpunkt sieht, der User in seinen Einstellungen selbst bestimmen kann, was er sehen will?

    Ich weiß nur, wie ich Inhalte dem User bestimmen lassen kann welche in einem Template stehen, also mit {if $__wcf->user->getUserOption('showXYZ')} Bla Bla{/if}, aber ein Menüpunkt erstelle ich nicht mit einem Template, sondern im Normalfall mit der pageMenu.xml


    ~LG Fabi

  • Du kannst im XML der pageMenu.xml Permissions angeben, welche der Benutzer haben muss, um den Menüpunkt sehen zu können. Hier ein Beispiel aus dem WCF:

    XML
    <pagemenuitem name="wcf.user.usersOnline">
    			<controller><![CDATA[wcf\page\UsersOnlineListPage]]></controller>
    			<position>header</position>
    			<parent>wcf.user.members</parent>
    			<permissions>user.profile.canViewUsersOnlineList</permissions>
    			<options>module_users_online</options>
    		</pagemenuitem>

    Edit: Sorry, nicht richtig gelesen. Du willst, dass der Benutzer selbst bestimmen kann, welche Menüpunkte er angezeigt bekommt? Dafür gibt es glaube ich keine Abstraktion und du müsstest die Logik dafür selbst implementieren.

  • Wofür genau willst du diese Funktion denn haben? Für dein eigenes Plugin oder allgemein, sodass ein Benutzer beispielsweise auch sagen kann, dass er den Forum Tab nicht mehr sehen möchte?

  • Rein durch das ausblenden des Menüpunkts ist es dann aber nicht getan. Ich nehme an, dass du dann auch gerne auf dem Dashboard alle Boxen, welche Inhalte einer Anwendung enthalten, die der Benutzer nicht nutzen/sehen möchte, nicht angezeigt werden sollen. Das macht das ganze Thema ungemein komplexer.

    Wenn es rein um das individuelle Ausblenden der Menüpunkte geht, kann das leicht mit einem Plugin eingebaut werden. Ich denke aber nicht, dass WoltLab eine solche Funktion von Haus aus ausliefern wird.

  • Nur das individuelle reine Ausblenden der Menüpunkte. Das Dashboard wird bei mir außer den Internen News und der Slideshow für nichts anderes verwendet.

    Wenn ich eine Permission <permissions>user.xyz.canView</permissions> im Menüpunkt hab, brauch ich dazu ja auch die userGroupOption.xml mit

    Code
    <option name="user.xyz.canView">
    				<categoryname>user.xyz</categoryname>
    				<optiontype>boolean</optiontype>
    				<defaultvalue>1</defaultvalue>
    			</option>

    Eine Option in den Einstellungen braucht die userOption - und das ganze damit zu lösen wäre halt echt nice

    kann das leicht mit einem Plugin eingebaut werden

    Und das ginge dann wie?

  • Du musst unterscheiden: Eine Permission ist etwas, was in Benutzergruppen durch den Administrator vergeben wird. Permissions werden mit dem UserGroupOption PIP angelegt. Damit kannst du dann Permissions anlegen, mit welchen der Administrator pro Benutzergruppe einstellen kann, ob diese das Forum, die Galerie, die Filebase oder eben dein Plugin nutzen darf beziehungsweise nutzen kann.

    Was du aber willst, ist dass der Benutzer individuell festlegen kann, was er sehen will. Das macht man mit dem UserOption PIP, welches wie in Beitrag #3 von dir angegeben in den Settings des Benutzers eine Option hinzufügt, welche der Benutzer einstellen kann.

    Ein grober Leitfaden für ein Plugin, mit welchem Benutzer individuell die Menüpunkte anzeigen lassen können, sieht wie folgt aus:

    • Eine UserGroupOption, mit welcher der Administrator festlegen kann, welche Benutzer das Feature nutzen können
    • Eine UserOption, welche bei <permissions> die unter 1. angelegte UserGroupOption stehen hat
    • Die unter 2. angelegte UserOption braucht einen speziellen UserOptionType, da es einen zum Auswählen von Menüpunkten noch nicht gibt. Diesen UserOptionType legt man unter wcf\system\option an. Orientiere dich an oder erweitere den MultiSelectOptionType
    • Lege einen TemplateListener an, welcher im Template headInclude auf das Event stylesheets reagiert. Dort fügst du CSS ein, welches entsprechend der vom Benutzer festgelegten Werte die Menüpunkte ausblendet
      CSS
      #mainMenu li[data-menu-item="wbb.header.menu.board"] {
          display: none !important;
      }

    Das ist natürlich nur ein von mir spontan ausgedachtes vorgehen. An der einen oder anderen Stelle wirst du dir wahrscheinlich noch mal ein paar Gedanken machen müssen. Falls du irgendwo nicht weiter kommst, kannst du hier ja nachfragen.

  • Über die Namen und Texte lässt sich streiten, aber es funktioniert :thumbup:


    Nachtrag: Wie aber mache ich es, wenn ich ein neues Plugin installiere welches eine Seite ist oder hat, nicht jedes mal mein Hide Plugin ändern / erweitern muss?
    Ich schätze, hier muss ich mit der Datenbank arbeiten?

  • Genau. In der UserOption Klasse, welche du in Punkt 3 erstellt hast, fragst du alle Menü Punkte (nur die aus dem Header Menü) ab und zeigst diese dem Benutzer zur Auswahl an. Im Template Listener iterierst du über die Auswahl des Benutzers und fügst den entsprechenden CSS Code dynamisch ein.

  • Aso... ähm... Ich hab keine option Klasse... das in #10 angehängte Plugin funktioniert mit einer userOption.xml und die Punkte sind alle manuell eingefügt , demzufolge hab ich keine Ahnung wie das mit einer klasse funktionieren soll :/

    Code
    <option name="hideBoard">
                    <categoryname>settings.hide.hide</categoryname>
                    <optiontype>boolean</optiontype>
                    <visible>1</visible>
                    <editable>1</editable>
                    <defaultvalue>0</defaultvalue>
    		<permissions>user.profile.hide.canHideBoard</permissions>
                </option>
  • Hast du dir \wcf\system\option\MultiSelectOptionType schon angeschaut? Du brauchst im Grunde nur die Klasse erweitern und dann die entsprechende Methode überschreiben, welche die zur Verfügung stehenden Werte ausliest.

  • Die Option Type Klasse definiert, wie die Option im Formular angezeigt wird (du hast aktuell den BooleanOptionType, daher ist es eine Checkbox), welche Werte zur Auswahl stehen und wie die Benutzereingabe verarbeitet werden soll.

    Was du möchtest, ist eine Möglichkeit, dass der Benutzer für mehrere Werte (den Menü Punkten) jeweils wählen kann, ob dieser angezeigt oder nicht angezeigt werden soll. Der MultiSelectOptionType ist genau dafür da. Du musst diese Option Type erweitern (nennen wir es beispielsweise mal PageMenuMultiSelectOptionType). In der userOption.xml gibst du dann bei deiner Option bei <optiontype>boolean</optiontype> anstelle von boolean entsprechend pageMenuMultiSelect an. Damit weiß das WCF, dass es für diese Option die von dir angelegte Klasse zur Darstellung und Verarbeitung verwenden soll.

    In deiner PageMenuMultiSelectOptionType musst du nun die Methode protected function getSelectOptions(Option $option) überschreiben. Die Methode wird ursprünglich im RadioButtonOptionType definiert. Diese Methode gibt zurück, welche Werte dem Benutzer zur Auswahl angezeigt werden sollen.

    In der Methode erstellst du dir ein PageMenuItemList Objekt, übergibst an den Condition Builder, dass du nur Header Items möchtest (es gibt ja auch Footer Page Menu Items) und auch nur jene, bei welchen parentMenuItem leer ist. Dann lässt du dir die Liste von Objekten geben. Die Methode getSelectOptions muss dann ein Array zurückgeben, wobei die Keys des Arrays die internen Namen der Menüpunkte sind und die Values das, was der Benutzer angezeigt bekommen. Beispielsweise gibt deine Methode getSelectOptions in deiner Klasse PageMenuMultiSelectOptionType dann nachfolgendes Array zurück:

    Key => Value
    wbb.header.menu.board => Forum
    wcf.user.members => Mitglieder
    wcf.user.dashboard => Dashboard

  • Ich hab wirklich großen Respekt vor dir und finde es toll, dass du mir helfen willst, doch für mich als Anfänger nicht gerade leicht.

    Mal Schritt für Schritt:

    Ich erstelle eine klasse im Ordner /files/lib/system/option mit dem Namen PageMenuMultiSelectOptionType.class.php

    beginnend mit <?php namespace wcf\system\option;

    Die klasse wird mit der MultiSelectOptionType klasse erweitert class PageMenuMultiSelectOptionType extends MultiSelectOptionType { }

    Jetzt kommt der Teil wo's hackt... Die Funktion überschreiben


    Code
    protected function getSelectOptions(Option $option){
    
    
    
    
        }


    Dazwischen muss ich jetzt irgendwie ein PageMenuItemList erstellen und an den Condition Builder übergeben. Ich hab mich damit noch nie befasst, weshalb ich auch nicht weiß wie ich da rann gehen muss :/

  • doch für mich als Anfänger nicht gerade leicht.

    Kein Problem. Ich denke, um zu lernen, ist es am sinnvollsten man zeigt dir grob den Weg und du versuchst diesen abzuarbeiten. Wo du nicht weiter kommst, fragst du nach.

    Nutzt du eine IDE? Eclipse oder Netbeans beispielsweise?

    Bezüglich der Option hast du schon das richtige Grundgerüst. Im TODO steht, wie es weiter geht.

  • Ich nutze atm PHPStorm in der Testversion, da ich aber Schüler bzw. Berufsschüler bin, kann ich mir denke ich die "Schulversion" zulegen die nix kostet. Muss mir jedoch mein Schülerausweis wieder holen weil ich den verschlampt hab :whistling:

    Gibt es ein Beispiel Plugin bzw. ein Beispiel auf GitHub an die ich mich richten kann? in der PageMenuItemList.class.php, die verwendet werden soll, steht ja nicht wirklich viel drinn...

  • in der PageMenuItemList.class.php, die verwendet werden soll, steht ja nicht wirklich viel drinn...

    In wie weit ist dir Objektorientierte Programmierung beziehungsweise Vererbung ein Begriff? Falls nicht, müsstest du vermutlich erst mal die Basics in der Richtung lernen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!