【问题标题】:Nested if / else statements ext:news fluid嵌套 if / else 语句 ext:news fluid
【发布时间】:2017-02-17 15:34:54
【问题描述】:

使用 TYPO3 v7.6.13 ext:news 5.3.2

我创建了两个 Detail partials 以在单个页面上使用,这是页面 TS Config:

tx_news.templateLayouts {
        11 = HomePage Top Banners
        12 = HomePage List
}

我可以编写两个条件,以便使用适当的模板。

<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
    xmlns:n="http://typo3.org/ns/GeorgRinger/News/ViewHelpers"
    data-namespace-typo3-fluid="true">
<f:layout name="General" />
<!--
  =====================
    Templates/News/List.html
-->

<f:section name="content">
  <!--TYPO3SEARCH_end-->
  <f:if condition="{news}">


<f:then>
        <f:if condition="{settings.templateLayout} == 11">
            <f:then>
                    <f:for each="{news}" as="newsItem">
                       <f:render partial="List/homepagetopbanner" arguments="{newsItem: newsItem, settings:settings}"/>
                    </f:for>
            </f:then>
</f:if>


  <f:if condition="{settings.templateLayout} == 12">
    <f:then>
       <f:for each="{news}" as="newsItem">
        <f:render partial="List/homepagelist" arguments="{newsItem: newsItem, settings:settings}"/>
       </f:for>
    </f:then>
    </f:if>

</f:then>



    <f:else>
      <div class="no-news-found">
        <f:translate key="list_nonewsfound" />
      </div>
    </f:else>
  </f:if>
  <!--TYPO3SEARCH_begin-->
</f:section>
</html>

我正在努力设置一个后备选项,以便在没有选择其他选项时使用默认的详细信息。

据我了解,在这种情况下您无法编写 else if 语句,是否可以设置回退选项?

【问题讨论】:

    标签: typo3 fluid


    【解决方案1】:

    elseif 将/只能在 TYPO3 8 中使用。

    在那之前你需要级联 if VHs in else VHs:

    <f:if condition="{settings.templateLayout} == 11">
    <f:then>
        // do template 11
    </f:then>
    <f:else>
        <f:if condition="{settings.templateLayout} == 12">
        <f:then>
            // do template 12
        </f:then>
        <f:else>
            // do default-template
        </f:else>
        </f:if>
    </f:else>
    </f:if>
    

    或者你使用 switch viewhelper:

    <f:switch expression="{settings.templateLayout}">
    <f:case value="11">
        // do template 11
    </f:case>
    <f:case value="12">
        // do template 12
    </f:case>
    <f:case default="TRUE">
        // do default template
    </f:case>
    </f:switch>
    

    但是那个 viewhelper 有一些小缺点,所以我更喜欢级联的 if VHs。

    【讨论】:

      【解决方案2】:

      猫王,非常感谢。

      我在使用您提供的模板时遇到了一些奇怪的行为。

      当我在前端选择模板 11 时,id 为 11 的模板和默认模板都会渲染每个新闻。

      但是,我使用了下面的代码,它工作正常。我删除了 else 条件,而只使用了三个 if 条件:11,12 或 default(0)。

      <html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
          xmlns:n="http://typo3.org/ns/GeorgRinger/News/ViewHelpers"
          data-namespace-typo3-fluid="true">
      <f:layout name="General" />
      <!--
        =====================
          Templates/News/List.html
      -->
      
      <f:section name="content">
        <!--TYPO3SEARCH_end-->
        <f:if condition="{news}">
            <f:then>
                <f:if condition="{settings.templateLayout} == 11">
                    <f:then>
                      <f:for each="{news}" as="newsItem">
                         <f:render partial="List/homepagetopbanner" arguments="{newsItem: newsItem, settings:settings}"/>
                      </f:for>
                    </f:then>
                </f:if>
                <f:if condition="{settings.templateLayout} == 12">
                  <f:then>
                     <f:for each="{news}" as="newsItem">
                      <f:render partial="List/homepagelist" arguments="{newsItem: newsItem, settings:settings}"/>
                     </f:for>
                  </f:then>
                </f:if>
            </f:then>
           <!-- THIS IS THE DEFAULT -->
           <f:if condition="{settings.templateLayout} == 0">
                     <f:for each="{news}" as="newsItem">
                      <f:render partial="List/Item" arguments="{newsItem: newsItem, settings:settings}"/>
                     </f:for>
           </f:if>
      
            <f:else>
              <div class="no-news-found">
                <f:translate key="list_nonewsfound" />
              </div>
            </f:else>
        </f:if>
        <!--TYPO3SEARCH_begin-->
      </f:section>
      </html>
      

      希望这是有道理的,

      非常感谢您的帮助。

      【讨论】:

      • 您的流体代码无效,因为它在 f:then 之外包含模板 0 的 f:if,在周围的 f:if 中包含 f:else。或者另一种观点:外部 f:if 的 需要在默认 f:if 之后。
      【解决方案3】:

      当然,您可以像下面的脚本一样使用 else

      <html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
          xmlns:n="http://typo3.org/ns/GeorgRinger/News/ViewHelpers"
          data-namespace-typo3-fluid="true">
      <f:layout name="General" />
      <!--
        =====================
          Templates/News/List.html
      -->
      
      <f:section name="content">
        <!--TYPO3SEARCH_end-->
        <f:if condition="{news}">
            <f:then>
                <f:if condition="{settings.templateLayout} == 11">
                    <f:then>
                      <f:for each="{news}" as="newsItem">
                         <f:render partial="List/homepagetopbanner" arguments="{newsItem: newsItem, settings:settings}"/>
                      </f:for>
                    </f:then>
                </f:if>
                <f:if condition="{settings.templateLayout} == 12">
                  <f:then>
                     <f:for each="{news}" as="newsItem">
                      <f:render partial="List/homepagelist" arguments="{newsItem: newsItem, settings:settings}"/>
                     </f:for>
                  </f:then>
                  <f:else>
                     <f:for each="{news}" as="newsItem">
                      <f:render partial="List/default" arguments="{newsItem: newsItem, settings:settings}"/>
                     </f:for>
                  </f:else>
                </f:if>
            </f:then>
            <f:else>
              <div class="no-news-found">
                <f:translate key="list_nonewsfound" />
              </div>
            </f:else>
        </f:if>
        <!--TYPO3SEARCH_begin-->
      </f:section>
      </html>
      

      或者您可以将其与默认模板布局一起使用,例如 0 这个

      <f:else condition="{settings.templateLayout} == 0">
        Add your code here ..
      </f:else>
      

      【讨论】:

      • 在布局 11 的情况下,您没有其他分支到条件测试 11,部分“列表/主页顶部横幅”和部分“列表/默认”将被执行/显示。
      • 确认 - 这发生在我的模板上。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 2020-06-17
      相关资源
      最近更新 更多