【问题标题】:Cannot call controller action from top-level Fluid template无法从顶级 Fluid 模板调用控制器操作
【发布时间】:2019-12-25 15:54:20
【问题描述】:

我有一个自己编写的 TYPO3 扩展(我使用ext:extension_builder 创建它)

我的顶级 TypoScript 如下所示:

page = PAGE
page.10 = FLUIDTEMPLATE
page.10 {
    format = html
    file = EXT:cmsp/Resources/Private/Templates/User/Default.html
    partialRootPaths {
        10 = EXT:cmsp/Resources/Private/Partials/
    }
    layoutRootPaths {
        10 = EXT:cmsp/Resources/Private/Layouts/
    }
    templateRootPaths
        10 = EXT:cmsp/Resources/Private/Templates/
    }
    variables {
        content_main < styles.content.get
        content_main.select.where = colPos = 0
    }
}

我使用了一个简单的 Fluid Styled Content 模板:

<f:link.action controller="user" action="search" class="btn btn-secondary">action link</f:link.action>

search 操作在ext_localconf.php 中注册:

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
    'SimpleParser.Cmsp',
    'Cmspfe',
     [
         'User' => 'list,search'
     ],
     // non-cacheable actions
     [
         'User' => 'list,search'
     ]
);

我还有一个模板Search.html:

<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
<f:layout name="Search" />

<f:section name="content">
    <h1>Search Template</h1>

    <f:flashMessages />

    <table  class="tx_cmsp" >
        <tr>
            <th> </th>
            <th> </th>
        </tr>
    </table>
     <form action="SearchConfim.php">
        Searchterm: <input type="text" name="sTerm"><br>
<input type="submit" value="Submit">
</form> 
</f:section>
</html>

问题是我无法在网站前端创建或跟踪从顶级Default.htmlFLUIDTEMPLATE 对象)到Search.html(Extbase 控制器模板)的链接:

<f:link.action controller="user" action="search" class="btn btn-secondary">action link</f:link.action>

我一直都在Default.html,即使我点击了控制器的操作链接。我可以使用

创建外部链接
<f:link.external ... ></f:link.external>

外部链接有效,但我无法使用链接访问Search.html。 也许问题是我使用的 TypoScript 没有激活控制器(以正确的方式)。但如果有人能帮助我,我很高兴。

【问题讨论】:

  • 尝试使用&lt;f:link.action controller="User"(大写U代表User指的是UserController)。如果不行,请分享已经生成的链接...
  • 抱歉大写 U 不起作用。链接是 [link]localhost/my-new-project/public/… 即使是搜索的大写 S 也不起作用。 Typo3 9.5.13; PHP 7.2.24-0ubuntu0.18.04.1
  • 谢谢,tx__ 揭示了正在发生的事情,并且您将&lt;f:link.action 置于任何 Extbase 范围之外...在下面找到可能的答案

标签: typo3 fluid extbase fluid-styled-content


【解决方案1】:

您的控制器名称是带有大写 U 的用户。 在您的 f:link.action 中使用相同的名称,如果控制器没有被更改,您甚至可以删除此参数。

【讨论】:

    【解决方案2】:

    看来Default.htmlFLUIDTEMPLATE中顶层渲染模板​​的名称。因此,我假设 &lt;f:link.action ... 标记放置在该文件中 - 至少当前生成的链接似乎证实了它,并且如下所示:

    index.php?id=1
    &tx__%5Baction%5D=search
    &tx__%5Bcontroller%5D=User
    &cHash=dffabf13e973c371d14fb2e34b23d1a0
    

    它使用tx__ 作为前缀,实际上应该类似于tx_cmsp_cmspfe(您的扩展名和要使用的相应插件名的组合)。

    简要说明

    • Default.html 模板在 Extbase 范围之外,因此不知道应该使用的当前扩展、控制器和插件
    • 通常链接出现在相同扩展名的模板中(例如在Resources/Private/Templates/List.html中)
    • 否则必须明确定义范围(如下所示)

    在顶层渲染模板​​中放置Extbase插件链接的解决方案

    此示例可以在 Default.html 模板的 Extbase 范围之外用于当前页面布局 - 但是,它必须明确使用正确的 Extbase 插件范围:

    <f:link.action
        action="search"
        controller="User"
        pluginName="Cmspfe"
        extensionName="Cmsp"
        pageUid="4321"
        class="btn btn-secondary">
    
        action link
    </f:link.action>
    

    【讨论】:

    • 很抱歉,您给定的 action link 似乎也不起作用。我认为我完全误解了一些东西关于 extbase 和控制器激活...?
    • 好的,“它不起作用”是什么意思,你现在得到了什么结果,生成的链接是否改变了?请尝试更好地描述您的场景以及您尝试在设置中实现的目标 - 否则很难提供任何支持。
    • 我可以在前端看到链接,但是当我点击它时,我一直停留在同一页面上。我只需要一个指向另一个流动模板 Search.html 的链接。但每次点击链接时,我都会使用我的 Default.html
    • 嗯,不幸的是,这并没有透露任何细节 - 让我们这样尝试: * Default.html 文件在文件系统中的位置是什么? * Search.html 文件在文件系统中的位置是什么? * TYPO3 后端中包含自定义 Extbase 应用程序的插件内容元素的页面的 UID 是什么?作为替代方案,您还可以共享指向具有当前方案源的某个 Git 存储库的链接。
    • 我将扩展推送到github.com/christian2222/examlple 文件 Default.html 和 Search.html 位于文件夹 example/Resources/Private/Templates/User/ 控制器位于 example/Classes/Controller/ 我的后端页面的 id 为 1。
    猜你喜欢
    • 2015-02-11
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 2013-10-05
    相关资源
    最近更新 更多