Ergebnis 1 bis 25 von 25

Thema: Backend-Menu-Entry - fehlerhafte Darstellung für Redakteur

  1. #1
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard Backend-Menu-Entry - fehlerhafte Darstellung für Redakteur

    Guten Tag liebe Community,

    ich habe erneut ein Problem in Contao44 / Contao49.

    Ich habe eine Art Core-Bundle gebaut, welches andere Bundles lädt und diese über Einträge in der contao/config.php und den getUserNavigation - Hook im Backend darstellt.
    Diese Art der Darstellung funktioniert auch einwandfrei für Admin-User:
    img1.PNG


    Leider sieht das für Redakteur-Nutzer ohne Adminberechtigung anders aus:
    img2.PNG

    Woran könnte das liegen?
    Ich habe nirgends Berechtigungen vergeben oder abgefragt bzw. die Einreihung im Backend ist über die contao/config.php entstanden.

    Die Menüpunkte sind alle über Symfony-Routing entstanden.


    // PS. Bei mir funktioniert gerade das Einfügen der Bilddateien nicht richtig.
    Geändert von Fonjensi (18.11.2020 um 08:35 Uhr)

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.126
    Partner-ID
    10107

    Standard

    Nimm lieber das entsprechende Event, statt den Hook: https://docs.contao.org/dev/referenc...end-menu-build

  3. #3
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard

    Hey Spooky, das würde aber leider in Contao 4.4 nicht funktionieren, sowie ich das sehe.

    Und ich wollte die Erweiterung für Contao 4.4 und 4.9 kompatibel halten.

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.126
    Partner-ID
    10107

    Standard

    Brauchst du die Kompatibilität unbedingt? Contao 4.4 bekommt Bugfix Updates ja eh nur mehr bis Ende dieses Jahres

    Poste mal die Implementierung des Hooks.

  5. #5
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Brauchst du die Kompatibilität unbedingt? Contao 4.4 bekommt Bugfix Updates ja eh nur mehr bis Ende dieses Jahres

    Poste mal die Implementierung des Hooks.

    Die Kompatibilität wäre schon Top, da ich das gerne noch in ein paar alten Systemen einsetzen würde.
    Wenn es gar nicht anders geht, muss ich da wohl drauf verzichten, aber da gibt es sicher einen Weg

    Das ist der Hook selbst:

    PHP-Code:
    namespace Agentur1601com\CoreBundle\EventListener;

    use 
    Contao\CoreBundle\ServiceAnnotation\Hook;
    use 
    Symfony\Component\Routing\RouterInterface;
    /**
     * @Hook("getUserNavigation")
     */
    class GetUserNavigationListener
    {

        private 
    $_routerInterface;

        public function 
    __construct(RouterInterface $_routerInterface)
        {
            
    $this->_routerInterface $_routerInterface;
        }

        
    /**
         * @param array $modules
         * @param bool $showAll
         * @return array
         */
        
    public function __invoke(array $modulesbool $showAll): array
        {
            
    $modules['agentur1601com']['modules']['core'] = [
                
    'label' => 'Unterstützen',
                
    'title' => 'The core bundle',
                
    'class' => 'agentur1601com',
                
    'href' => $this->_routerInterface->generate('agentur1601com_core_backend'),
            ];

            return 
    $modules;
        }

    Das ist meine contao/config.php:

    PHP-Code:
    <?php

    // Backend menu
    array_insert($GLOBALS['BE_MOD'], array_search('system'array_keys($GLOBALS['BE_MOD'])) + 1, array
    (
        
    'agentur1601com' => [
            
    'core' => [

            ],
        ]
    ));


    // Hook for backend menu entry
    $GLOBALS['TL_HOOKS']['getUserNavigation'][] = ['Agentur1601com\\CoreBundle\\EventListener\\GetUserNavigationListener''__invoke'];

    // Load backend style sheet
    if (TL_MODE == "BE") {
        
    $GLOBALS['TL_CSS'][] = '/bundles/agentur1601comcore/css/be_core_style.css';
    }

    Und die services.yml:
    PHP-Code:
    services:
      
    _defaults:
        
    autoconfiguretrue
        autowire
    true

      Agentur1601com
    \CoreBundle\EventListener\GetUserNavigationListener:
        public: 
    true 

    Der Hook funktioniert ja, wird ja alles richtig dargestellt, aber eben nur als Admin-User.
    Als Non-Admin wirkt es so, als würde hier etwas nicht richtig dargestellt werden.
    Da fehlen auch Klassen im Styling und der html-Aufbau ist anders.

  6. #6
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.126
    Partner-ID
    10107

    Standard

    Hast du den regulären Backend Usern auch Zugriff auf das "core" Modul gegeben?

  7. #7
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Hast du den regulären Backend Usern auch Zugriff auf das "core" Modul gegeben?
    Autsch. Und dabei ist heute nicht mal Montag ..

    Danke Spooky, war mir wie immer ein Vergnügen mich hier zum Idioten zu machen

  8. #8
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard

    Hey Spooky,

    noch eine kleine Frage.

    Wenn ich alle Berechtigungen der Backend-Module meiner Erweiterungen abwähle, wird der Punkt trotzdem folgendermaßen im Backend dargestellt:
    img2.PNG

    Für mich wirkt es so, als würde dieser unabhängig der Berechtigungen über den GetUserNavigationHook erstellt.

    Kann ich das irgendwie eingrenzen, dass der Punkt nur erstellt wird, wenn der Nutzer auch über die richtigen Berechtigungen verfügt?

    Falls ja, was wäre hier dann best-practice? In der Hook selbst eine Abfrage stellen?

  9. #9
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.126
    Partner-ID
    10107

    Standard

    Zitat Zitat von Fonjensi Beitrag anzeigen
    Kann ich das irgendwie eingrenzen, dass der Punkt nur erstellt wird, wenn der Nutzer auch über die richtigen Berechtigungen verfügt?

    Falls ja, was wäre hier dann best-practice? In der Hook selbst eine Abfrage stellen?
    Ja, kannst du bzw. musst du. Da du leider mit Contao 4.4 kompatibel bleiben willst, musst du hier die Legacy Funktionen benutzen. Also bspw:
    PHP-Code:
    $user BackendUser::getInstance();

    if (
    $user->hasAccess('core''modules') {
        
    // …

    Übrigens würde ich das Modul nicht unbedingt "core" nennen, da das nicht besonders eindeutig ist.

  10. #10
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Ja, kannst du bzw. musst du. Da du leider mit Contao 4.4 kompatibel bleiben willst, musst du hier die Legacy Funktionen benutzen. Also bspw:
    PHP-Code:
    $user BackendUser::getInstance();

    if (
    $user->hasAccess('core''modules') {
        
    // …

    Übrigens würde ich das Modul nicht unbedingt "core" nennen, da das nicht besonders eindeutig ist.

    Verstehe, Danke für die Erklärung.
    Ja, die 4.4 Kompatibilität ist mir leider schon wichtig.

    Wie würdest du das Modul sonst nennen?
    Die Erweiterung selber trägt den Namen "core-bundle", deshalb fand ich core eigentlich passend.

    Hättest du einen Vorschlag? Bin da offen

  11. #11
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.126
    Partner-ID
    10107

    Standard

    Keine Ahnung, ich weiß ja nicht, was das Modul macht

  12. #12
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Keine Ahnung, ich weiß ja nicht, was das Modul macht
    Es ist quasi eine Art Kern-Modul, was den Oberpunkt für alle Backend-Menu-Entries für alle Erweiterungen darstellt.

    Bezüglich der Hook, wollte ich das nun so umsetzen, aber das würde mir dann einen Fehler generieren, weil hier nach einem Array als erster Parameter verlangt wird:

    PHP-Code:
        /**
         * @param array $modules
         * @param bool $showAll
         * @return array
         */
        
    public function __invoke(array $modulesbool $showAll): ?array
        {
            
    $user = \BackendUser::getInstance();

            if (
    $user->hasAccess('core''modules')) {
                
    $modules['agentur1601com']['modules']['core'] = [
                    
    'label' => 'Unterstützen',
                    
    'title' => 'The core bundle',
                    
    'class' => 'agentur1601com',
                    
    'href' => $this->_routerInterface->generate('agentur1601com_core_backend'),
                ];

                return 
    $modules;
            }

            return 
    null;
        } 

  13. #13
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.126
    Partner-ID
    10107

    Standard

    Dann mach halt ein Array draus

  14. #14
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Dann mach halt ein Array draus
    Aber wenn ich das mache, überschreibe ich mir über das leere Array die komplette Backend-Navigation und dann ist die leer

  15. #15
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.126
    Partner-ID
    10107

    Standard

    ? Nein, ich meinte:
    PHP-Code:
    $user->hasAccess(['core'], 'modules'

  16. #16
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    ? Nein, ich meinte:
    PHP-Code:
    $user->hasAccess(['core'], 'modules'
    Ich glaube, wir missverstehen uns etwas.

    Der Fehler ist folgender:

    Code:
    Argument 1 passed to Agentur1601com\CoreBundle\EventListener\GetUserNavigationListener::__invoke() must be of the type array, null given, called in vendor/contao/core-bundle/src/Resources/contao/classes/BackendUser.php on line 530
    Der Fehler tritt nicht bei jedem Benutzer auf, nur bei denen, die keinen Zugriff auf das Modul haben.
    Auch mit der Änderung von dir erhalte ich den gleichen Fehler.

    Der Fehler tritt auch nur auf, wenn die if-Condition nicht greift.
    Geändert von Fonjensi (18.11.2020 um 11:58 Uhr)

  17. #17
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard

    Zitat Zitat von Fonjensi Beitrag anzeigen
    Ich glaube, wir missverstehen uns etwas.

    Der Fehler ist folgender:

    Code:
    Argument 1 passed to Agentur1601com\CoreBundle\EventListener\GetUserNavigationListener::__invoke() must be of the type array, null given, called in vendor/contao/core-bundle/src/Resources/contao/classes/BackendUser.php on line 530
    Der Fehler tritt nicht bei jedem Benutzer auf, nur bei denen, die keinen Zugriff auf das Modul haben.
    Auch mit der Änderung von dir erhalte ich den gleichen Fehler.

    Der Fehler tritt auch nur auf, wenn die if-Condition nicht greift.

    Hey Spooky, konnte mich gerade leider unter dem Tag nicht mehr drum kümmern.
    Mein Problem ist jedoch, dass mein Code so nicht funktioniert:

    PHP-Code:
        /**
         * @param array $modules
         * @param bool $showAll
         * @return array
         */
        
    public function __invoke(array $modulesbool $showAll): ?array
        {
            
    $user = \BackendUser::getInstance();

            if (
    $user->hasAccess(['core'], 'modules')) {
                
    $modules['agentur1601com']['modules']['core'] = [
                    
    'label' => 'Unterstützen',
                    
    'title' => 'The core bundle',
                    
    'class' => 'agentur1601com',
                    
    'href' => $this->_routerInterface->generate('agentur1601com_core_backend'),
                ];

                return 
    $modules;
            }

           return 
    null;
        } 
    Meine Versuche bisher waren:
    1. return null, falls der Nutzer keine Berechtigung hatte -> resultiert in einem Fehler, da ein Array erwartet wird.
    2. return ein leeres Array -> Überschreibt die Backend-Navigation komplett
    3. Versuch die Hook-Registration über die contao/config.php zu verhindern, falls der Nutzer keinen Zugriff hat -> Funktioniert nicht.

    Hast jemand hier noch eine Idee?
    Ich könnte den Backend-Menu-Entry der Hook über CSS ausblenden, aber das will ich eigentlich nicht.
    Würde gerne, dass dieser gar nicht erst geladen wird

  18. #18
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.126
    Partner-ID
    10107

    Standard

    Der Rückgabewert muss immer das $modules Array sein. Wenn du null oder ein leeres Array zurück gibst, löschst du damit ja effektiv die Backend Navigation.

    Übrigens solltest du die in den Root Namespace gemappten Klassen nicht verwenden.

  19. #19
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Der Rückgabewert muss immer das $modules Array sein. Wenn du null oder ein leeres Array zurück gibst, löschst du damit ja effektiv die Backend Navigation.

    Übrigens solltest du die in den Root Namespace gemappten Klassen nicht verwenden.
    1. Bedeutet dann, dass es keine Möglichkeit gibt, dass ich die Ausgabe des Menu-Entries verhindere? Außer evtl. über CSS?
    2. Was genau meinst du mit dem im Root Namespace gemappten Klassen?

  20. #20
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.126
    Partner-ID
    10107

    Standard

    Zitat Zitat von Fonjensi Beitrag anzeigen
    1. Bedeutet dann, dass es keine Möglichkeit gibt, dass ich die Ausgabe des Menu-Entries verhindere?
    Doch natürlich, machst du ja bereits mit deiner Abfrage.



    Zitat Zitat von Fonjensi Beitrag anzeigen
    2. Was genau meinst du mit dem im Root Namespace gemappten Klassen?
    Du hast \BackendUser verwendet. Du solltest aber \Contao\BackendUser oder use Contao\BackendUser; und BackendUser verwenden.

  21. #21
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Doch natürlich, machst du ja bereits mit deiner Abfrage.



    Du hast \BackendUser verwendet. Du solltest aber \Contao\BackendUser oder use Contao\BackendUser; und BackendUser verwenden.
    1. Aber sie wird ja dennoch ausgegeben, bzw. ich erzeuge mir damit nur einen Fehler in der Entwicklungsumgebung.

    2. Achso ja, das habe ich nur testweise reingepackt.

  22. #22
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.126
    Partner-ID
    10107

    Standard

    Zitat Zitat von Fonjensi Beitrag anzeigen
    1. Aber sie wird ja dennoch ausgegeben, bzw. ich erzeuge mir damit nur einen Fehler in der Entwicklungsumgebung.
    Wie sieht dein Code nun aus? Die letzte Implementation von dir war ja falsch, da du null zurück gibst (für Admins).

  23. #23
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard

    Gerade sieht mein Code so aus:

    Für Admins funktioniert es.
    Für Nicht-Admins mit keinem Zugriff auf das BE-Modul kommt es zu einem Fehler, da ein return-Wert fehlt; was ja auch verständlich ist.

    Nur was könnte ich quasi als else-condition returnen, um 1. die Backend-Navigation nicht zu überschreiben und 2. Keinen Fehler zu generieren?

    PHP-Code:
        /**
         * @param array $modules
         * @param bool $showAll
         * @return array
         */
        
    public function __invoke(array $modulesbool $showAll): array
        {
            
    $user = \BackendUser::getInstance();

            if (
    $user->hasAccess(['core'], 'modules')) {
                
    $modules['agentur1601com']['modules']['core'] = [
                    
    'label' => 'Unterstützen',
                    
    'title' => 'The core bundle',
                    
    'class' => 'agentur1601com',
                    
    'href' => $this->_routerInterface->generate('agentur1601com_core_backend'),
                ];

                return 
    $modules;
            }
        } 

  24. #24
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.126
    Partner-ID
    10107

    Standard

    Ich glaub du siehst den Wald vor lauter Bäumen nicht mehr

    Wie schon gesagt musst du in diesm Hook natürlich immer $modules returnen.
    PHP-Code:
        public function __invoke(array $modulesbool $showAll): array
        {
            
    $user BackendUser::getInstance();

            if (
    $user->hasAccess(['core'], 'modules')) {
                
    $modules['agentur1601com']['modules']['core'] = [
                    
    'label' => 'Unterstützen',
                    
    'title' => 'The core bundle',
                    
    'class' => 'agentur1601com',
                    
    'href' => $this->_routerInterface->generate('agentur1601com_core_backend'),
                ];
            }

            return 
    $modules;
        } 

  25. #25
    Contao-Nutzer
    Registriert seit
    07.12.2019.
    Beiträge
    147

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Ich glaub du siehst den Wald vor lauter Bäumen nicht mehr
    Ich glaube, du hast Recht. Danke, nun funktioniert es

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •