turk porno porno escort rokettube
Ergebnis 1 bis 13 von 13

Thema: Navigation: Menüpunkt nur zeigen, wenn Bedingung erfüllt

  1. #1
    Neuer Benutzer
    Registriert seit
    15.04.2015
    Ort
    Südlich von München
    Beiträge
    28
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard Navigation: Menüpunkt nur zeigen, wenn Bedingung erfüllt

    Hallo allerseites,

    ich hab eine bereits funktionierende Navigation.
    Jetzt möchte ich, dass ein Menüpunkt nur angezeigt wird, wenn eine bestimmte Bedingung erfüllt ist.
    (Konkret: In der Verwaltung meiner Kunden benötige ich für Kunden mit einem bestimmten Merkmal ein weiteres Menü.)

    Ich hab nicht den allerleisesten Schimmer, wo ich da hinfassen, bzw. anfangen soll.
    Wäre schön, wenn mir jemand helfen, bzw. mich in die richtige Richtung schubsen könnte.

    So habe ich die Navi aufgebaut:

    Die module.config.php:
    PHP-Code:
    'navigation' => array(
            
    'default' => array(
                array(
                    
    'label' => 'Home',
                    
    'route' => 'home',
                ),
                array(
                    
    'label' => 'Verwaltung',
                    
    'route' => 'verwaltung',
                    
    'resource' => 'user_index_controller',
                    
    'pages' => array(
                       ...
                    ),
                ),
                array(
                    
    'label' => 'Kunden',
                    
    'route' => 'customer',
                    
    'resource' => 'customer_index_controller',
                    
    'pages' => array(
                        array(
                            
    'label' => 'Kunde',
                            
    'route' => 'customer',
                            
    'resource' => 'customer_index_controller',
                            
    'pages' => array(
                                array(
                                
    'label' => 'Kunde ändern',
                                
    'route' => 'customer/edit',
                                
    'useRouteMatch' => true,
                                
    'resource' => 'customer_showcustomer_controller',
                                ),
                                array(
                                
    'label' => 'Vertrag',
                                
    'route' => 'customer/contract',
                                
    'useRouteMatch' => true,
                                
    'resource' => 'customer_customercontract_controller',
                                
    'pages' => array(...),
                                ),
                                array(
                                
    'label' => 'Aufträge',
                                
    'route' => 'customer/edit',
                                
    'useRouteMatch' => true,
                                
    'resource' => 'customer_showcustomer_controller',
                                ),
                                
    // Dieser Menüpunkt soll nur erscheinen, wenn der Kunde ein Merkmal 'G' besitzt
                                
    array(
                                
    'label' => 'Mitglieder',
                                
    'route' => 'customer/edit',
                                
    'useRouteMatch' => true,
                                
    'resource' => 'customer_showcustomer_controller',
                                ),
                            ),
                        ),
                        array(
                            
    'label' => 'Kunde neu anlegen',
                            
    'route' => 'createcustomer',
                            
    'resource' => 'customer_index_controller',
                        ),
                    ),
                ),
            ),
        ),
        
    'service_manager' => array(
            
    'factories' => array(
                
    'navigation' => 'Zend\Navigation\Service\DefaultNavigationFactory',
            ),
        ), 
    In meiner View zeige ich hier nur die dritte Ebene der Navigation.
    HTML-Code:
    <div class= "clearfix" id="menuthird">
        <?php
        echo $menu->renderMenu(null, array(
            'minDepth' => 2,
            'maxDepth'  => 2,
            'onlyActiveBranch' => true,
        )); 
        ?>
    </div>
    Ich möchte gerne, dass der Menüpunkt/Page mit dem Label 'Mitglieder' nur erscheint, wenn der Kunde, den ich verwalte ein Flag mit dem Wert 'G' besitzt.

    Wo muss ich da hinfassen?

    Bin gespannt, Schneeloewe

  2. #2
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.520
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von schneeloewe Beitrag anzeigen
    …wenn der Kunde, den ich verwalte ein Flag mit dem Wert 'G' besitzt.
    Kannst du nicht einfach die Rechte entziehen?! (Denk auch daran, dass ein direkter Aufruf ohne Navigation ebenfalls unterbunden werden muss.)

    Ich erlaube mir auch noch zwei Hinweise zu geben:

    • Die Ressourcennamen wie „user_index_controller“ sind unglücklich gewählt, da du hier die Sache konkret auf einen Kontroller festziehst. Sollte der Kontroller sich mal ändern, müsstest du auch deine Navigation ändern.
    • „array()“ – PHP 5.4 ist tot und die Version haben wir auch schon lange hinter uns gelassen, du darfst einfach „[]“ schreiben.
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  3. #3
    Neuer Benutzer
    Registriert seit
    15.04.2015
    Ort
    Südlich von München
    Beiträge
    28
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard

    Erstmal danke für die, wie immer hilfreichen Hinweise.

    Die Arraygeschichte bin ich bereits am ändern - ist noch uneinheitlich in meinen Konfigdateien.

    Die Sache mit den Resourcen und der ACL überdenke ich nochmal.
    Ich habe tatsächlich in meiner Acl Controller als Resources und Actions als Privileges.
    Was würdest Du als typische Resource, bzw. Privilege stattdessen definieren?
    Gibt es hier eine Best Practice?


    Zur ursprünglichen Frage:

    Möglicherweise habe ich das falsch dargestellt.
    Der Nutzer ist ein Sachverwalter, der Kunden verwaltet.
    Der hat das Recht alle Kunden zu verwalten.
    Bearbeitet er jetzt aber einen Kunden, der kein Flag 'G' hat, dann soll der Menüpunkt 'Mitglieder' nicht angezeigt werden, weil ein nicht G-Kunde keine Mitglieder hat.
    Das ist eigentlich keine Rechtegeschichte - aufrufen dürfte er ja den Menüpunkt Mitglieder, nur macht der bei einem nicht G-Kunden keinen Sinn.

    Ich habe darüber nachgedacht zwei unterschiedliche Navigationen ('default' und 'spezial') anzulegen - eine mit und eine ohne den Menüpunkt 'Mitglieder'.
    Ich würde dann meinen Views den Wert des Flags 'G' übergeben und je nach Wert die eine oder die andere Navigation anzeigen.
    Mir gefällt dabei nicht, dass ich jedesmal die gesamte 3. Ebene der Navigation definieren muss, wo doch nur der eine Menüpunkt anders ist.
    Ich habe mir erhofft, dass ich in der Konfiguration irgendwo eine Bedingung einbauen könnte.

  4. #4
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.520
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von schneeloewe Beitrag anzeigen
    Die Arraygeschichte bin ich bereits am ändern - ist noch uneinheitlich in meinen Konfigdateien.
    Das macht doch deine IDE über die Quellcode-Formatierung.

    Zitat Zitat von schneeloewe Beitrag anzeigen
    Ich habe tatsächlich in meiner Acl Controller als Resources und Actions als Privileges.
    Wird häufig so umgesetzt. Nur vielleicht sollte man die Namen allgemeiner halten und nicht direkt nach den Dingen benennen, die kontrolliert werden. Ändern sich die Kontrollernamen, muss auch ACL und Navigation angepasst werden.

    Zitat Zitat von schneeloewe Beitrag anzeigen
    G-Kunden
    Ist „G-Kunde“ ein gemeiner oder grausamer Kunde? Oder doch ein Gold-Kunde?

    Zitat Zitat von schneeloewe Beitrag anzeigen
    Ich habe darüber nachgedacht zwei unterschiedliche Navigationen ('default' und 'spezial') anzulegen
    Das würde in kopieren enden.

    Einfacher:
    Solltest du über den „Service Manager“ den aktuellen Kunden kommen, z.B. über den „Zend\Session\SessionManager“ oder einen anderen Service, dann erstelle dir eine eigene Fabrik für deine Navigation („AbstractNavigationFactory“ erweitern) und füge die entsprechenden Navigationspunkte nicht hinzu.
    Wenn es an einem URL-Parameter hängt, dann könnte auch ein „Listener“ helfen, der am Render-Ereignis lauscht und dann den Parameter holt und entsprechend die Navigation manipuliert.
    Geändert von Kaiuwe (18.09.2015 um 14:46 Uhr)
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  5. #5
    Neuer Benutzer
    Registriert seit
    15.04.2015
    Ort
    Südlich von München
    Beiträge
    28
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard

    Vielen Dank wieder mal für Deine hilfreichen Antworten.
    Da muss ich jetzt erst ein bisschen drüber brüten.

    Das mit der IDE schau ich mir an - da merk ich halt wieder mal, wie man sich die Dinge selber schwierig machen kann.
    Was das G angeht - Kunden sind doch alle gemein - G steht für groß...

  6. #6
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.520
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von schneeloewe Beitrag anzeigen
    Das mit der IDE schau ich mir an - da merk ich halt wieder mal, wie man sich die Dinge selber schwierig machen kann.
    Am Beispiel von PHPStorm: „Code Style PHP“ (siehe „Array declaration style“)
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  7. #7
    Neuer Benutzer
    Registriert seit
    15.04.2015
    Ort
    Südlich von München
    Beiträge
    28
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard

    Ich arbeite mit ZendStudio 11 - da kann ich zwar etliches einstellen zum Formatter, array declaration style o.ä. habe ich leider nicht gefunden

  8. #8
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.520
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von schneeloewe Beitrag anzeigen
    …habe ich leider nicht gefunden
    Und dann kostet es noch einiges mehr als PHPStorm. (Die ZF-Integration ist vorhanden und das ist schon gut.)

    Zitat Zitat von schneeloewe
    Da muss ich jetzt erst ein bisschen drüber brüten.
    Geht es voran?
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  9. #9
    Neuer Benutzer
    Registriert seit
    15.04.2015
    Ort
    Südlich von München
    Beiträge
    28
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard

    Servus Kaiuwe,

    das hat jetzt ein bisschen gedauert, da auch noch andere Arbeiten zu tun waren.
    Letztendlich habe ich jetzt eine Lösung.

    Ich bin mir nicht so ganz sicher, ob Du mir dafür die Guidelines für 'Elegantes Programmieren' um die Ohren hauen willst.
    Aber immerhin, es funktioniert erst mal.

    Ich habe also die „AbstractNavigationFactory“ erweitert.

    Darin prüfe ich, ob die Kundenverwaltung aufgerufen wird, indem ich den entsprechenden Parameter aus der Route checke.
    Wenn das der Fall ist, lade ich den Kunden und überprüfe das entsprechende Flag.
    Hier habe ich bereits ein bisschen Bauchschmerzen, weil ich die Kundendaten inzwischen recht oft aus der DB lade.

    Hat der Kunde das Flag G, dann erweitere ich die Navi-Konfiguration um den entsprechenden Menüpunkt.
    Das scheint mir insgesamt der übelste Teil meiner Factory, weil ich einfach das Array erweitere.
    Ich habe einfach überhaupt keine Ahnung, wie ich auf die 'richtige' Weise eine neue Seite/Menüpunkt an einer bestimmten Stelle der Navi hinzufügen soll.

    Hier meine Factory:
    PHP-Code:
    namespace Application\Factory\Navigation;

    use 
    Zend\Navigation\Service\AbstractNavigationFactory;
    use 
    Zend\ServiceManager\ServiceLocatorInterface;

    /**
     * My project navigation factory 
     */
    class SolzNavigationFactory extends AbstractNavigationFactory
    {
        
    /**
         * @return string
         */
        
    protected function getName()
        {
            return 
    'default';
        }
        
        
    /**
         * @param ServiceLocatorInterface $serviceLocator
         * @return array
         */
        
    protected function getPages(ServiceLocatorInterface $serviceLocator)
        {
            if (
    null === $this->pages) {
        
                
    // Get router and request
                
    $router                     $serviceLocator->get('router');
                
    $request                    $serviceLocator->get('request');
                
    // Get the router match
                
    $routerMatch                $router->match($request);
                
                
    // Get configuration
                
    $configuration              $serviceLocator->get('Config');
                
                if (!isset(
    $configuration['navigation'])) {
                    throw new \
    Exception('Could not find navigation configuration key');
                }
                if (!isset(
    $configuration['navigation'][$this->getName()])) {
                    throw new \
    Exception(sprintf(
                        
    'Failed to find a navigation container by the name "%s"',
                        
    $this->getName()
                    ));
                }
                
                
    // If isset Router-Match-getParam('cu_id'), check customer
                // If customer-type = G -> add Page childcustomer

                // Get param cu_id
                
    $cuId        $routerMatch->getParam('cu_id');

                if (
    $cuId)  {
                    
    // check customer
                    
    $cuCustomerMapper       $serviceLocator->get('DAO_Mapper_CuCustomer');
                    
    // load customer
                    
    $cuCustomerDto          $cuCustomerMapper->load($cuId);
                    
    // check wether customertype == G
                    
    if ($cuCustomerDto->getCtype() === 'G') {
                        
    // add page childcustomer to configuration
                        
    $configuration['navigation']['default'][2]['pages'][0]['pages'][5] = array(
                            
    'label'         => 'Mitglieder',
                            
    'route'         => 'customer/edit',
                            
    'useRouteMatch' => 1,
                            
    'resource'      => 'customer_showcustomer_controller',
                        );
                        
                    }
                }

                
    $pages       $this->getPagesFromConfig($configuration['navigation'][$this->getName()]);
                
    $this->pages $this->preparePages($serviceLocator$pages);
            }
            return 
    $this->pages;
        }
        


    Grüße aus dem sonnigen München,
    Schneeloewe

  10. #10
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.520
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von schneeloewe Beitrag anzeigen
    Hier habe ich bereits ein bisschen Bauchschmerzen, weil ich die Kundendaten inzwischen recht oft aus der DB lade.
    Hier könnte ein Dekorierer, welcher eine "Identity Map" umsetzt, für deinen Mapper Abhilfe schaffen.

    Zitat Zitat von schneeloewe Beitrag anzeigen
    weil ich einfach das Array erweitere.
    Dann erweitere den Navigations-Container nachdem dieser per "preparePages" erzeugt wurde und schon fällt der Array-Blödsinn weg.
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  11. #11
    Neuer Benutzer
    Registriert seit
    15.04.2015
    Ort
    Südlich von München
    Beiträge
    28
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard

    Die Geschichte mit dem Dekorierer ist interessant. Das werde ich mir später im Detail ansehen.

    Dann erweitere den Navigations-Container nachdem dieser per "preparePages" erzeugt wurde und schon fällt der Array-Blödsinn weg.
    Ich habe damit noch ziemliche Probleme.

    Ich habe also die Factory umgebaut und prüfe jetzt erst in "createService" auf das G-Flag
    und könnte jetzt die fertige Navigation um eine Seite erweitern.
    Die Methode addPage() steht zur Verfügung und ich habe das mal mit dem Beispiel aus dem Manual fehlerfrei getestet:
    PHP-Code:
        public function createService(ServiceLocatorInterface $serviceLocator)
        {
            
    $pages $this->getPages($serviceLocator);
            
    $navigation = new Navigation($pages);

            
    $router                     $serviceLocator->get('router');
            
    $request                    $serviceLocator->get('request');
            
    $routerMatch                $router->match($request);
            
            
    // Get param cu_id
            
    $cuId        $routerMatch->getParam('cu_id');
            
            if (
    $cuId)  {
                
    // check customer
                
    $cuCustomerMapper       $serviceLocator->get('DAO_Mapper_CuCustomer');
                
    $cuCustomerDto          $cuCustomerMapper->load($cuId);
                
    // check wether customertype == G
                
    if ($cuCustomerDto->getCtype() === 'G') {
                    
    $navigation->addPage(   
                        array(
                            
    'uri' => 'http://www.example.com/',
                        )
                    );
                }
            }     
            return 
    $navigation;
        } 
    Mir scheint damit das Prinzip richtig zu sein.
    Ich habe aber nach wie vor keine Ahnung, wie ich hier eine funktionierende Seite an der richtigen Stelle im Seitenbaum einhänge.

    So ungefähr müsst ja meine 'echte' Seite aussehen -> das wirft aber natürlich einen Fehler.
    PHP-Code:
                    $navigation->addPage(
                        array(
                            
    'label'         => 'Mitglieder',
                            
    'route'         => 'customer/childcustomer',
                            
    'useRouteMatch' => 1,
                            
    'resource'      => 'customer_childcustomer_controller',
                        )
                    ); 
    Ich hätte jetzt vermutet, dass ich in der Navi zur entsprechenden Seite navigiere, z.B. mit findBy und dass dann eine entsprechende Methode, z.B. addSiblingPage() o.ä. vorhanden wäre.
    Ich habe aber leider nichts entsprechendes gefunden.
    Wo liegt mein Fehler?

    lg, schneeloewe

  12. #12
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.520
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von schneeloewe Beitrag anzeigen
    Ich habe aber nach wie vor keine Ahnung, wie ich hier eine funktionierende Seite an der richtigen Stelle im Seitenbaum einhänge.
    Die Eigenschaft „order“ verwenden.
    Zitat Zitat von schneeloewe Beitrag anzeigen
    Ich hätte jetzt vermutet, dass ich in der Navi zur entsprechenden Seite navigiere, z.B. mit findBy und dass dann eine entsprechende Methode, z.B. addSiblingPage() o.ä. vorhanden wäre.
    „addSiblingPage“ gibt es nicht, aber du könntest die Eltern-Seite holen und dort die Seite anfügen. Ein „order“ in dem Zweig sollte dann ausreichen.
    Geändert von Kaiuwe (24.09.2015 um 12:22 Uhr)
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  13. #13
    Neuer Benutzer
    Registriert seit
    15.04.2015
    Ort
    Südlich von München
    Beiträge
    28
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard

    Wieder mal danke für den Hinweis.
    Ich habe das Problem jetzt aber doch anders gelöst -> worauf leider wieder ein neues Problem aufgetaucht ist.

    Aber zuerst mal zur Lösung:

    Der Menüpunkt "Mitglieder" führt zu weiteren Untermenüpunkten.
    Ich wollte jetzt nicht ein ganzes Paket an Pages in der Factory hinzufügen, daher habe ich einfach das gesamte Menü "navigation" in der module.config.php um den Zweig "Mitglieder" mit allen zugehörigen Menüpunkten erweitert und dem Menüpunkt "Mitglieder" noch die Option "'visible' => false" gegeben.

    In meiner SolzNavigationFactory.php schalte ich den Menüzweig einfach dann visible, wenn der Kunde das Flag "G" hat.
    PHP-Code:
                if ($cuCustomerDto->getCtype() === 'G') {
                    
    $page $navigation->findOneBy('label''Mitglieder');
                    
    $page->setVisible(true);
                } 
    Funzt supergut Hab ich mich gefreut

    Jetzt das neue Problem:

    Ich habe ein dreiteiliges Menü.
    Oben die erste Ebene "Hauptmenü".
    Links ein Seitenmenü mit der zweiten Menüebene. Damit hier immer nur die Menüpunkte des im Hauptmenü angeklickten Menüpunktes erscheinen, habe ich hier "'onlyActiveBranch' => true" eingestellt:
    PHP-Code:
    echo $menu->renderMenu(null, array(
                        
    'minDepth' => 1,
                        
    'maxDepth'  => 1,
                        
    'onlyActiveBranch' => true,
                    )); 
    Rechts davon, über meinem Hauptframe habe ich noch ein drittes Menü, in dem ich je nach Seite Menüpunkte der dritten oder vierten Ebene.
    In meiner module.config.php hab ich in meinem Menü "navigation" unterhalb der Ebene des Menüpunktes "Mitglieder", auf der vierten Ebene, einen Menüpunkt "Neues Mitglied anlegen", den ich "'visible' = false" gestellt habe, weil ich nicht möchte, dass er im Menü auftaucht, ich aber andererseits möchte, dass der Zweig Mitglieder als aktiver Zweig angezeigt wird.
    In Breadcrumbs wäre das Kunden -> Kunden suchen -> Mitglieder -> Neues Mitglied anlegen

    Alles funktioniert super, solange ich nicht den Menüpunkt "Neues Mitglied anlegen" anklicke.
    Dann nämlich verschwindet das komplette Menü der dritten Ebene mit dem Menüpunkt "Mitglieder".
    Vom Menü der zweiten Ebene wird nur noch der aktive Menüpunkt "Kunden suchen" angezeigt.

    Was passiert da? Ich kapier das nicht. Was hat das mit 'visible' eines unteren Menüpunktes zu tun?
    Ich hab einen Workaround:
    Ich stell den Menüpunkt "Neues Mitglied anlegen" einfach auf die fünfte Ebene und lass das visible weg - die fünfte Ebene zeig ich nirgends an und der Zweig bleibt trotzdem aktiv.
    Aber gefallen tut mir das nicht

    Trotzdem ein großes Danke für die beständige Hilfe
    Ich wünsch einen schönen letzten Wochenarbeitstag, schneeloewe

Ähnliche Themen

  1. Navigation erster Punkt dauerhaft "Active"
    Von sodiummd im Forum ZF2 Grundlagen
    Antworten: 1
    Letzter Beitrag: 15.10.2012, 16:00
  2. Antworten: 3
    Letzter Beitrag: 06.11.2011, 15:55
  3. Antworten: 2
    Letzter Beitrag: 14.03.2010, 13:47
  4. Navigation: zwei menüs
    Von mondy im Forum Einsteigerfragen
    Antworten: 4
    Letzter Beitrag: 08.10.2009, 12:50
  5. Antworten: 10
    Letzter Beitrag: 21.05.2009, 04:57

Stichworte

Lesezeichen

Berechtigungen

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