Sorry for the delay. Yeah, like you illuded to the problem isn't with PHP's JSON parser, it's that what you're passing it is not valid JSON. In fact it's not JSON at all - it's JavaScript.

You may just want to try echoing the javascript out followed by a die; command to skip the controller. return $this->renderText(...); may do what you need too. I've used a similar approach for Ext.Direct requests that I wanted to return a CSV file and it worked very well.

I'm hesitant to change things within the plugin itself since it would stray from the API specifications defined by the ExtJS team.

If Air can work with Ext.Direct then it should be able to work just fine with dsExtDirectPlugin since the implementation is a compliant version of the Ext.Direct API Spec. I've never worked with Air but if you have success it'd be great to hear about it.

But my problem is more important than I thought (non sandbox AIR application, cross domain, ScriptTagProxy, ...)
Anyway, if I find how use your GREAT plugin with an AIR application connected to a Symfony application hosted in a different domain I'll let you know.

Use $this->getRequestParameter('_raw'); to take a look at the raw data - using _raw is best for use with Trees anyways since Ext JS's trees work very differently from the rest of their components with regards to requests/responses. If you var_dump() or print_r() the _raw data you can get a really good idea of what data is being passed.

I would be interested in seeing the request the tree is generating that is causing that error. I've worked with trees using the plugin without a problem. Regardless, I've made the following changes which should fix your issue: