【问题标题】:Typo3: if conditions in typoscript to check if multiple fields are emptyTypo3:如果在打字稿中检查多个字段是否为空的条件
【发布时间】:2015-09-17 14:24:02
【问题描述】:

我想从 tt_content 表中呈现一个页面,结果类似于下面给出的示例。伪代码如下:

if (header_link != "" && image != "") {
    // build content with header_link and image
    html = <div><a href="{header_link}"><img src="{img}" /></a></div>
} else {
    // build content without those fields
    html = <div><h1>{header}</h1></div>
}

我的排版结构如下:

temp.myContent = CONTENT
temp.myContent {
    table = tt_content
    select {
        begin = 1
        orderBy = sorting
        where = (colPos = 2)
    }
    renderObj = COA 
    renderObj {

        # PLANNING TO PLACE THE CONDITIONS SOMEWHERE HERE

        # 10 = TEXT  
        # 10 {
             ...
        # }
    }
}

我不知道为什么 Typo3 的官方网站上没有工作示例代码,他们只有描述。因此,我再次依赖stackoverflow-ies。 :)

【问题讨论】:

    标签: typo3 typoscript typo3-6.2.x


    【解决方案1】:

    请记住,TypoScript 只是一个配置表不是编程语言。此外,您不能在任何对象中放置条件,因为要求所有条件必须在顶层解决。幸运的是,您至少有两种解决方法,您可以创建自己的 ContentElements 让我们将其命名为 MySepcialHeaderMySpecialHeaderWithImg,因此您可以将其中一个放在文本 CE 之前。如何做到这一点?

    GridElements extension

    是一个非常有用的工具,您可以创建自己的类似 CE 的结构,而无需接触任何一行 PHP,所有这些都在 Db 记录(CE 后端布局)和相应的 TypoScript 中完成。它可以与 TemplaVoilà 的 FCE 进行比较,更多请参见文档 herehere

    拥有真实 CType

    您也可以只创建自己的 CType,即使用 Extension Builder,这会更有趣,但是当您在 Fluid 视图上使用 PHP 操作时,它为您提供了无限的可能性,如果您创建一个扩展就足够了,然后您可以在其中添加无限数量的插件/CType。

    您可以在other answer 中找到有关此技术的更多信息。

    【讨论】:

      【解决方案2】:

      这个 TypoScript 模板在 TYPO3 CMS 6.2.17 服务器上为我工作。

      page.30 = CONTENT
      page.30 {
          table = tt_content
          select {
              orderBy = sorting
              where = colPos = 0
          }
          renderObj = COA 
          renderObj {
              wrap = <div>|</div>
              10 = COA
              10.10 = TEXT
              10.10.if.isTrue.field = header_link
              10.10.if.isFalse.field = image
              10.10 {
                  stdWrap.data = header_link
                  stdWrap.typolink {
                      parameter.field = header_link
                      wrap = <img src="|" />
                      ATagBeforeWrap = 1
                  }
              }
              10.20 = TEXT
              10.20.if.isFalse.field = header_link
              10.20.stdWrap.field = header
              10.20.stdWrap.wrap = <h1>|</h1>
          }
      }
      

      结果显示tt_content header 字段,除非header_linkimage 字段都测试为阳性。以下是我在测试中使用的tt_content记录的相关字段。 (|| 表示空字段值。)

      uid|hidden|Sorting|CType|header|image|deleted|colPos|header_link|
      29|0|256|text|Regular text element|NULL|0|0||
      30|0|512|image|Image element|0|0|0|file:37|
      31|0|384|image|Image element with no image|0|0|0||
      32|0|768|div|Divider|NULL|0|0||
      

      我将 hiddendeleted 列作为提醒,因为如果将其中任何一个设置为 1,则 CONTENT select 函数将不会返回该记录以供 renderObj 使用。还检查开始和结束日期,以及当前用户是否具有对内容元素的访问权限。见"select" in the TypoScript Reference manual

      一个对象上的多个 TypoScript if 语句通过隐式逻辑 AND 连接在一起。请参阅"if" page in the TypoScript Reference 及其在"Explanation" 下具有两个条件的“更复杂”示例。

      这是本次测试涉及的if逻辑。

      Object page.30.renderObj.10.10.
      uid|header_link|if.isTrue.field = header_link|image|if.isFalse.field = image|Result
      29||no|NULL|no|not rendered
      30|file:37|yes|0|yes|rendered
      31||no|0|yes|not rendered
      32||no|NULL|no|not rendered
      
      Object page.30.renderObj.10.20.
      uid|header_link|if.isFalse.field = header_link|Result
      29||yes|rendered
      30|file:37|no|not rendered
      31||yes|rendered
      32||yes|rendered
      

      如果我们只对page.30.renderObj.10.10 对象使用if.isTrue.field = header_link 测试,输出显示会产生相同的结果,而不要使用if.isFalse.field = image 测试。但是,保持if.isFalse.field = image 测试更紧密地回答请求,并说明检查多个字段。

      【讨论】:

        猜你喜欢
        • 2017-11-04
        • 1970-01-01
        • 2014-06-19
        • 2019-05-03
        相关资源
        最近更新 更多