This is a solution for a ExtBase Backend Extension with Ajax calls (usually required for ExtJS). It is based on this solution, which required lots of debugging until it worked for me (on 4.5): http://daniel.lienert.cc/blog/blog-post/2011/04/23/typo3-extbase-und-ajax/
This is the Ajax Request – notice „actionName“ instead of „action“ and lowercase/uppercase spellings:
Ext.Ajax.request({
url:'ajax.php',
params: {
ajaxID: 'importexcelAjaxDispatcher',
request: Ext.encode({
extensionName:'ImportExcel',
pluginName:'importexcel', //this is from ext_tables.php, Tx_Extbase_Utility_Extension::registerModule(x,x,pluginName,...), often Pi1 or mod1
controllerName:'ImportExcel',
actionName:'testAjax',
})
},
success:function(response, request) {
//do something
},
failure: function(response, request) {
console.log('server-side failure with status code ' + response.status);
}
});
Then register the Ajax Dispatcher in ext_localconf.php:
$TYPO3_CONF_VARS['BE']['AJAX']['importexcelAjaxDispatcher'] = t3lib_extMgm::extPath($_EXTKEY).'Classes/Domain/Utility/AjaxDispatcher.php:Tx_ImportExcel_Domain_Utility_AjaxDispatcher->initAndDispatch';
Get the Ajax Dispatcher from pt_extbase/Classes/Utility/AjaxDispatcher. For any unknown reason, the response is still a full HTML page, so here is my modification of dispatch function. I check the successfull calls with devLog.
public function dispatch() {
t3lib_div::devLog('Ajax dispatch','import_excel',0,array('ExtensionName'=>$this->extensionName,'PluginName'=>$this->pluginName));
$configuration['extensionName'] = $this->extensionName;
$configuration['pluginName'] = $this->pluginName;
$bootstrap = t3lib_div::makeInstance('Tx_Extbase_Core_Bootstrap');
$bootstrap->initialize($configuration);
$this->objectManager = t3lib_div::makeInstance('Tx_Extbase_Object_ObjectManager');
$request = $this->buildRequest();
$response = $this->objectManager->create('Tx_Extbase_MVC_Web_Response');
$dispatcher = $this->objectManager->get('Tx_Extbase_MVC_Dispatcher');
$dispatcher->dispatch($request, $response);
//parse content from HTML
preg_match('/!#!#!(.*)!#!#!/',$response->getContent(),$match);
t3lib_div::devLog('Ajax response','import_excel',0,array($content,$match));
$response->sendHeaders();
if ($match[1]) {
echo $match[1];
} else{
echo $response->getContent();
}
return;
}
And finally my Action:
class Tx_ImportExcel_Controller_ImportExcelController extends Tx_Extbase_MVC_Controller_ActionController {
public function testAjaxAction() {
t3lib_div::devLog('testAjaxAction called','import_excel',0,array());
$test = array('test'=>1, 'test2'=>'Hello from Extbase');
$result = json_encode($test);
return '!#!#!'.$result.'!#!#!';
}
}
View „TestAjax.html“ is an empty file.