Ergebnis 1 bis 5 von 5

Thema: Ajax, JSON Response, Template und Caching

  1. #1
    Contao-Nutzer Avatar von adressler
    Registriert seit
    09.03.2012.
    Ort
    Bonn
    Beiträge
    11

    Standard Ajax, JSON Response, Template und Caching

    Hallo,

    wie die Überschrift schon ausdrückt, geht es um die Verquickung einiger Dinge. Mein Vorhaben:
    Ich lade sämtliche Inhalte per Ajax (über jQuery) nach und stelle sie mit Übergangseffekten auf der Seite dar. Das funktioniert prima. Da ich für die Darstellung Zugriff auf die einzelnen Container brauche, möchte ich als Response kein HTML, sondern JSON haben. DOM-Parsing per Javascript geht zwar auch, aber schon beim kleinsten HTML-Fehler steigt der IE aus, was mir zu unstabil ist. Daher habe ich es folgendermaßen gelöst:

    Im Template fe_page.html5 steht im Kopf sinngemäß folgender Code:
    PHP-Code:
    if ($_SERVER["HTTP_X_REQUESTED_WITH"] == 'XMLHttpRequest') {
        echo 
    json_encode(array(
            
    'class' => $this->class,
            
    'main' => $this->replaceInsertTags($this->main),
            
    'header' => $this->header,
            
    'footer' => $this->footer,
            
    'showroom' => $this->getCustomSection('Showroom'),
        ));
        exit;

    Auch das funktioniert prima - aber nur, solange das Caching abgeschaltet ist. Denn im Cache landet immer die HTML-Version (da der Ajax-Call mit dem exit; beendet wird) und die Ajax-Requests würden dann die falschen Daten aus dem Cache bekommen.

    Wie kann ich das Problem lösen? Getrennte fe_page-Templates für HTML und Ajax/JSON-Anfragen wären super, mit gesondertem Caching. Beispielsweise könnte ich statt home.html eine Anfrage an home.json stellen, welche dann ein fe_page.json-Template nutzen würde und in einem anderen Cache-File landet. Oder aber ein getrenntes Caching für Ajax Requests. Gibt es eine Best Practise in Contao hierfür?

    Vielen Dank schonmal für Eure Hilfe!
    Grüße
    Armin

  2. #2
    Contao-Nutzer Avatar von adressler
    Registriert seit
    09.03.2012.
    Ort
    Bonn
    Beiträge
    11

    Standard

    Ich würde das Thema auch ein Jahr später gerne nochmal pushen. Kurze Zusammenfassung:

    Ich würde gerne
    - die Endung .json mit dem Page-Template fe_page.json beantworten
    - oder allgemein XMLHttpRequests (Ajax calls) mit einem eigenen Template beantworten

    In beiden Fällen wäre es toll, wenn der Contao-Cache zwischen 'normalen' und Ajax-Requests unterscheiden könnte. Bei der Lösung im Codebeispiel oben wird nur der html-Output gecacht, nicht aber der JSON-Output.

    bin für jeden Tipp dankbar!

  3. #3
    Contao-Nutzer Avatar von adressler
    Registriert seit
    09.03.2012.
    Ort
    Bonn
    Beiträge
    11

    Standard

    Ich habe eine Lösung mit Hilfe einer Änderung aus dem Contao 3.1 Milestone hinbekommen (Ticket #4736 "generatePage-Hook zu spät"). Leider muss ich damit warten, bis 3.1 released wird, damit das ganze updatesicher wird.

    Der Code sieht folgendermaßen aus:

    PHP-Code:
    $GLOBALS['TL_HOOKS']['getPageLayout'][] = array('JSONResponse''onGetPageLayout');

    class 
    JSONResponse extends Frontend {
        public function 
    onGetPageLayout(PageModel $objPageLayoutModel $objLayoutPageRegular $objPageRegular
        {
            if (
    $_SERVER["HTTP_X_REQUESTED_WITH"] == 'XMLHttpRequest') {
                
    $objLayout->template .= '.json';
            }
        }

    So wird ein Ajax-Request durch das Template fe_page.json.html5 beantwortet anstelle fe_page.html. Würde man
    PHP-Code:
    $objLayout->doctype 'json'
    setzen, müsste man sämtliche Templates als .json-Variante hinterlegen, was mir zu viel Arbeit und für meine Belange auch unnötig ist. Allerdings ist mir jetzt nicht ganz klar, wie ich so den passenden application/json-Header setzen kann. Ideen?

  4. #4
    Gesperrt
    Registriert seit
    20.10.2011.
    Beiträge
    163

    Standard

    Mich wundert das es hier nicht mehr Fragen dazu gibt, denn das ist eigentlich ein cooles Thema...
    Übrigens sollte

    header('Content-Type: application/json');

    Ohne Probleme funktionieren...

  5. #5
    Contao-Nutzer
    Registriert seit
    07.12.2009.
    Beiträge
    151

    Standard

    Stimmt, sehe ich auch so. Ich habe auf der Platte ein kleines Modul ähnlich dem Code, den adressler oben gepostet hat. Handelt es sich um ein Ajax-Request, wird ein anderes Template als das standardmäßig Ausgewählte ausgeliefert. Hatte mir allerdings noch keine Gedanken um die Anbindung im Frontend gemacht. Könnte man allerdings mal mit https://github.com/browserstate/ajaxify im Hinterkopf weiterspinnen.

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
  •