Benutzer: Gast
Eintrag: Extbase 6+: (AJAX-)Bootstrap

Extbase 6+: (AJAX-)Bootstrap

von: marcel
Kreise: Typo3
Code: TypoScript (TS)
tx_myextension_ajax = PAGE
tx_myextension_ajax {
  typeNum = 666
  config {
    disableAllHeaderCode = 1
    xhtml_cleaning = 0
    admPanel = 0
    additionalHeaders = Content-type: text/plain
    no_cache = 1
  }
	
  10 = USER
  10 {
    userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
    extensionName = MyExtension
    pluginName = Pi1
    vendorName = MYVENDOR
    controller = Ajax
    switchableControllerActions {
      Ajax {
        1 = ajaxTest
      }
    }
    view < plugin.tx_myextension.view
    persistence < plugin.tx_myextension.persistence
    settings < plugin.tx_myextension.settings
  }
}

Beispiel-Ajax-URL:

Code: text plain
index.php
  ?type=666
  &tx_myextension_pi1[action]=ajaxTest
  &tx_myextension_pi1[controller]=Ajax
  &tx_myextension_pi1[someOtherParamsForAction]=...

Beispiel View mit jQuery:

Code: XML XHTML XSLT HTML
<script type="text/javascript">
<![CDATA[//<![CDATA[
$(document).ready(function () {
  // (1) define some post-parameters with action, controller and stuff for the action
  var params = {
    tx_myextension_pi1: {
      action : "ajaxTest",
      controller : "Ajax",
      someOtherParamsForAction: "..."
    }
  };
  // (2) do the ajax-call
  $.post(]]>{f:uri.page(pageType:'666')}<![CDATA[, params, function (json) {
    // (3) evaluate the response from server 
    if (json && json.success) {
        $("#myContainer").html(json.content);
        return;
    }
    try {
        console.log(json);
    } catch (e) {

    }
  }, "json");
});
]]>//]]>
</script>

Beispiel Controller

Code: PHP
<?php
namespace MYVENDOR\MyExtension\Controller;

class AjaxController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
  /**
   * action ajaxTest
   *
   * @return string
   */
  public function ajaxTestAction() {
    $arguments = $this->request->getArguments();

    $this->view->assign("test", "some content");
    $this->view->assign("someOtherParamsForAction", $arguments['someOtherParamsForAction']);

    $content = $this->view->render();

    return json_encode(array(
        'success' => true,
        'content' => $content
    ));
  }
}
?>

Beispiel-Extension zum Download

Größe: 7233 Bytes
Typ: application/zip

In dieser Extension sind zwei Ajax-Methoden enthalten: eID und über das Page-Object.

UPDATE 2013-08-02:

  • Action- und Controller-Namen eindeutiger gewählt
  • Beispiel Controller hinzugefügt

UPDATE 2014-01-15:

  • Beispiel-Extension hinzugefügt

(1) peter di schrieb am 15. 1. 2014 um 10:59 Uhr
Hallo marcel,
vielen Dank für den Code, es funktioniert auch wenn ich z.B. ein Typo3 Dump ausgebe, dann sind die Daten da. Wenn ich den Controller so wie bei dir aufbaue, dann meckert er und braucht ein View.
Kannst du evtl. noch ein Beispiel-View zeigen?
Viele Grüße
peter
(2) marcel schrieb am 15. 1. 2014 um 12:24 Uhr

Hallo Peter,

ich habe mal schnell eine Beispiel-Extension erstellt, die auf das wesentliche reduziert ist (siehe oben). Ich hoffe das hilft weiter.

Hier ein Link mit der Installation des Plugins:
https://lbrmedia.net/ajaxexample/

LG Marcel

(3) peter di schrieb am 16. 1. 2014 um 11:27 Uhr
Hallo Marcel,

vielen Dank für die Beispiel Extension! Es hat mir sehr weitergeholfen.
Bei meiner Extension habe ich den result von einer findAll Abfrage gebraucht. Bei meiner früheren Umsetzung hatte ich aber Probleme mit dem Typo3 Cache. Sobald etwas com Typo3 gecached wurde, habe ich nur als Ergebnis die UID und PID bekommen. Nach dem Löschen vom Cache ging es wieder. Mit deinem AJAX Bootstrap scheint es nun endlich zu funktieren!

Beste Grüße

peter
(4) peter di schrieb am 16. 1. 2014 um 13:14 Uhr
Hallo nochmal,

es scheint doch nicht zu gehen, nach ein paar Stunden habe ich wieder das selbe Problem...

{"pid":88,"firma":null,"person":null,"strasse":null,"plz":null,"ort":null,"user":null,"uid":1}

hatest du schon mal ein ähnliches Problem bzw. fällt dir evtl. etwas ein was ich noch prüfen könnte?

Viele Grüße
peter
(5) marcel schrieb am 16. 1. 2014 um 13:43 Uhr

Hallo Peter,

leider habe ich gerade nicht die Zeit mich damit ausführlicher zu befassen.
Es hat aber bestimmt was mit dem Cache zu tun. Bei Ajax-Anfragen mache ich es eigentlich immer so, dass die Anfrage selbst nicht im Cache landet.

tx_myextension_ajax.config.no_cache = 1

In der ext_localconf.php muss bei der Plugin/Controller/Action-Definition die entsprechende Action auch im Nicht-Cache-Bereich stehen.

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin('LBR.' . $_EXTKEY, 'MyPlugin',
array('MyController' =&gt; 'myNonCachedAction',),
array('MyController' =&gt; 'myNonCachedAction',) // non-cached
);

