【问题标题】:Why TYPO3 9.5.x Fluid Viewhelper f:security only works in Default.html but not in List.html?为什么 TYPO3 9.5.x Fluid Viewhelper f:security 仅适用于 Default.html 而不适用于 List.html?
【发布时间】:2018-11-21 09:55:37
【问题描述】:

在 TYPO3 9.5.x 中,此代码适用于我的 extbase 扩展的 Layout/Default.html 模板。但是相同的代码在任何其他模板中都不起作用,例如 List.html 模板。当我在那里使用 viewhelper 时,我没有得到 任何 输出。在 TYPO3 8.x 中,它适用于每个模板,而不仅仅是 Default.html。有充分的理由吗?如何在非 Layout/Default.html 的部分和模板中使用 f:security?

<f:security.ifHasRole role="2">
                <f:then>
                    <p>CHECK RIGHTS role=2</p>
                </f:then>
                <f:else>
                    <p>CHECK RIGHTS role=not2</p>
                </f:else>
</f:security.ifHasRole>

与此代码相同,因此与 f:else: 无关

<f:security.ifAuthenticated>
            <p>I AM LOGGED IN, but it does not show up :( </p>
</f:security.ifAuthenticated>

布局/默认.html:

<html xmlns:f="https://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
    <f:security.ifHasRole role="2">
        <p>ROLE is 2 in Default.html, this  gets rendered as expected</p>
    </f:security.ifHasRole>
    <div class="container">
        <f:debug title="Debug" maxDepth="12">{_all}</f:debug>
        <f:render section="content" />
    </div><!-- /container -->
</html>

模板/统计/List.html

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

    This Template is responsible for creating a table of domain objects.

    If you modify this template, do not forget to change the overwrite settings
    in /Configuration/ExtensionBuilder/settings.yaml:
    Resources:
    Private:
    Templates:
    List.html: keep

    Otherwise your changes will be overwritten the next time you save the extension in the extension builder

    <f:section name="content">
        <h3>Anruf-Statistiken</h3>
        <f:flashMessages />
        <div style="float:right; clear:both;"><f:link.action action="export" controller="Statistic" pluginName="Run"><button type="button" class="btn btn-xs btn-default">Tabelle für Excel speichern (CSV-Export)</button></f:link.action></div>



        <table style="padding: 1em; margin-top:2em; width:100%;" class="tx_srv2" >
            <tr>
                <th style="padding: 1em;">ID</th>
                <th style="padding: 1em;">Timestamp</th>
                <th style="padding: 1em;"><f:translate key="tx_srv2_domain_model_statistic.agent" /></th>
            <th style="padding: 1em;"><f:translate key="tx_srv2_domain_model_statistic.status" /></th>
            <th style="padding: 1em;"><f:translate key="tx_srv2_domain_model_statistic.campaigntitle" /></th>
            <th style="padding: 1em;"><f:translate key="tx_srv2_domain_model_statistic.duration" /> (sec.)</th>
            <th style="padding: 1em;"><f:translate key="tx_srv2_domain_model_statistic.comment" /></th>
            </tr>
            <f:widget.paginate objects="{statistics}" configuration="{itemsPerPage: 10, insertBelow:1}" as="paginatedStatistics">
                <f:for each="{paginatedStatistics}" as="statistic">
                    <tr>
                        <td style="padding: 1em;">{statistic.uid}</td>
                        <td style="padding: 1em;"><f:format.date format="Y-m-d H:i:s">{statistic.crdate}</f:format.date></td>
                    <td style="padding: 1em;">{statistic.agent.username}</td>
                    <td style="padding: 1em;">{statistic.status}</td>
                    <td style="padding: 1em;">{statistic.campaigntitle}</td>
                    <td style="padding: 1em;">{statistic.duration}</td>
                    <td style="padding: 1em;">{statistic.comment}</td>
                    </tr>
                </f:for>
            </f:widget.paginate>
        </table> 
        <f:security.ifAuthenticated>
            <f:then>
                This part should be shown if there is a frontend user logged in, but it never shows up.
            </f:then>
            <f:else>
                This part should be shown if the current user is not logged in., but it also doesnt show up.
            </f:else>
        </f:security.ifAuthenticated>
    </f:section>
</html>

在前端,List.html 中 f:security 部分的内容不会被渲染,但 Default.html 中的 f:security 部分会被渲染。 List.html 的通常输出(即对象列表)按预期呈现。

【问题讨论】:

    标签: security templates fluid view-helpers typo3-9.x


    【解决方案1】:

    在 TYPO3 9.5.x 中,ViewHelper 似乎只返回一个布尔值并且不呈现“then”或“else”标签。这对我有用:

    <f:if condition="{f:security.ifHasRole( role: '9')}">
    <f:then>
    yes
    </f:then>
    <f:else>
    no
    </f:else>
    </f:if>

    【讨论】:

      【解决方案2】:

      使用看起来非常好。

      f:security ViewHelpers 仅在前端工作。如果您在后端范围内,则需要使用 f:be.security 等效项。 如果还是不能解决问题,能否提供下ViewHelper故障所在的模板代码?

      【讨论】:

      • 我用使用的模板更新了我的问题。
      • 是的,我只在前端使用 ViewHelpers。
      【解决方案3】:

      在 9.5.2 中遇到了这个问题并且检查角色不是一个选项,这是我在 vhs 扩展的帮助下如何解决它的:

      <f:security.ifAuthenticated>
          <f:then>
              <v:variable.set name="isLoggedIn" value="true"/>
          </f:then>
      </f:security.ifAuthenticated>
      
      <f:if condition="{isLoggedIn}">
          <f:then>### Logged In ###</f:then>
          <f:else>### Not Logged In ###</f:else>
      </f:if>
      

      这里的诀窍是 Viewhelper 能够执行 f:then 块中的内容,但不能执行 f:else 块中的内容,因此我创建了一个仅在 f:then 块中设置的变量稍后检查此变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-06
        • 1970-01-01
        • 2018-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-08
        • 2019-03-06
        相关资源
        最近更新 更多