Contao-Camp 2024
Ergebnis 1 bis 12 von 12

Thema: Routing in Contao 4.4

  1. #1
    Contao-Nutzer
    Registriert seit
    28.05.2020.
    Beiträge
    21

    Standard Routing in Contao 4.4

    Hi,
    Wie kann man in Conto 4.4 eine URL so umschreiben, dass folgendes Schema greift:

    domain.tld/ArtikelKnoten/parameter1/parameter2...

    Damit möchte ich weg von:
    domain.tld/ArtikelKnoten/bimbom.html?parameter=1&parameter=2

    Im Internet habe ich einige Hinweise auf eine routing.yml in /app/config gelesen, aber da war leider bezüglich Contao nichts vollständiges dabei.

    Ich habe in das Verzeichnis /app/config geschaut und dort liegt nur die parameters.yml drin.
    Reicht es nun einfach die routing.yml zu erstellen und dort etwas einzutragen?

    Bin für jeden Tipp und weiterführende Infos (HowTo's) dankbar.

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

    Standard

    Meinst du für Contao Seiten? Da geht nur folgendes:

    example.org/page-alias/parameter-name-1/parameter-value-1/parameter-name-2/parameter-value-2

  3. #3
    Contao-Nutzer
    Registriert seit
    28.05.2020.
    Beiträge
    21

    Standard

    Ok, aber wie geht sowas?

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

    Standard

    Was genau möchtest du wissen? Die URL erzeugst du ja selbst, oder nicht?

  5. #5
    Contao-Nutzer
    Registriert seit
    28.05.2020.
    Beiträge
    21

    Standard

    Ich weiß nicht wie genau ich das anders erklären soll..
    also derzeit habe ich eine Seite die ich mit der URL: domain.tld/ArtikelKnoten/artikel.html?parameter=1&parameter=2
    von artikel.html soll das .html weg, die Parameter sollen folgen via /parameter1/parameter2.

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

    Standard

    Ja, wie gesagt, die URL

    domain.tld/ArtikelKnoten/artikel.html?foo=1&bar=2

    wäre gleichzusetzen mit der URL

    domain.tld/ArtikelKnoten/artikel/foo/1/bar/2.html

  7. #7
    Contao-Nutzer
    Registriert seit
    28.05.2020.
    Beiträge
    21

    Standard

    Sorry, ich kann dir nicht ganz folgen. (Bin aber auch noch n newbe mit Contao... ggf. liegts daran)

    Wenn ich die URL wie von dir angegeben anpasse, wird mir ne 404er Fehlerseite ausgegeben.

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

    Standard

    Fragst du die Paramter auch tatsächlich ab? Wenn sich da kein Input::get('foo') und Input::get('bar') auf der Seite befindet, gibt Contao die 404 Seite aus.

  9. #9
    Contao-Nutzer
    Registriert seit
    28.05.2020.
    Beiträge
    21

    Standard

    Ok, danke für deine Hilfe und dein Interesse.

    Ich habe es nun mithilfe dieser Doku (https://easysolutionsit.de/artikel/c...erstellen.html) soweit geschafft ein Routing-Bundle anzulegen und es in Contao einzubinden.
    Ein Test einer Route auf der CLI ist auch erfolgreich.

    screenshot_ 3_34_20.jpg

    Hier ist mal der passende Frontend-Controller den ich zum teste
    PHP-Code:
    <?php
    namespace Torg\Routing\Classes\Controller;
    use 
    Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use 
    Symfony\Component\HttpFoundation\Response;
    use 
    Symfony\Component\HttpFoundation\Request;


    /**
     * Handles front end routes.
     *
     */
    class FrontendController extends Controller
    {
        
    /**
         * Renders the content.
         *
         * @return Response
         *
         */
        
    public function demoAction($name)
        {
            
    $strBuffer '<!DOCTYPE html>
    <html lang="de">
    <head>
      <meta charset="utf-8">
      <title>Frontend Route - Contao Open Source CMS</title>
    </head>
    <body>
           <h1>Frontend Route</h2>
           <p>Parameter: '
    .$name.'</p>
    </body>
    </html>'
    ;
            
    $objResponse = new Response($strBuffer);
            
    $objResponse->headers->set('Content-Type''text/html; charset=UTF-8');
            return 
    $objResponse;
        }

        
    /**
         * Redirect URLs with a Trailing Slash
         *
         * @param Request $request
         * @return \Symfony\Component\HttpFoundation\RedirectResponse
         */
        
    public function removeTrailingSlashAction(Request $request)
        {
            
    $pathInfo   $request->getPathInfo();
            
    $requestUri $request->getRequestUri();

            
    $url str_replace($pathInfortrim($pathInfo' /'), $requestUri);

            return 
    $this->redirect($url301);
        }
    }

    Wenn ich aber über den Browser gehe, wird mir noch eine 404 Seite angezeigt.
    screenshot_ 3_35_20.jpg

    Gibt es da ggf. noch etwas zu beachten bzw. einzustellen, damit die Seite nicht in einem 404 endet, sondern diese Demo-Ausgabe zurückgibt?

  10. #10
    Contao-Nutzer
    Registriert seit
    28.05.2020.
    Beiträge
    21

    Multimedia

    Ok, gerade selbst gelöst...
    ein composer clearcache mit erneutem einlesen der autoload hat den Erfolg gebracht.

  11. #11
    Contao-Nutzer
    Registriert seit
    28.05.2020.
    Beiträge
    21

    Standard

    Ich habe hier noch eine ergänzende Frage.

    Ich habe es nun soweit hinbekommen, dass das Routing an sich funktioniert. Hier ist mein FrontEndController:

    PHP-Code:
    class FrontendController extends Controller
    {
        public function 
    chapters(Request $request){
            
    $chapterName =  $request->attributes->get('name'); // Parameter in routing.yml === name
            
    $objArticleModel = \ArticleModel::findOneByAlias('chapter'); // Chapter need to be set as Article-Alias!!!
            
    echo "<h1>Chapter: <em>$chapterName</em> ?!</h1>";
            
    var_dump($objArticleModel);
            echo 
    "<hr>";
    /*
            $pageId  = 28; // Page id von DEMO-Artikel 
            $page    = \PageModel::findByPK($pageId); //Page object
            $pageURL = \Controller::generateFrontendUrl($page->row()); //URL
            \Controller::redirect($pageURL); //redirect
    */
    /*
            $pathInfo   = $request->getPathInfo();
            $requestUri = $request->getRequestUri();

            $url = str_replace($pathInfo, rtrim($pathInfo, ' /'), $requestUri);

            return $this->redirect($url, 301);
    */
        

    Jetzt habe ich in einem Artikel mit dem Alias chapter eine MetaCollection, und möchte diesen Artikel über dieses Routing aufrufen.
    In dem Artikel soll dann über den Parameter name aus der MetaCollection ein Chapter gesucht und ausgegeben werden.

    Im einzelnen funktioniert das schon... also das routing an sich (bis zum FE-controller) und auch der Artikel der einen Parameter annimmt und dann die richtige Ausgabe macht.
    Was mir noch fehlt ist die Verbindung von beidem.

    Das ich da schon etwas rumprobiert habe, sieht man oben im auskommentierten Bereich des FE-Controllers. Mir ist nicht ganz klar, wie genau ich das so hinbekomme, das der Link im Browser identisch bleibt... also hier kein Redirect gemacht wird, den der User später im Browser auch sieht.

    Die gesamte Ausgabe nun im Frontend-Controller zu Programmieren scheint mir sehr unsauber zu sein, da dies ja in den View und nicht in den Controller gehört... was wäre hier eine saubere "Contao"-Lösung den Artikel vom FE-Controller aus anzusprechen?

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

    Standard

    Ein eigener Controller ist nicht die Lösung, da du dich dann außerhalb des Page Rendering Contexts von Contao befindest. Da müsstest du die gesamte Seite selbst rendern.

    Innerhalb einer Seite kannst du wie schon von mir erwähnt vorgehen - oder den getPageIdFromUrl Hook benutzen.

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
  •