【问题标题】:Condition within FLUID to check if column has contentFLUID 中的条件以检查列是否有内容
【发布时间】:2018-12-06 13:12:46
【问题描述】:

我正在使用 Ben Kott 为 Typo3 9.5 编写的站点包,并将内容包含到我的流体模板中,如下所示:

<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '1'}" />

我正在尝试将其包装成类似液体的状态

<f:if condition="<f:cObject typoscriptObjectPath='lib.dynamicContent' data='{colPos: \'1\'}'">     
    whatever  
</f:if>

但它不起作用。我不知道是否有任何语法错误或不可能。

【问题讨论】:

    标签: typo3 fluid typo3-9.x


    【解决方案1】:
    {f:cObject(typoscriptObjectPath: 'lib.dynamicContent', data: {colPos: 1}) -> f:variable(name: 'content')}
    <f:if condition="{content}">
       There is content. Here it is:
       {content -> f:format.raw()}
    </f:if>
    
    1. 避免对打字稿对象进行双重呈现、双重数据库请求等。
    2. 避免标签属性中的标签语法,这在未来的 Fluid 版本中可能无法做到

    为后代编辑:上面代码失败的确切原因似乎是语法错误:

    <f:if condition="<f:cObject typoscriptObjectPath='lib.dynamicContent' data='{colPos: \'1\'}'"> 
    

    应该是:

    <f:if condition="<f:cObject typoscriptObjectPath='lib.dynamicContent' data='{colPos: \'1\'}' />">
    

    由于内部标签没有关闭。不过,您仍然应该避免使用它 - 改用内联语法。在我上面的代码中,您可以删除 -&gt; f:variable() 部分,然后表达式可以用作标记属性值。

    【讨论】:

    • 谢谢克劳斯!所以这意味着,如果我有多个 colPos 我想拥有它自己的条件,我需要给它一个独特的变量(content2、content3...等),对吧?
    • 这是处理这种情况的好方法,是的。更重要的是只执行一次,因为我假设您的 cObject 执行 DB 调用并渲染对象,这非常昂贵。另一种方法是创建一个 cObject,您可以在其中传递所有可能的 colPos 值并返回分组结果,但这当然用 TS 来实现有点复杂。
    【解决方案2】:

    另一种解决方案是一个专用的 TypoScript 对象,您可以在 Fluid if 条件下使用它

    ################################################
    #### COUNT CONTENT LIB FOR USAGE IN FLUID ####
    ################################################
    #
    #  EXAMPLE: amount of content elements in colPos 1 of actual PID
    #  ---------------
    #  <f:cObject typoscriptObjectPath="lib.countContent" data="{colPos: 1}" />
    #  {f:cObject(typoscriptObjectPath: 'lib.countContent', data: '{colPos: 1}')}
    #
    #  EXAMPLE: amount of content elements in more than one colPos of actual PID
    #  ---------------
    #  <f:cObject typoscriptObjectPath="lib.countContent" data="{colPos: '1,2'}" />
    #  {f:cObject(typoscriptObjectPath: 'lib.countContent', data: '{colPos: \'1,2\'}')}
    #
    #
    #
    #
    #  Usage examples:
    #  --------------
    #
    #  <f:if condition="{f:cObject(typoscriptObjectPath: 'lib.countContent', data: '{colPos: 1}')}">
    #      <f:cObject typoscriptObjectPath="lib.dynamicContent" data="{pageUid: '{data.uid}', colPos: '1', wrap: '<aside class=\"l-aside\">|</aside>'}" />
    #  </f:if>
    #
    #
    #  <f:if condition="{f:cObject(typoscriptObjectPath: 'lib.countContent', data: '{colPos: 1}')}">
    #      <aside class="l-aside">
    #         <f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '1'}" />
    #      </aside>
    #  </f:if>
    #
    #
    ###############
    lib.countContent = COA
    lib.countContent {
        5 = LOAD_REGISTER
        5 {
            colPos.cObject = TEXT
            colPos.cObject {
                field = colPos
                ifEmpty.cObject = TEXT
                ifEmpty.cObject {
                    value.current = 1
                    ifEmpty = 0
                }
            }
            pageUid.cObject = TEXT
            pageUid.cObject {
                field = pageUid
                ifEmpty.data = TSFE:id
            }
            contentFromPid.cObject = TEXT
            contentFromPid.cObject {
                data = DB:pages:{register:pageUid}:content_from_pid
                data.insertData = 1
            }
        }
        20 = CONTENT
        20 {
            table = tt_content
            select {
                selectFields = count(uid) AS counter
                where = {#colPos} IN({register:colPos})
                where.insertData = 1
                pidInList.data = register:pageUid
                pidInList.override.data = register:contentFromPid
                andWhere = (deleted = 0 AND hidden = 0)
            }
    
            renderObj = COA
            renderObj {
                10 = TEXT
                10 {
                    data = field:counter
                }
            }
        }
        90 = RESTORE_REGISTER
    }
    

    这个 sn-p 在没有工作区的 TYPO3 8.7 LTS 中经过测试和使用

    【讨论】:

    • 不幸的是,这仍然具有调度附加查询的效果。就 DB 查询经济而言,只有将渲染内容分配给模板变量并对其进行检查的解决方案才能避免额外的查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    相关资源
    最近更新 更多