Ergebnis 1 bis 2 von 2

Thema: Seitenkontextabhängige Linkgenerierung ohne generateFrontendUrl Hook

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

    Standard Seitenkontextabhängige Linkgenerierung ohne generateFrontendUrl Hook

    Hallo zusammen,

    leider wurde ja in Contao 5 der generateFrontendUrl Hook entfernt und nun bin ich gerade auf der Suche nach einer alternativen Lösung, wie ich seitenkontextabhängig Links generieren kann, ohne die bestehende Generierung zu ersetzen. Denn im Idealfall möchte ich gerne, dass Hyperlinks-Element und Link-InsertTags weiterhin wie gewohnt genutzt werden können.

    Ich hatte das PageModel um ein Feld (relatedTable) ergänzt, damit das System weiß, auf welche Tabelle sich die ID in der URL bezieht. So kann ich Inhalte auf der Seite kontextabhängig ausgeben.

    Code:
    KLIENT
    https://www.domain.tld/client/1.html
    $objPage->relatedTable = "tl_client"
    
    KLIENTKONTAKT
    https://www.domain.tld/clientcontact/1.html
    $objPage->relatedTable = "tl_clientcontact"
    Die Tabelle "tl_clientcontact" beinhaltet als pid die ID des Klienten aus "tl_client". Über den Hook generateFrontendUrl war es möglich, auf das PageModel der aktuellen Seite und der Zielseite zuzugreifen und so zu prüfen, ob beide die Einstellung relatedTable beinhalteten. Falls ja, konnte so ein Bezug zwischen beiden Seiten hergestellt werden, sodass bei einem Link von KLIENTKONTAKT auf KLIENT automatisch die ID aus pid ergänzt werden konnte. Vorteil der Lösung ist, dass hier alle Fälle abgedeckt waren, in denen Contao sich um die Link-Generierung kümmert.

    Leider erschließt sich mir noch nicht ganz, wie man das jetzt ohne den Hook hinbekommen soll.

    Hat jemand eine Idee?

    Danke und VG
    Dennis

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

    Standard

    Ich konnte das Problem jetzt per Service Decoration in Symfony lösen.

    PHP-Code:
    // src/Decorator/PageUrlGeneratorDecorator.php
    namespace App\Decorator;

    use 
    Contao\Input;
    use 
    Symfony\Component\DependencyInjection\Attribute\AsDecorator;
    use 
    Symfony\Component\HttpFoundation\RequestStack;
    use 
    Symfony\Component\Routing\RequestContext;
    use 
    Symfony\Component\Routing\Generator\UrlGeneratorInterface;

    #[AsDecorator('contao.routing.page_url_generator')]
    class PageUrlGeneratorDecorator implements UrlGeneratorInterface
    {
        private 
    $generator;
        private 
    $requestStack;

        public function 
    __construct(UrlGeneratorInterface $generatorRequestStack $requestStack)
        {
            
    $this->generator $generator;
            
    $this->requestStack $requestStack;
        }

        public function 
    generate(string $name, array $parameters = [], int $referenceType self::ABSOLUTE_PATH): string
        
    {
            
    // Im Backend überspringen
            
    $request $this->requestStack->getCurrentRequest();
            if (
    $request && strpos($request->get('_route'), 'contao_backend') === 0) {
                return 
    $this->generator->generate($name$parameters$referenceType);
            }

            
    $objPage $parameters["_content"]; // PageModel der Zielseite
            
    $parameters["parameters"] = '/1'// Beliebige Parameter setzen
            
            
    return $this->generator->generate($name$parameters$referenceType);
        }

        public function 
    setContext(RequestContext $context)
        {
            
    $this->generator->setContext($context);
        }

        public function 
    getContext(): RequestContext                                     
        
    {
            return 
    $this->generator->getContext();
        }

    VG
    Dennis
    Geändert von chatjack (28.09.2023 um 00:02 Uhr)

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
  •