TYPO3将控制器上下文传递到ajax请求

TYPO3将控制器上下文传递到ajax请求,ajax,module,typo3,action,backend,Ajax,Module,Typo3,Action,Backend,我正在开发一个TYPO3后端模块。主要的“概述”操作允许通过ajax上传上传一个文件,该文件在我的一个控制器中处理 相应的控制器操作实例化一个StandaloneView,呈现它并将呈现的内容写入响应主体。 我的问题是,我在生成的内容中没有设置controllerContext,因此在呈现的内容中,应该触发不同extbase操作的表单不起作用,因为没有设置modulename 有谁能告诉我如何获取/传递controllerContext,使其在控制器操作(通过ajax调用)中可用? 向你致以最良

我正在开发一个TYPO3后端模块。主要的“概述”操作允许通过ajax上传上传一个文件,该文件在我的一个控制器中处理

相应的控制器操作实例化一个
StandaloneView
,呈现它并将呈现的内容写入响应主体。 我的问题是,我在生成的内容中没有设置
controllerContext
,因此在呈现的内容中,应该触发不同extbase操作的表单不起作用,因为没有设置modulename

有谁能告诉我如何获取/传递controllerContext,使其在控制器操作(通过ajax调用)中可用?
向你致以最良好的问候和感谢,奥利弗

这里的主要问题是BE模块并不完全使用标准视图实现——在默认实现中,它们围绕着一个StandaloneView,根据定义,该视图没有控制器上下文

也就是说,如果可以更改视图环绕StandaloneView的方式,则可以通过执行以下操作复制控制器上下文:

$view->getRenderingContext()->setControllerContext($parentView->getRenderingContext()->getControllerContext());
或者,您可能希望复制整个渲染上下文,而不仅仅是控制器上下文

Advise仅适用于类型3V8。在7.6中,您将需要复制请求


对于MVC上下文之外的使用,您需要手动传递原始控制器上下文值,例如控制器名称和模块名称。这意味着这些值必须是您创建的链接的一部分,并且必须由接收代码读取(以代码上下文要求的任何方式),然后手动分配给您创建的请求并传递给子视图。请注意,只有当这些MVC上下文值实际发生更改时,才需要这样做-如果您总是在下一步调用相同的操作,只需硬编码所需的扩展名、模块名、,从该AJAX控制器呈现的模板中的表单/链接中的控制器名称和操作。

非常感谢您的快速响应!不幸的是,我并不完全理解你的暗示:你所说的“观景环绕观景台”是什么意思?我在哪里可以得到$parentView?该操作是通过ajax调用的,我是否会错过ajax请求中的某些内容?您给出的示例表明您正在使用已注册的Extbase后端模块(假设您说您创建了一个新视图并编写了一个呈现的响应,希望获得一个控制器上下文)。如果真是这样的话,“父视图”可以在$this->view中找到,但我开始认为情况并非如此。您可能需要进一步解释控制器是如何注册的,以及应用程序的实际功能。在XHR中返回一个完整的表单作为对文件上传的响应,这听起来不像是正常的用例,所以这一部分也有点不清楚。好的,我将给出更多细节:调用操作的目的是处理一个.csv文件,该文件是使用相同的ajax调用上传的。我通过Configuration/Backend/AjaxRoutes.php注册了ajax方法,并像在任何文档中显示的那样调用它。不幸的是没有“$this”-因为它是一个ajax调用,所以我不在通过ajax请求的控制器操作的对象上下文中。动作本身准备了一个确认步骤,我想提供一个保存按钮,在之后将数据发送到另一个动作。如果是这种情况,那么您的控制器完全缺少所有MVC上下文(并且在该上下文中不完全是控制器)。如果您确实需要这些东西,建议您将接收操作设置为标准模块控制器操作,该操作将自动与模块的完整上下文相匹配。不推荐在分离代码中创建独立视图的方法,但您可以这样做-我将修改上面的答案,以包括该选项,尽管不推荐。