【问题标题】:TYPO3 pass controller context to ajax requestTYPO3 将控制器上下文传递给 ajax 请求
【发布时间】:2017-08-15 23:18:26
【问题描述】:

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

对应的controller-action实例化一个StandaloneView,渲染它并将渲染的内容写入响应体。 我的问题是,我没有在生成的内容中设置controllerContext,因此一个表单应该触发不同的 extbase 操作,因为未设置模块名称,所以呈现的内容不起作用。

谁能告诉我如何获取/传递控制器上下文,以使其在通过 ajax 调用的控制器操作中可用? 最好的问候和提前感谢,奥利弗!

【问题讨论】:

    标签: ajax module typo3 action backend


    【解决方案1】:

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

    话虽如此,如果您可以更改 View 环绕 StandaloneView 的方式,则可以通过以下操作复制控制器上下文:

    $view->getRenderingContext()->setControllerContext($parentView->getRenderingContext()->getControllerContext());
    

    或者,您可能想要复制整个渲染上下文,而不仅仅是控制器上下文。

    建议仅适用于 TYPO3v8。在 7.6 上,您将需要复制请求。

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

    【讨论】:

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