Skip to content
This repository has been archived by the owner on Dec 22, 2020. It is now read-only.

Methodenkonflikt zwischen Controller::getFrontendModule() und PageAjax::getFrontendModule() #14

Closed
markocupic opened this issue Aug 9, 2014 · 10 comments

Comments

@markocupic
Copy link

Hoi Andreas
Nach update auf contao 3.3.4 funktionieren Ajax requests nicht mehr.
Als Reponse erhalte ich folgende Fehlermeldung:
Fatal error:
Cannot make static method Contao\Controller::getFrontendModule() non static in class PageAjax in ajax.php on line 77

Das Problem ist, dass sich hier die \PageAjax::getFrontendModule() und die Controller::getFrontendModule() gegenseitig in die Quere kommen.
Nachdem ich die \PageAjax::getFrontendModule() nach \PageAjax::ajaxGetFrontendModule() umbenannt habe, und in Zeile 175 natürlich die nötige Änderung ebenfalls vorgenommen habe, funktionierten die Ajax requests wieder tadellos.

Ich danke dir für deine super Arbeit.
Liebe Grüsse
Marko

@aschempp
Copy link
Owner

die ajax.php wird seit Contao 3 nicht mehr unterstützt, wozu verwendest du die denn?

@markocupic
Copy link
Author

Hoi Andreas
Das habe ich dann auch bemerkt, und meine Module umgeschrieben.
Du kannst das issue von meiner Seite als erledigt betrachten.
Liebe Grüsse
Marko

@Babelfisch
Copy link

Welche einfache Alternative gibt es denn? Ich nutze die ajax.php zum Beispiel gerne für Autocomplete-Boxen im FE oder in meiner comments_ajax Erweiterung.

@aschempp
Copy link
Owner

die URL der aktuellen Seite erneut aufrufen und das ganze in deinem Modul behandeln.

@Babelfisch
Copy link

Das ist dann ja aber keine einfache Alternative.

@aschempp
Copy link
Owner

aschempp commented Sep 1, 2014

Warum nicht?

@Babelfisch
Copy link

Fängt schon damit an, dass es kaum irgendwelche Beispiele gibt, weil alle Welt bisher deine Erweiterung genommen hat. Außerdem hast du damals vermutlich nicht umsonst geschrieben:

Diese Erweiterung stellt ein Hilfsscript "ajax.php" im Systemroot zu Verfügung, mit dessen Hilfe sehr viel einfacher Ajax-Abfragen gemacht werden können.

Ich probier’s halt mal aber es ist schon schade, dass die ajax.php nicht weiterentwickelt wird.

@markocupic
Copy link
Author

Hallo Babelfisch
Probier dir hier mal zu erklären, wie du das angehen kannst. Im javascript Code rufst du ganz einfach deine Seite mit dem Modul auf. Evtl. hängst du noch GET-Parameter an (id, usw.).
In der generate Methode deines Moduls, fängst du den Ajax-Request ab, siehe unten, und leitest weiter zu einer Methode, wo der Request verarbeitet wird und gibst gegebenenfalls eine Response an den browser zurück. Das ist eigentlich schon alles und es ist wirklich keine grosse Hexerei.
Lg Marko

Javascript:

var objXhr = new Request.JSON({
                url: document.URL,
                method: 'get'
                // usw.
});
// usw.
// send request           
objXhr.send('userId=' + self.userId);

Auf Serverseite:

       /**
        * Parse the template
        * @return string
        */
       public function generate()
       {

              // Ajax Requests abfangen
              if(\Input::get('userId') && $this->Environment->get('isAjaxRequest')){
                     $this->myGenerateAjax();
                     exit;
              }
       }

       // weiter unten dann...
       public function myGenerateAjax()
       {
              // Ajax Requests verarbeiten
              if($this->Environment->get('isAjaxRequest') && \Input::get('userId'))
              {
                     $this->machWas();
                     header('Content-Type: application/json; charset=UTF-8');
                     echo json_encode(array('response' => 'hallo Welt!'));
                     exit;
              }
       }

       // weiter unten dann...
       public function machWas()
       {
              // Datenbankabfragen, usw......
       }



@aschempp
Copy link
Owner

aschempp commented Sep 1, 2014

Siehe #13 (bzw. den link dort drin).

Ein "Beispiel" gibt's zum Beispiel in Isotope eCommerce, da haben wir das ganze umgebaut.

@Babelfisch
Copy link

Ich danke euch, klappt jetzt. Als Ergänzung zum Beispiel von markocupic vielleicht noch, dass der Request besser als POST-Request abgesetzt und REQUEST_TOKEN mit gesendet wird. Dann arbeitet Contao das (sofern nicht deaktiviert) nur bei gültigem Token ab und kann nicht missbraucht werden. Auch schadet ein header('Content-Type: application/json; charset=UTF-8'); vorher nicht.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

3 participants