Ergebnis 1 bis 14 von 14

Thema: Hook für Navigation

  1. #1
    Contao-Nutzer
    Registriert seit
    17.07.2010.
    Beiträge
    127

    Standard Hook für Navigation

    Hallo zusammen,

    kennt jemand eine Möglichkeit, die Navigation aus einem Modul heraus zu beeinflussen?
    Ich möchte einen Navigationspunkt nur dann anzeigen lassen, wenn in meinem Modul etwas zutrifft.

    Bisher habe ich zwei Optionen zur Auswahl:
    a) Wie bei der Extension xNavigation, die den kompletten Aufbau der Navigation selbst übernimmt. Scheint mir ein bisschen Riskant bei Updates.
    b) mit preg_replace() im Zusammenhang mit z.B. dem Hook outputFrontendTemplate(). Eventuell eine Performance-Einbuße.

    Ändere Vorschläge? Ein Hook an dieser Stelle wäre schon praktisch

    Mfg
    sans
    Geändert von sans (30.06.2011 um 16:49 Uhr)

  2. #2
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.468
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von sans Beitrag anzeigen
    Ein Hook an dieser Stelle wäre schon praktisch
    Schau an...und noch einer
    --> http://dev.contao.org/issues/3162
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  3. #3
    Contao-Nutzer
    Registriert seit
    17.07.2010.
    Beiträge
    127

    Standard

    Ah, sehr schön! Hoffentlich kommt das bald

  4. #4
    Contao-Urgestein Avatar von Toflar
    Registriert seit
    15.06.2009.
    Beiträge
    4.468
    Partner-ID
    8667
    User beschenken
    Wunschliste

    Standard

    Das hängt unter anderem auch von dir ab Jeder ist herzlich willkommen. Ich hab schon zwei Tage dran gesessen, ich muss mal Pause machen
    Contao Core-Entwickler @terminal42 gmbh
    Wir sind Contao Premium-Partner!
    Für Individuallösungen kannst du uns gerne kontaktieren.
    PS: Heute schon getrakked?

  5. #5
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    166

    Standard

    Hat sich in dem Bereich inzwischen was getan? Ich habe inzwischen einen ganz ähnlichen Fall. Habe schon versucht, die Seite über den Hook "loadPageDetails" zu verändern und "published" auf "" zu ändern. Das scheint der Funktion "renderNavigation" aber egal zu sein, da sie die Seite zu diesem Zeitpunkt bereits über "getPublishedSubpagesByPid" geladen hat und danach nicht mehr auf "published" prüft.

    https://github.com/contao/core-bundl...odule.php#L304

    Hat das inzwischen jemand irgendwie hinbekommen? Ich würde die Seite in der Navigation gerne ausblenden, wenn ein bestimmter Wert in der Session gesetzt wurde.

    Dank und Gruß
    Dennis

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

    Standard

    Könntest du notfalls per parseTemplate Hook machen.
    » sponsor me via GitHub or PayPal or Revolut

  7. #7
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    166

    Standard

    Schau ich mir an. Besten Dank!

  8. #8
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    166

    Standard

    Danke für den Tipp. Hat wunderbar geklappt. Ich prüfe jetzt, ob die Session-Variable "loggedIn" gesetzt ist und das Feld "hideGuests" aktiviert ist.

    Die Lösung mit der Session-Variable hatte ich eingebaut, da ich die Seite nur mit einem Passwort schützen wollte und keinen regulären Login über Benutzername und Passwort wollte.

    PHP-Code:
    <?php

    namespace App\EventListener;

    use 
    Contao\CoreBundle\ServiceAnnotation\Hook;
    use 
    Contao\Template;
    use 
    Contao\System;

    /**
     * @Hook("parseTemplate")
     */
    class ParseTemplateListener
    {
        public function 
    __invoke(Template $template): void
        
    {
            if (
    in_array($template->type,['Contao\ModuleNavigation','Contao\ModuleCustomnav'])) {
                
                
    // Skip, if user is logged in
                
    if (System::getContainer()->get('session')->get('loggedIn')) return;

                
    // Hide item, when "hideGuests" is true
                
    $template->items array_filter($template->items, function($item) {
                    return !
    $item["hideGuests"];
                });

            }
        }
    }

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

    Standard

    Statt System::getContainer() solltest du DI nutzen
    » sponsor me via GitHub or PayPal or Revolut

  10. #10
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    166

    Standard

    Jetzt war ich so stolz, nicht einfach $_SESSION verwendet zu haben.

    Dann muss ich mich da noch Mal etwas eingraben. Habe Dependency Injections schon Mal verwendet, aber damals so lange daran herum gebastelt, bis es funktioniert hat, dass ich noch nicht zu 100% durch die Logik durch gestiegen bin. Das muss ich dann wahrscheinlich über die services.yaml machen, richtig?

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

    Standard

    So wäre es am richtigstens:
    PHP-Code:
    namespace App\EventListener;

    use 
    Contao\CoreBundle\ServiceAnnotation\Hook;
    use 
    Contao\Template;
    use 
    Symfony\Component\HttpFoundation\RequestStack;

    /**
     * @Hook("parseTemplate")
     */
    class ParseTemplateListener
    {
        private 
    $requestStack;

        public function 
    __construct(RequestStack $requestStack)
        {
            
    $this->requestStack $requestStack;
        }

        public function 
    __invoke(Template $template): void
        
    {
            if (
    in_array($template->type,['Contao\ModuleNavigation','Contao\ModuleCustomnav'])) {
                
    $request $this->requestStack->getCurrentRequest();

                if (
    null === $request || !$request->hasSession()) {
                    return;
                }

                
    $session $request->getSession();
             
                
    // Skip, if user is logged in
                
    if ($session->isStarted() && $request->getSession()->get('loggedIn'false)) {
                    return;
                }

                
    // Hide item, when "hideGuests" is true
                
    $template->items array_filter($template->items, function($item) {
                    return !
    $item["hideGuests"];
                });
            }
        }

    Dafür musst du keine services.yaml anlegen. Services im App\ Namespace registriert die Contao Managed Edition für dich automatisch (mit autowiring).

    // wobei, die Logik stimmt so eigentlich nicht. Aber so siehst du zumindst, wie du in Symfony 4.4 und 5 an die Session kommst.
    » sponsor me via GitHub or PayPal or Revolut

  12. #12
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    166

    Standard

    Damit habe ich es hinbekommen. 1.000 Dank!

    PHP-Code:
    <?php

    namespace App\EventListener;

    use 
    Contao\CoreBundle\ServiceAnnotation\Hook;
    use 
    Contao\Template;
    use 
    Symfony\Component\HttpFoundation\RequestStack;

    /**
     * @Hook("parseTemplate")
     */
    class ParseTemplateListener
    {
        private 
    $requestStack;

        public function 
    __construct(RequestStack $requestStack)
        {
            
    $this->requestStack $requestStack;
        }

        public function 
    __invoke(Template $template): void
        
    {
            if (
    in_array($template->type,['Contao\ModuleNavigation','Contao\ModuleCustomnav']))
            {
                
    // Get session
                
    $request $this->requestStack->getCurrentRequest();
                
    $session $request->getSession();

                
    // Skip, if user is logged in
                
    if ($session->get('loggedIn')) return;

                
    // Hide item, when "hideGuests" is true
                
    $template->items array_filter($template->items, function($item) {
                    return !
    $item["hideGuests"];
                });
            }
        }
    }
    Eine Sache, die sich mir noch nicht erschlossen hat ist, warum hier getCurrentRequest() benötigt wird, diese Funktion in der Dokumentation von Symfony aber nicht auftaucht.

    https://symfony.com/doc/current/session.html

  13. #13
    Contao-Nutzer Avatar von chatjack
    Registriert seit
    02.09.2012.
    Ort
    Essen
    Beiträge
    166

    Standard

    Ich vermute mal, es hängt damit zusammen, dass Contao hier einen Service Container aus der Klasse macht.

    https://symfony.com/doc/current/serv...r/request.html

    Werde mich hier noch Mal etwas einlesen. Besten Dank für den Support!

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

    Standard

    Nein, ab Symfony 5 sollst du dir die Session vom Request holen. Damit du den aktuellen Request holen kannst, brauchst du, in diesem Fall, den RequestStack.
    » sponsor me via GitHub or PayPal or Revolut

Aktive Benutzer

Aktive Benutzer

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

Berechtigungen

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