Nun sollte die Ausgabe immer ein frisches Ergebnis liefern – eben non-cached.

In der Regel reicht mir das, weil die Ajax-Inhalte nicht gecached werden müssen. Sollte ich dennoch einen Cache benötigen, weil die Anfrage oft wiederkehrend ist und die Erstellung der Inhalte Ressourcen-fressend ist, kann die Action auch das Caching übernehmen. Hierbei lassen sich die Trigger für einen Cache auch gezielt definieren. Dazu schaue dir mal https://lbrmedia.net/codebase/Eintrag/extbase-6-eigenen-cache-in-extension-verwenden/ an.

Warum der Seiten-Cache da nun dazwischenfunkt kann ich auf Anhieb nicht sagen – evtl. hilft dir das ja trotzdem weiter.

PS: Beim “eigenen” Cache war noch irgendwas mit dem Tabellen-Feld ‘expires’ – bin mir da gerade nicht sicher, wie das in der aktuellen T3-Version heißen muss.

(6) peter di schrieb am 17. 1. 2014 um 11:55 Uhr
Hallo Marcek,

vielen Dank für deine Unterstützung. Ich habe nun folgende zwei Fälle:

PAGE-Methode:
Ich kann nur auf die erste Action welche unter "switchableControllerActions" definiert ist zugreifen, ich habe aber mehrere Actions auf die ich zugreifen muss. Außerdem gibt mir ->getArguments() nichts zurück.

eID-Methode:
Bei jedem Request bekomme ich nicht den Result einer Action zurück, sondern den gesamten HTML-Code, was mir meine Extension generiert.

Ich habe schon diverses ausprobiert komme aber nicht weiter...

Ich habe deine Beispielextension bei mir installiert und deine eID-Methode funktioniert bei mir ganz gut, aber nur im Context deiner Bespielext.

Fällt dir evtl. auf die schnelle was ein warum er mir bei eID-Methode den kompletten HTML-Code rausspuckt und nicht auf die Controller/Action zugreift?

Vielen Dank nochmal für deine Mühe
Grüße

peter
(7) marcel schrieb am 17. 1. 2014 um 12:18 Uhr

Hallo Peter,

mit den Arguments wird u.A. ja auch die Action im Request uebertragen (tx_myext_myplugin[action]=myAction). Wenn das nicht gegeben ist, wird die Standard-Action ausgefuehrt (1. Action in switchableControllerActions). Am besten mal mit z.B. den Chrome Developer-Tools oder Firefox Firebug die Requests in “Network” anschauen, ob die Get- oder Post-Variablen passen. Ein simples print_r($_GET) oder print_r($_POST) auf dem Server hilft da sicherlich auch weiter.

Ein anderer koennte sein, dass der Aufruf des Plugins nicht stattfindet, weil z.B. page.typeNum falsch ist oder nicht per type= im Request steht. Vllt. ist auch nur Extension- oder Plugin-Name falsch geschrieben (UpperCamelCase) – evtl. die Action (lowerCamelCase ohne Action am Ende).

Bei der eID-Methode machte ich es so, dass im Bootstrap der Controller fest vorgegeben ist: $_POST[‘tx_ajaxexample_ajax’][‘controller’] = ‘Ajax’;

Die Action habe ich auch im $_POST definiert: $_POST[‘tx_ajaxexample_ajax’][‘action’] =

Da etwas vom Controller zurueckkommt, denke ich mal, dass die vorgegebene Standard-Controller-Action Kombination ausgefuehrt wird. Hier koennte es ebenfalls sein, dass der Request nicht die richtigen Werte hat (tx_myext_myplugin) oder dass der Request ueber $_GET laeuft, obwohl die Werte mit $_POST im Bootstrap gesetzt werden.

Hier ist noch einmal ein anderer eID-Einstieg. Vllt. passt dieser fuer dich besser?

http://t3-developer.com/extbase-fluid/cheats-extbase/extbase-allgemein/ajax-dispatcher-eid-in-typo3-61/

LG marcel

(8) peter di schrieb am 21. 1. 2014 um 17:32 Uhr
Hallo Marcel,

dieser Ansatz

http://t3-developer.com/extbase-fluid/cheats-extbase/extbase-allgemein/ajax-dispatcher-eid-in-typo3-61/

hat mir weiter geholfen und zusammen mit deinen Hilfestellungen habe ich keine Probleme mit dem Cache nun. Vielen Dank!
(9) Jacques Thens schrieb am 8. 2. 2014 um 21:25 Uhr
Hallo Marcel und Peter

Ich habe das selbe phänomen wie Peter es beschreibt. Die eID Variante scheint etwas zu tun jedoch schickt diese den HTML-Code der bestehenden (aufrufenden) Seite zurück. Ich habe die Schreibweise der Extension, Plugin etc. überprüft und bin der Meinung, dass diese Daten stimmen...

In den Chrome Devtools sehe ich den Request Method:POST und auch die Werte, Status Code:200 OK.

Aufgefallen ist mir, dass wenn der Wert "extensionName" in der Bootstrap in $this->configuration falsch ist ein 500er Fehler kommt jedoch egal ob der Controller und/oder die Action richtig oder falsch sind wird da kein Fehler geworfen solange "extensionName" stimmt. Somit landen wir auch nicht in der Methode des Controllers...
Habe ein Typo3 6.1.6.

Habt ihr einen Rat?

Vielen Dank und viele Grüsse
Jacques
(10) Mihir Bhatt schrieb am 23. 5. 2014 um 08:30 Uhr
Provided extension is pretty useful..Exactly match the requirement...

Many Thanks, Regards and keep up the good work!!!