Ergebnis 1 bis 9 von 9

Thema: isAjaxRequest und Frontendmodule

  1. #1
    Contao-Nutzer Avatar von a-v-l
    Registriert seit
    20.09.2013.
    Ort
    Freiburg im Breisgau
    Beiträge
    88

    Standard isAjaxRequest und Frontendmodule

    Guten Tag,

    ich habe eine Sammlung an Artikeln und möchte diese mit einer Art Paginierung ausgeben. Also erst 10 (von z.B. 50) Artikel und dann die Möglichkeit per Link /artikel?offset=10 weitere zehn per Ajax dazuladen. Dazu fange ich den Klick auf den Link per JavaScript ab und schicke einen entsprechenden AjaxRequest raus. Im Controller prüfe ich per Environment::get('isAjaxRequest') ob es sich um einen AjaxRequest oder eine normale HTTP-Anfrage mit Query-String (offset=10) handelt – ich möchte nämlich, dass die Seite auch bei deaktiviertem JavaScript funktioniert.

    Nun stehe ich vor dem Problem, dass meine Methode getResponse in der Controller-Klasse eine Response als Rückgabewert verlangt (return $template->getResponse()) und ich nicht einfach ein JSON ausgeben kann (womit ich dann die geladenen Artikel an die bereits vorhandenen anhängen würde).

    Wie kann ich mit dem gleichen Frontendmodul einmal ein angegebenes Template rendern lassen (normales Verhalten) oder (bei AjaxRequest) lediglich ein im Controller aufgebautes JSON?

    Also in etwa:

    PHP-Code:
    class MyModuleController extends AbstractFrontendModuleController
    {
        protected function 
    getResponse(Template $templateRequest $request): Response
        
    {
            
    // do stuff
            
    if (Environment::get('isAjaxRequest')) {
                return 
    $json;
            }
            return 
    $template->getResponse(); // wird von mod_my_module.html5 verarbeitet
        
    }

    Danke für alle Hinweise!
    Geändert von a-v-l (14.09.2022 um 18:06 Uhr)

  2. #2
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.718
    User beschenken
    Wunschliste

    Standard

    Guck mal in die Ajax-Erweiterungen von Richard oder T42 rein...

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

    Standard

    PHP-Code:
    throw ResponseException(new JsonResponse($data)); 
    Das ist aber ein wenig eine Holzhammermethode und funktioniert nur, wenn sonst nichts auf AJAX Requests auf der selben Seite reagieren will.
    » sponsor me via GitHub or PayPal or Revolut

  4. #4
    Contao-Nutzer Avatar von a-v-l
    Registriert seit
    20.09.2013.
    Ort
    Freiburg im Breisgau
    Beiträge
    88

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    PHP-Code:
    throw ResponseException(new JsonResponse($data)); 
    Das ist aber ein wenig eine Holzhammermethode…
    Nur für das Verständnis: Wieso schlägst du hier eine ResponseException vor? Und gibt es Vor- oder Nachteile, wenn ich einfach den JsonResponse ausgebe und mit exit abschließe:
    PHP-Code:
    if (Environment::get('isAjaxRequest'/* && $whatever === true */) {
        
    $response = new JsonResponse($data);
        
    $response->send();
        exit;

    Zitat Zitat von Spooky Beitrag anzeigen
    …und funktioniert nur, wenn sonst nichts auf AJAX Requests auf der selben Seite reagieren will.
    Na ja, ich kann ja noch ein paar weitere Bedingungen als nur Environment::get('isAjaxRequest') stellen…

  5. #5
    Contao-Nutzer Avatar von BennyBorn
    Registriert seit
    10.06.2011.
    Ort
    Edenkoben
    Beiträge
    240
    Partner-ID
    6916

    Standard

    Zitat Zitat von a-v-l Beitrag anzeigen
    Und gibt es Vor- oder Nachteile, wenn ich einfach den JsonResponse ausgebe und mit exit
    Warum ausgeben? Nimm doch einfach den JsonResponse und returne ihn, dann haste den passenden Rückgabetyp
    Geändert von BennyBorn (15.09.2022 um 11:21 Uhr)

  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

    Das wird bei einem Modul allerdings nicht funktionieren (bzw. ich weiß gar nicht was dann passiert).
    » sponsor me via GitHub or PayPal or Revolut

  7. #7
    Contao-Nutzer Avatar von BennyBorn
    Registriert seit
    10.06.2011.
    Ort
    Edenkoben
    Beiträge
    240
    Partner-ID
    6916

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Das wird bei einem Modul allerdings nicht funktionieren (bzw. ich weiß gar nicht was dann passiert).
    Stimmt, gerade nochmal nachgesehen, dann doch mit ResponseException.

  8. #8
    Contao-Nutzer Avatar von a-v-l
    Registriert seit
    20.09.2013.
    Ort
    Freiburg im Breisgau
    Beiträge
    88

    Standard

    Zitat Zitat von BennyBorn Beitrag anzeigen
    Warum ausgeben? Nimm doch einfach den JsonResponse und returne ihn, dann haste den passenden Rückgabetyp
    Na ja, das Ganze ist ja ein FrontendModul. Und wenn die Methode getResponse irgendwas wiedergibt ("returnt"), dann wird das auf der Webseite eben an der Stelle ausgegeben, wo das FontendModul eingebunden ist – inklusive der ganzen HTML-Struktur drum rum. Wenn $data = {'foo': 'bar'}, dann steht das eben irgendwo auf der Seite.

    Ich könnte natürlich einfach ganz normal Paginieren, die ganze HTML-Antwort abfangen und nach den Elementen filtern, die ich haben will. https://github.com/trilobit-gmbh/con...ination-bundle macht das so. Das finde ich aber sehr unschön (Holzhammer-Methode).

    Ich verwende jetzt folgendes (außer es gibt gute Gründe das nicht zu tun):
    PHP-Code:
    if (Environment::get('isAjaxRequest')) {
        
    $response = new JsonResponse($template->getData()['myElements']->fetchAll());
        
    $response->send();
        exit;


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

    Standard

    Da kannst du genau so gut das verwenden: https://community.contao.org/de/show...l=1#post563135
    » sponsor me via GitHub or PayPal or Revolut

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
  •