Ergebnis 1 bis 12 von 12

Thema: Lesbare URL's erstellen und auswerten

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

    Standard Lesbare URL's erstellen und auswerten

    Zur Zeit baue ich in meinen Erweiterungen URL's so zusammen:
    Code:
    domain.de/seite/para1/wert1/para2/wert2.html
    und hole die Parameter mit beispielsweise
    PHP-Code:
    \Input::setGet('para1', \Input::get('para1'));
    $para1 = \Input::get('para1')
    \
    Input::setGet('para2', \Input::get('para2'));
    $para2 = \Input::get('para2'
    in mein Modul.

    Jetzt würde ich aber gern auch solche URL's erstellen wollen:
    Code:
    domain.de/seite/wert1/wert2.html
    Wie komme ich denn jetzt da ran? Theoretisch würde ich in der URL-Umschreibung jetzt erwarten:
    Code:
    domain.de/seite.html?wert1=wert2
    wert1 wäre dann einer der GET-Parameter, aus dem ich intern einen Variablenwert machen würde: $para1 (= "wert1").
    Und wert2 wäre dementsprechend in meinem Modul: $para2 (= "wert2").

    Falls das technisch so abläuft, müßte ich mir eine kleine Funktion schreiben, die die Parameter entsprechend "übersetzt". Oder gibt es noch andere Möglichkeiten?
    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

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

    Standard

    Am besten wertest du diese Parameter in einem getPageIdFromUrl Hook aus. Dort überprüfst du die Fragments und gibst dann ein Array zurück, dass zB folgendes enthält:
    PHP-Code:
    array(
        
    'seite',
        
    'para1',
        
    'wert1',
        
    'para2',
        
    'wert2'

    Dadurch sind danach wert1 und wert2 automatisch über \Input::get('para1') bzw. \Input::get('para2') verfügbar.

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

    Standard

    Okay, mit dem Beispiel in der Doku komme ich soweit klar:
    PHP-Code:
    // config.php
    $GLOBALS['TL_HOOKS']['getPageIdFromUrl'][] = array('MyClass''myGetPageIdFromUrl');

    // MyClass.php
    public function myGetPageIdFromUrl($arrFragments)
    {
        return 
    array_unique($arrFragments);

    Jetzt ist aber die Frage, wie ich auf den Rückgabewert zugreifen kann.
    PHP-Code:
    echo \MyClass::myGetPageIdFromUrl(); 
    funktioniert ja nicht, weil der Parameter $arrFragments fehlt.

    Ich habe es versucht mit:
    PHP-Code:
    class MyClass
    {
            var 
    $Fragmente;

        public function 
    myGetPageIdFromUrl($arrFragments)
        {
            
    $this->Fragmente $arrFragments;
        }

        public function 
    Fragmentos()
        {
            
    print_r($this->Fragmente);
        }

    Bei Aufruf der Funktion Fragmentos wird aber rein gar nichts angezeigt, auch keine PHP-Fehler. Schreibe ich das print_r in die Funktion myGetPageIdFromUrl, habe ich das von Dir prophezeite Array.

    Auch das Wiki hat mir nicht weitergeholfen. Der Artikel dort ist unvollständig, weil schlicht der Code fehlt, wie man auf den Wert zugreifen kann.

    Mir stellt sich auch die Frage, warum ich einen Hook nehmen soll. Es gibt doch
    PHP-Code:
    \Frontend::getPageIdFromUrl() 
    Oder ist das nicht dasselbe?
    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

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

    Standard

    Ich glaube du verstehst den Hook falsch. Im einfachsten Fall gibst du bei diesem Hook ein Array mit nur einem Wert zurück, zB die geforderte Page ID oder deren Alias.

    In deinem Fall willst du die Fragmente des Requests analysieren und dann dementsprechend ein verarbeitetes Fragment Array zurückgeben, damit diese Fragmente dann von Contao automatisch über die entsprechenden Parameter zur Verfügung stellt. Das Array, dass du in deinem Hook zurück gibst, sollte dann eben so aussehen, wie ich in Post #2 erwähnt habe.

    Alternativ kannst du in deinem Hook auch einfach selbst \Input::setGet(…) aufrufen und dann wiederum nur ein Fragment zurückgeben (also die Page ID bzw. den Page Alias).

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

    Standard

    Ich lasse mir mal Deine Worte durch den Kopf gehen.
    Im Moment ist es so, wenn der Hook in config.php eingetragen ist, lande ich immer auf der Startseite, also
    Code:
    http://localhost/index.html
    Angezeigt wird als URL aber
    Code:
    http://localhost/verein/zps/D2024.html
    Kommentiere ich den Hook aus, lande ich wirklich auf meiner URL und mein Modul kann mit dem Arbeiten anfangen.

    Der Effekt mit der Startseite ist demzufolge auch schuld daran, das nichts in meinem Modul ankam.
    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
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.094
    Partner-ID
    10107

    Standard

    Poste mal den aktuellen Code deines Hooks.

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

    Standard

    config.php:
    PHP-Code:
    <?php if (!defined('TL_ROOT')) die('You cannot access this file directly!');

    define(CACHE_AKTIVfalse); // Cachestatus
    define(CACHE_TIME36000); // Cachezeit
    define(CACHE_DIRTL_ROOT '/system/cache/dewis/'); // Cacheverzeichnis festlegen

    define(KARTEISPERRE_GAESTEfalse); // Anzeige von Karteikarten für nichtangemeldete Besucher gesperrt

    define(PASSIVE_AUSBLENDENtrue); // Anzeige passiver Spieler
    define(GEBURTSJAHR_AUSBLENDENtrue); // Anzeige des Geburtsjahres
    define(GESCHLECHT_AUSBLENDENtrue); // Anzeige des Geschlechtes

    define(ALIAS_SUCHE'dewis'); // Suchseite
    define(ALIAS_SPIELER'spieler'); // Spielerseite
    define(ALIAS_VEREIN'verein'); // Vereineseite
    define(ALIAS_VERBAND'verband'); // Verbändeseite
    define(ALIAS_TURNIER'turnier'); // Turniereseite
    define(SEITE_EINSTELLUNGEN'dwz-einstellungen.html'); // Suchseite

    $GLOBALS['FE_MOD']['dewis'] = array
    (
        
    'dewis_einstellungen' => 'Einstellungen',
        
    //'dewis_spielersuche'  => 'DeWIS\Suche',
        
    'dewis_spieler'            => 'DeWIS\Spieler',
        
    'dewis_verein'            => 'DeWIS\Verein',
    );

    $GLOBALS['TL_HOOKS']['getPageIdFromUrl'][] = array('DeWIS\DeWIS''myGetPageIdFromUrl');
    autoload.php:
    PHP-Code:
    <?php

    /**
     * Register the namespaces
     */
    ClassLoader::addNamespaces(array
    (
        
    'DeWIS',
    ));
     

    /**
     * Register the classes
     */
    ClassLoader::addClasses(array
    (
        
    // Classes
        
    'DeWIS\DeWIS'                => 'system/modules/dewis/helper/DeWIS.php',
        
    'DeWIS\Cache'                => 'system/modules/dewis/helper/Cache.php',
        
    'DeWIS\Helper'                => 'system/modules/dewis/helper/Helper.php',
        
    //'DeWIS\Suche'                => 'system/modules/dewis/classes/Suche.php',
        
    'DeWIS\Spieler'                => 'system/modules/dewis/classes/Spieler.php',
        
    'DeWIS\Verein'                => 'system/modules/dewis/classes/Verein.php',
    ));


    /**
     * Register the templates
     */
    TemplateLoader::addFiles(array
    (
        
    //'dewis_spielersuche'        => 'system/modules/dewis/templates',
        
    'dewis_sub_spielersuche'    => 'system/modules/dewis/templates',
        
    'dewis_spieler'                => 'system/modules/dewis/templates',
        
    'dewis_sub_vereinsuche'        => 'system/modules/dewis/templates',
        
    'dewis_verein'                => 'system/modules/dewis/templates',
        
    'be_dewis'                    => 'system/modules/dewis/templates',
    ));
    helper/DeWIS.php (uninteressante Funktionen entfernt):
    PHP-Code:
    <?php

    namespace DeWIS;
     
    class 
    DeWIS
    {

        var 
    $Fragmente;

        
    /**
         * Klasse initialisieren
         */
        
    public function __construct()
        {
            
    $this->answertime false// Antwortzeit des Servers
            
    $this->Fragmente '';
        }

        public function 
    myGetPageIdFromUrl($arrFragments)
        {
            
    $this->Fragmente $arrFragments;
        }

        public function 
    Fragmentos()
        {
            
    print_r($this->Fragmente);
        }

    }
    Der Hook ist in der config.php hier aktiv. Ich lande deshalb automatisch auf der Startseite (bei Beibehaltung der aufgerufenen URL), wo mein FE-Modul natürlich nicht aktiv ist.

    Ich könnte auch eine ZIP-Datei mit der ganzen Erweiterung posten. Aber ich will es nicht übertreiben. Du hast schon genug mit dem Support zu tun. Letztendlich läuft ja Dein Vorschlag darauf hinaus, aus dem Array in Posting #2, sich selbst alle Werte zusammenzubauen. In dem Fall wäre meine derzeitige Abfrage im FE-Modul
    PHP-Code:
    \Input::setGet('zps', \Input::get('zps')); // ZPS-Nummer des Vereins
    \Input::setGet('search', \Input::get('search')); // Suchbegriff
    \Input::setGet('order', \Input::get('order')); // Sortierung 
    ja überflüssig bzw. unmöglich. Allerdings reagiert Contao auch sehr empfindlich. Sobald ich eine der GET-Variablen mit \Input:setGet vergesse, kommt ein 404-Fehler.

    Ich habe mir auch mal Funktion \Frontend::getPageIdFromUrl in meine Helper-Klasse kopiert. Auf Modifizierungen darin reagiert Contao aber auch allergisch und meldet einen 404.

    Mein Ziel ist noch immer, aus
    Code:
    http://localhost/verein/zps/D2024.html
    Code:
    http://localhost/verein/D2024.html
    zu machen.
    Oder aus
    Code:
    http://localhost/turnier/code/B245-200-OPN/player/234567.html
    Code:
    http://localhost/turnier/B245-200-OPN/234567.html
    Die decodierten URL's würden wohl entsprechend lauten
    Code:
    http://localhost/verein.html?zps=D2024
    Code:
    http://localhost/verein.html?D2024
    und
    Code:
    http://localhost/turnier.html?code=B245-200-OPN&player=234567
    Code:
    http://localhost/turnier.html?B245-200-OPN=234567
    In "reinem" PHP will ich daraus
    PHP-Code:
    foreach($_GET as $key => value)
    {
      
    // In Beispiel 1 ist $key = 'D2024' und $value = '', daraus folgt
      
    $zps $key;
      
    // In Beispiel 2 ist $key = 'B245-200-OPN' und $value = '234567', daraus folgt
      
    $code $key;
      
    $player $value;

    machen.
    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
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.094
    Partner-ID
    10107

    Standard

    Wie schon erwähnt erwartet der Hook ein Array aus Fragmenten als Rückgabewert. Dein Hook gibt aber gar nichts zurück:
    PHP-Code:
        public function myGetPageIdFromUrl($arrFragments)
        {
            
    $this->Fragmente $arrFragments;
        } 
    Daher landest du auch einfach auf der Startseite.

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

    Standard

    Okay, verstanden. Ist wahrscheinlich so entstanden, weil ich ja irgendwie an die Werte rankommen muß.
    PHP-Code:
    $pageId = \DeWIS\DeWIS::myGetPageIdFromUrl(false);
    $pageId = \DeWIS\DeWIS::myGetPageIdFromUrl(); 
    funktioniert ja beides nicht in meinem FE-Modul. Beim zweiten Aufruf wird das Argument vermißt. Wie komme ich denn sonst an den return-Wert heran?
    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

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

    Standard

    Du rufst den Hook ja nicht auf! Sonst bräuchtest du ja keinen Hook .

    Nochmal von vorne: im getPageIdFromUrl Hook prozessierst du deine Fragments, ermittelst ob du sie überhaupt prozessieren kannst oder musst (und gibst sie ansonsten 1:1 zurück), wenn du sie prozessieren kannst/musst, dann findest du raus, welcher Wert für welchen Parameter steht und gibst dementsprechend neue Fragments in der Form wie in Post #2 beschrieben zurück. Danach kannst du, wie schon in Post #2 gesagt, ganz einfach per \Input::get(…) auf deine Parameter zugreifen.

    Oder, wie in #4 erwähnt, du schreibst die Fragmente selbst per \Input::setGet(…) und gibst statt dessen nur die aufgerufene Seite als Fragment zurück.

    Die Schwierigkeit an der Sache ist herauszufinden, ob jetzt die Fragmente "zu deinem Modul" gehören oder nicht. Denn http://localhost/turnier/B245-200-OPN/234567.html könnte auch eine ganz normale Folder URL sein. Oder http://localhost/verein/D2024.html könnte auch eine URL mit auto_item Parameter sein.

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

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Du rufst den Hook ja nicht auf! Sonst bräuchtest du ja keinen Hook .
    Ich habe mit Hooks noch nie so richtig intensiv gearbeitet. Aber sie scheinen wohl weitgehend identisch mit Callbacks: Contao gibt mir irgendwelche Parameter für meine Funktion, ich gehe über die Parameter drüber, schaue nach was für mich zutrifft und gebe das Array ggfs. modifiziert wieder zurück. Danach kann ich in meinem FE-Modul ganz normal mit \Input::get darauf zugreifen. Habe ich es soweit richtig verstanden?

    Zitat Zitat von Spooky Beitrag anzeigen
    Die Schwierigkeit an der Sache ist herauszufinden, ob jetzt die Fragmente "zu deinem Modul" gehören oder nicht. Denn http://localhost/turnier/B245-200-OPN/234567.html könnte auch eine ganz normale Folder URL sein. Oder http://localhost/verein/D2024.html könnte auch eine URL mit auto_item Parameter sein.
    Okay, da der Hook in config.php steht, wird meine Hook-Funktion abgearbeitet, auch wenn mein Modul nicht betroffen ist. Dann werde ich mal anfangen zu experimentieren. Über meine Konstanten in config.php weiß ich ja wenigstens schon die Seitenaliase, die übereinstimmen müssen.
    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

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

    Standard

    Zitat Zitat von Samson1964 Beitrag anzeigen
    Ich habe mit Hooks noch nie so richtig intensiv gearbeitet. Aber sie scheinen wohl weitgehend identisch mit Callbacks: Contao gibt mir irgendwelche Parameter für meine Funktion, ich gehe über die Parameter drüber, schaue nach was für mich zutrifft und gebe das Array ggfs. modifiziert wieder zurück. Danach kann ich in meinem FE-Modul ganz normal mit \Input::get darauf zugreifen. Habe ich es soweit richtig verstanden?
    Genau


    Zitat Zitat von Samson1964 Beitrag anzeigen
    Okay, da der Hook in config.php steht, wird meine Hook-Funktion abgearbeitet, auch wenn mein Modul nicht betroffen ist. Dann werde ich mal anfangen zu experimentieren. Über meine Konstanten in config.php weiß ich ja wenigstens schon die Seitenaliase, die übereinstimmen müssen.
    Ok, wenn die Seitenaliase, auf denen sich die Module befinden, statisch festgelegt sind, dann ist es trivial. Dann brauchst du nur überprüfen ob
    PHP-Code:
    $arrFragments[0] == DEIN_SEITEN_ALIAS 
    übereinstimmt und dann $arrFragments weiter prozessieren (und am ende return $arrFragments).

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
  •