Danke für ein interessantes Contao Camp am 03. & 04. November 2018 & Contao College am 02. November 2018 im Basislager Leipzig, Deutschland
Ergebnis 1 bis 8 von 8

Thema: Parameterabfrage von generateFrontendUrl()

  1. #1
    Contao-Fan
    Registriert seit
    10.03.2011.
    Beiträge
    340

    Standard Parameterabfrage von generateFrontendUrl()

    Hallo zusammen,

    Ich würde gerne aus meinem List-Modul auf eine Detailseite verlinken. Um die richtigen Inhalte angezeigt zu bekommen, muss ich eine ID übergeben. Ich würde daher folgendes machen:

    $objDetailPage = //Laden der Page
    $url = $this->generateFrontendUrl($objDetailPage, "/".$id."/");

    Wie komme ich nun in meinem Detailmodul auf der neuen Seite an diese ID der Url und was muss ich machen, damit ich die Seite überhaupt aufrufen kann? Aktuell bekomme ich immer ein Seite nicht gefunden.

    Danke!

  2. #2
    Contao-Nutzer
    Registriert seit
    17.09.2010.
    Beiträge
    156

    Standard

    Ich hab' mir für diesen Zweck -wenn ich die Frage denn richtig verstanden habe- die folgende RIESEN-Funktion geschrieben:

    Code:
    function getFrontendUrl( $pageId , $params )
    {
       $retval = "";
    
       if ( ( $jumpTo = \PageModel::findByPk( $pageId ) ) !== null )
       {
          $retval = \Controller::generateFrontendUrl( $jumpTo->row() );
          $retval .= ( strstr( $retval , "?" ) ? "&" : "?" ) . $params;
       }
    
       return $retval;
    }
    Die $pageId stammt aus den Systemeinstellungen und wird dort ausgewählt - aber sie kann natürlich auch "von sonst wo" stammen.

  3. #3
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Vienna, Austria
    Beiträge
    18.157
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von gerritlo Beitrag anzeigen
    Hallo zusammen,

    Ich würde gerne aus meinem List-Modul auf eine Detailseite verlinken. Um die richtigen Inhalte angezeigt zu bekommen, muss ich eine ID übergeben. Ich würde daher folgendes machen:

    $objDetailPage = //Laden der Page
    $url = $this->generateFrontendUrl($objDetailPage, "/".$id."/");

    Wie komme ich nun in meinem Detailmodul auf der neuen Seite an diese ID der Url und was muss ich machen, damit ich die Seite überhaupt aufrufen kann? Aktuell bekomme ich immer ein Seite nicht gefunden.

    Danke!
    Sollte es nicht eigentlich
    PHP-Code:
    $url $this->generateFrontendUrl$objDetailPage->row() , "/".$id ); 
    sein?

    Auf der Detail Seite muss dein Reader Modul dann auch diesen Parameter abfragen. Sieh' dir das in den Core Modulen an (bspw. im ModuleNewsReader):
    PHP-Code:
        public function generate()
        {
            ...

            
    // Set the item from the auto_item parameter
            
    if (!isset($_GET['items']) && $GLOBALS['TL_CONFIG']['useAutoItem'] && isset($_GET['auto_item']))
            {
                \
    Input::setGet('items', \Input::get('auto_item'));
            }

            ...

            return 
    parent::generate();
        } 
    Nur dann kommt dann nicht "Seite nicht gefunden", weil Contao dann weiß, dass hier ein Modul auf einen auto_item Parameter "horcht".

  4. #4
    Contao-Fan
    Registriert seit
    10.03.2011.
    Beiträge
    340

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Sollte es nicht eigentlich
    PHP-Code:
    $url $this->generateFrontendUrl$objDetailPage->row() , "/".$id ); 
    sein?
    Sorry, das stimmt natürlich.

    Ich habe in der Klasse mir die Methode getPageIdFromUrl() angesehen, die ja zum Start von Contao in der index.php aufgerufen wird. Meinem Verständnis werden mit dem beigefügten Coding alle Parameter den $_GET-Parametern zugeordnet. Ist das nicht korrekt?

    PHP-Code:
        // Use folder-style URLs
    if (\Config::get('folderUrl') && strpos($strRequest'/') !== false)
    {
    $strAlias $strRequest;
    $arrOptions = array($strAlias);

    // Compile all possible aliases by applying dirname() to the request (e.g. news/archive/item, news/archive, news)
    while ($strAlias != '/' && strpos($strAlias'/') !== false)
    {
    $strAlias dirname($strAlias);
    $arrOptions[] = $strAlias;
    }

    // Check if there are pages with a matching alias
    $objPages = \PageModel::findByAliases($arrOptions);

    if (
    $objPages !== null)
    {
    $arrPages = array();

    // Order by domain and language
    while ($objPages->next())
    {
    $objPage $objPages->current()->loadDetails();

    $domain $objPage->domain ?: '*';
    $arrPages[$domain][$objPage->rootLanguage][] = $objPage;

    // Also store the fallback language
    if ($objPage->rootIsFallback)
    {
    $arrPages[$domain]['*'][] = $objPage;
    }
    }

    $strHost = \Environment::get('host');

    // Look for a root page whose domain name matches the host name
    if (isset($arrPages[$strHost]))
    {
    $arrLangs $arrPages[$strHost];
    }
    else
    {
    $arrLangs $arrPages['*']; // Empty domain
    }

    $arrAliases = array();

    // Use the first result (see #4872)
    if (!\Config::get('addLanguageToUrl'))
    {
    $arrAliases current($arrLangs);
    }
    // Try to find a page matching the language parameter
    elseif (($lang = \Input::get('language')) != '' && isset($arrLangs[$lang]))
    {
    $arrAliases $arrLangs[$lang];
    }

    // Return if there are no matches
    if (empty($arrAliases))
    {
    return 
    false;
    }

    $objPage $arrAliases[0];

    // The request consists of the alias only
    if ($strRequest == $objPage->alias)
    {
    $arrFragments = array($strRequest);
    }
    // Remove the alias from the request string, explode it and then re-insert the alias at the beginning
    else
    {
    $arrFragments explode('/'substr($strRequeststrlen($objPage->alias) + 1));
    array_unshift($arrFragments$objPage->alias);
    }


  5. #5
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.192

    Standard

    So ganz funktioniert die Verarbeitung der URL bei mir noch nicht.
    Ich generiere einen Link mit
    PHP-Code:
    $this->Template->Url $this->generateFrontendUrl($objPage->row(), '/wert1/innen/wert2/aussen'); 
    Daraus wird im FE:
    Code:
    http://localhost/impressions/wert1/innen/wert2/aussen.html
    wenn ich auf der Seite impressions.html bin.

    Rufe ich den Link auf, würde ich gern auf impressions.html bleiben. Aber es kommt beim Aufruf des Links ein 404-Fehler. Oben stand, das ich in der function generate den Fehler abfangen muß, indem ich die Parameter aufdrösele. Wie würde das in meinem Fall aussehen? Das Beispiel oben funktioniert nicht.
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  6. #6
    Contao-Fan
    Registriert seit
    27.06.2012.
    Beiträge
    580

    Standard

    Damit das funktioniert, musst du auf der Seite auch die Parameter abfragen.
    Also solange du nicht Input::get('wert/wert2') abfragst, erhältst du den Fehler denke ich.

  7. #7
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.192

    Standard

    Okay, jetzt scheint es zu klappen. Mein Testcode:
    PHP-Code:
    echo "TEST";
    // Set the item from the auto_item parameter
    if (!isset($_GET['items']) && $GLOBALS['TL_CONFIG']['useAutoItem'] && isset($_GET['auto_item']))
    {
        echo 
    " TEST2";
        \
    Input::setGet('wert1', \Input::get('wert1'));
        \
    Input::setGet('wert2', \Input::get('wert2'));
    }
    else
    {
        echo 
    " TEST3";
        \
    Input::setGet('wert1', \Input::get('wert1'));
        \
    Input::setGet('wert2', \Input::get('wert2'));
        \
    Input::setGet('wert3', \Input::get('wert3'));
        echo \
    Input::get('wert1');

    Die 1. Bedingung wird bei mir ignoriert, kann ich deshalb wohl weglassen. Die 2. Bedingung ist erfolgreich. Man muß allerdings wirklich alle Parameter abfragen, um keinen 404 zu bekommen. Nicht vorhandene Werte können auch abgefragt werden.

    Damit kann ich jetzt was aufbauen.
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

  8. #8
    Contao-Nutzer
    Registriert seit
    15.03.2010.
    Ort
    AT
    Beiträge
    122

    Standard

    Ist setGet in Contao 3.5.20 überhaupt noch notwendig?
    Ich habs mal ohne getestet und der Parameter wird trotzdem ganz normal abgefangen (man kommt nicht auch eine 404er)

    PHP-Code:
    #\Input::setGet('test', \Input::get('test'));
    \Input::get('test'); 

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
  •