MetaModels Workshop in Berlin
Ergebnis 1 bis 16 von 16

Thema: SimpleAjax in Contao 4

  1. #1
    Contao-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    Standard SimpleAjax in Contao 4

    Hallo,

    ich möchte die Erweiterung SimpleAjax (https://github.com/richardhj/contao-simple-ajax) in einem Modul verwenden.
    Bei dem Modul handelt es sich um ein 3.5er Modul – d.h. ein Modul das unter "system/modules" liegt.


    Hier ist meine Klasse welche unter "system/modules/mymodule/classes/MyAjaxListener.php" liegt:
    (Diese Klasse wird in der "autoload.php" geladen.)

    PHP-Code:
    <?php

    class MyAjaxListener
    {
       public function 
    myMethod(\SimpleAjax\Event\SimpleAjax $event)
       {
           if (
    'myrequest' !== \Input::get('acid'))
           {
               return;
           }
           
           
    // Check whether the SimpleAjaxFrontend.php was requested
           
    if (false === $event->isIncludeFrontendExclusive())
           {
               return;
           }
           
           
    $return = ['foo''bar''foobar'];

           
    header('Content-Type: application/json');
           echo 
    json_encode($return);
           exit;
       }
    }




    Hier ist mein Javascript aus dem Frontend-Modul:

    Code:
    $(".mein_link").click(function(e){
         e.preventDefault();	
         $.ajax({
              type: "POST",
              dataType: "json",
              url: "SimpleAjax.php",
              acid: "myrequest",
              success: function(ret){
                   console.log("Success! " + ret);
              },
              error: function(request, status, error){
                   console.log(error);
              },
         });
    });


    Leider klappt das Ganze mit obigem Code jedoch nicht.
    Ich bekomme bei meinen Versuchen immer den HTML-Code der Contao-Login-Seite geladen.
    D.h. die Callback-Funktion "success" wird ausgeführt – sie liefert aber den falschen Inhalt




    Ich weiß das man unter Contao 4 für Ajax mit Routings arbeiten soll.
    Doch leider blicke ich da nicht ganz durch, daher hätte ich wieder auf die Erweiterung "SimpleAjax" gesetzt.
    ... gibt es vielleicht ein einfaches Beispiel, das zeigt wie das mit dem Routing unter Contao 4 funktioniert?


    Bitte um eure Hilfe.
    Danke.

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

    Standard

    Für die URL könntest du idealerweise folgendes in deinem Template schreiben:
    PHP-Code:
    <?= \Contao\System::getContainer()->get('router')->generate('richardhj.simple_ajax.frontend'?>

  3. #3
    Contao-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    Standard

    Danke für den Tipp.
    Das generiert mir die URL "/SimpleAjaxFrontend.php".

    Diese Änderung der URL bewirkt nun den Fehler der am Screenshot hier zu sehen ist:
    Bildschirmfoto 2019-06-15 um 07.30.59.png

    Wenn ich beim Aufruf der Seite das "app_dev.php" in der URL verwende, bekomme ich den Fehler:
    Bildschirmfoto 2019-06-15 um 07.37.51.png
    Beim zweiten Fehler scheint die Funktion "__invoke" der Klasse "SimpleAjaxController.php" zumindest einen Response "HTTP_PRECONDITION_FAILED" zu liefern.
    Beim ersten Fehler wird die Funktion "__invoke" garnicht ausgeführt, nehme ich an.
    Geändert von thesweetg (15.06.2019 um 07:16 Uhr)

  4. #4
    Contao-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    Standard

    Ich habe in diesem Modul hier:
    https://github.com/georgpreissl/ajaxtest
    ... meine Ausgangslage nochmal zusammengefasst.

    Das Modul ist auf das nötigste reduziert und nur dazu da mein Problem zu zeigen.
    Selbiges nochmal kurz geschildert:
    Ich möchte mit diesem Bundle "https://packagist.org/packages/richardhj/contao-simple-ajax" und meinem Modul einen einfachen Ajax-Call im Frontend hinkriegen.

    Mit dem aktuellen Stand des Moduls bekomme ich beim Ajax-Call immer einen "412 (Precondition Failed)"-Fehler zurückgeliefert.

    Bitte um eure Hilfe – freu mich über jeden Tipp/Rat – danke schonmal im Voraus
    Geändert von thesweetg (15.06.2019 um 07:39 Uhr)

  5. #5
    Contao-Urgestein
    Registriert seit
    29.10.2009.
    Beiträge
    1.771
    Partner-ID
    626
    User beschenken
    Wunschliste

    Standard

    Der Name des Events ist nicht die Klasse, sondern ein spezifischer Name: https://github.com/richardhj/contao-...leAjax.php#L26

    Den musst du in der event_listeners.php angeben. Das fiel mir auf den ersten Blick auf.

  6. #6
    Contao-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    Standard

    Danke für den Hinweis.

    Hab ich geändert (auch im Github-Repo: https://github.com/georgpreissl/ajaxtest).
    Leider liefert jedoch der Ajax-Call immer noch ein "412 (Precondition Failed)".

    Weiß vielleicht noch jemand Rat?
    Bin echt über jede Hilfe dankbar.
    Geändert von thesweetg (16.06.2019 um 10:54 Uhr)

  7. #7
    Contao-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    Standard

    Hab jetzt alles an Lösungsansätzen ausprobiert war mir in den Sinn gekommen ist.
    Bekomme immer wieder den Fehler "POST http://meine-installation/SimpleAjaxFrontend.php 412 (Precondition Failed)".

    ... hat keiner mehr einen Tipp für mich – bin schon etwas am verzweifeln

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

    Standard

    Wenn du schon für Contao 4 programmierst würde ich den empfohlenen Weg gehen .

    Also entweder selber einen Controller schreiben - oder einen Service mit dem entsprechenden Event taggen.

  9. #9
    Contao-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    Standard

    @Spooky: Ich hätte es jetzt mal mit diesem Code von dir probiert:
    https://community.contao.org/de/show...l=1#post440081
    Darauf stößt man zuerst wenn man "contao 4 ajax" googelt

    Ich habe den Code hier in einem Repo zusammengefasst:
    https://github.com/georgpreissl/contao-appbundle-ajax


    ... dann habe ich:

    1) Diesen Code aus dem Repo im Root-Verzeichnis meiner Contao-Installation abgelegt

    2) Die composer.json im Root-Verzeichnis mit folgenden Zeilen ergänzt:
    Code:
    {
        …,
        "autoload": {
            "psr-4": { "": "src/" },
            "classmap": ["app/ContaoManagerPlugin.php"]
        }
    }

    3) Das auf der Konsole ausgeführt:
    Code:
    vendor/bin/contao-console cache:clear --no-warmup
    vendor/bin/contao-console cache:warmup
    composer dump-autoload

    4) ... und dann mit diesem Code hier (abgespeichert in einem Frontendmodul-Template) einen jQuery-Ajax-Call probiert:
    Code:
    		$(".test_link").click(function(e){
    			e.preventDefault();
    			
    			$.ajax({
    				type: "POST",
    				dataType: "json",
    				url: "/ajax",
    				success: function(ret){
    					console.log("Success! " + ret);
    				},
    				error: function(request, status, error){
    					console.log(error);
    				},
    			});			
    			return false;
    		});

    Ist das grundsätzlich die richtige Vorgangsweise?
    Funktionieren tut's leider nicht: bekomme einen "404 (Not Found)".
    Ich nehme an die URL beim Ajax-Call stimmt nicht, oder?





    Wenn ich übrigens ein "composer update" ausführe, bekommen ich folgende Fehlermeldung:
    Code:
    In FileLoader.php line 168:
    
      [Semantical Error] The annotation "@Sensio\Bundle\FrameworkExtraBundle\Conf
      iguration\Route" in method AppBundle\Controller\DefaultController::ajaxActi
      on() does not exist, or could not be auto-loaded in /Users/lissabon/Heidlma
      ir Dropbox/Georg Preissl/Websites/athos-contao-4/src/AppBundle/Controller (
      which is being imported from "/Users/lissabon/Heidlmair Dropbox/Georg Preis
      sl/Websites/athos-contao-4/app/../src/AppBundle/Resources/config/routing.ym
      l"). Make sure annotations are installed and enabled.


    Bitte um eure Hilfe.
    Bin mir sicher ich hab da noch einiges falsch gemacht
    Vielen Dank im Voraus!

  10. #10
    Contao-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    Standard

    Ich habe nun einen neuen Versuch gestartet:
    https://github.com/georgpreissl/cont...ajax-appbundle

    Hier handelt es sich nun um ein AppBundle das in Zusammenspiel mit SimpleAjax einen einfachen Ajax-Json-Call erledigen soll.

    Ich habe dieses AppBundle natürlich auch schon getestet – das Ergebnis ist etwas verwirrend für mich:
    Zu Beginn hat es funktioniert: Der Ajax-Call im Frontend mit jQuery hat 'Hello World!' zurückgeliefert.
    Anschließend hatte ich probiert auch Parameter mit zu übergeben – das hat dann nicht funktioniert.
    … und seltsamerweise hat dann auch der Ajax-Call ohne Parameter plötzlich nicht mehr funktioniert

    Würde mich freuen wenn jemand von euch einen Blick drauf werfen würde.
    Das Frontend-Javascript mit dem ich den Ajax-Json-Call mache, habe ich in die README reingepackt.


    Danke im Voraus!

    PS: Wenn ich mit eurer Hilfe das AppBundle zum laufen kriege, kann ich es natürlich auch gerne als Basic-Demo-Bundle zur Verfügung stellen.

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

    Standard

    Da hat sich mittlerweile einiges geändert. Ich habe den Beitrag nochmals editiert, bin mir aber nicht sicher, ob das so reicht.

    Du kannst dir auch mit dem Contao Maker Bundle deine lokale Entwicklung kickstarten.

  12. #12
    Contao-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    Standard

    Danke Spooky.
    Werde das "Contao Maker Bundle" bei Gelegenheit ausprobieren.



    Ich hab nun mein AppBundle das mit SimpleAjax zusammenarbeitet wieder "hingekriegt":
    https://github.com/georgpreissl/cont...ajax-appbundle

    Die Version liefert mir beim Ajax-Call erfolgreich eine Json-Rückmeldung.
    Allerdings immer nur dann wenn ich einen Parameter mitgebe.

    D.h. das hier funktioniert:

    Code:
    $.ajax({
    	type: "POST",
    	dataType: "json",
    	url: "/ajax_tags/foobar",
    	success: function(ret){
    		console.log("Success! " + ret);
    	},
    	error: function(request, status, error){
    		console.log(error);
    	},
    });
    Das hier liefert einen 404-Fehler:
    Code:
    $.ajax({
    	type: "POST",
    	dataType: "json",
    	url: "/ajax_tags",
    	success: function(ret){
    		console.log("Success! " + ret);
    	},
    	error: function(request, status, error){
    		console.log(error);
    	},
    });

    Wenn ein Parameter mitgegeben wird, kann ich ihn in der Controller-Klasse allerdings auch nicht verarbeiten.
    Zumindest weiß ich nicht wie.
    Das hier schlägt fehl, und liefert auch einen 404-Fehler:

    Code:
    namespace AppBundle\Controller; 
    
    
    use Symfony\Component\HttpFoundation\JsonResponse; 
    
    class AjaxTagsController
    {
        public function __invoke($parameter)
        {
        	return new JsonResponse([$parameter]); 
        }
    }

    Kann mich da jemand aufklären?

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

    Standard

    Du hast ja in deiner routing.yml definiert, dass den Parameter "param1" geben muss. Wenn es den nicht gibt, matched auch nicht die route.

  14. #14
    Contao-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    Standard

    OK, danke für den Hinweis.

    Hätte die yml-Datei lt. dieser Anleitung (https://symfony.com/doc/current/rout...ceholders.html) jetzt so abgeändert:
    Code:
    app.ajax_tags:
        path: /ajax_tags/{param1}
        defaults:
            _scope: frontend
            _token_check: false
            _controller: 'AppBundle\Controller\AjaxTagsController'
            { param1: 1 }
    ... funktioniert leider auch nicht.
    Immer noch ein 404-Fehler wenn ich den Ajax-Call ohne Parameter mache.

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

    Standard

    Code:
    app.ajax_tags:
        path: /ajax_tags/{param1}
        defaults:
            _scope: frontend
            _token_check: false
            _controller: 'AppBundle\Controller\AjaxTagsController'
            param1: 1

  16. #16
    Contao-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    Standard

    Danke, hab ich nun so eingetragen.

    Doch der Aufruf mit:
    Code:
    $.ajax({
    	type: "POST",
    	dataType: "json",
    	url: "/ajax_tags",
    	success: function(ret){
    		console.log(ret);
    	},
    	error: function(request, status, error){
    		console.log(error);
    	},
    });
    ... liefert mir immer noch ein "404 Not found".
    Sobald ich einen Parameter an die URL anhänge klappts wieder.
    Komisch

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
  •