【问题标题】:How to have Frontend Layout determine columns and backend layout?如何让前端布局确定列和后端布局?
【发布时间】:2016-09-13 03:05:46
【问题描述】:

有没有办法让前端布局决定后端布局、模板文件和列?

目前我有以下代码,可让您设置后端布局并使用适当的模板文件。但是当每个布局有不同的列位置时,这会变得非常混乱。

page.10 = FLUIDTEMPLATE
page.10 {
    #format = html
    file= fileadmin/templates/example/partials/example_home.html    
    partialRootPath = fileadmin/templates/example/partials/
    layoutRootPath = fileadmin/templates/example/layouts/
    variables {

      # Assign the Columns
      main < styles.content.get
      main.select.where = colPos = 0

      news < styles.content.get
      news.select.where = colPos = 1
      }
    }
}


# Assign the Template files with the Fluid Backend-Template
page.10.file.stdWrap.cObject = CASE
page.10.file.stdWrap.cObject {
  key.data = levelfield:-1, backend_layout_next_level, slide
  key.override.field = backend_layout

  # Set the default Template
  default = TEXT
  default.value = fileadmin/templates/example/partials/example_home.html

  # Set a second Template
  23 = TEXT
  23.value = fileadmin/templates/example/partials/example_internal.html


}

【问题讨论】:

  • 你的问题不是很清楚。您正在使用 backend_layout。每个 backend_layout 都可以在 FE 中有自己的表示。为什么 FE Layout 应该决定 BE 的样子?我的意思是,通常情况相反。你选择你的 BE 布局,它决定了列,你为此准备了一个 FE 视图。在 Fluid 中,有“布局”可用于此目的,因此您可以从模板中选取不同的部分。
  • @AndrásOttó 好吧,如果我们忘记前端布局部分,如何根据选择的后端布局设置不同的 colPos?
  • @AndrásOttó 另外,如果您有两个使用相同后端布局的不同模板,您会怎么做?

标签: typo3 typoscript fluid typo3-7.6.x


【解决方案1】:

以编程方式,

$backendLayout=$GLOBALS['TSFE']->cObj->getData('pageLayout');

如果在后端[-1]中选择了None,它将输出'none'。 如果没有选择任何内容,它将输出'default'。否则,它将输出正确的后端布局,并以您的扩展为前缀,同时考虑到页面祖先链上的子页面布局。

【讨论】:

    【解决方案2】:

    一点也不乱,这是一个真实的例子:

    page.10 = FLUIDTEMPLATE
    page.10 {
      file.stdWrap.cObject = CASE
      file.stdWrap.cObject {
        key.data = pagelayout
    
        default = TEXT
        default.value = {$customPagesTemplatePath}/Standard.html
    
        1 = TEXT
        1.value = {$customPagesTemplatePath}/Home.html
    
        2 = TEXT
        2.value = {$customPagesTemplatePath}/Landing.html
    
        10 = TEXT
        10.value = {$customPagesTemplatePath}/NewsDetail.html
    
        11 = TEXT
        11.value = {$customPagesTemplatePath}/LandingMini.html
    
        12 = TEXT
        12.value = {$customPagesTemplatePath}/FullWidth.html
      }
      layoutRootPath = {$customPagesLayoutPath}
      partialRootPath = {$customPagesPartialPath}
    
    }
    

    这样想:

    • 正如您所说,忘记前端布局。那是遗产; be 布局服务于 BE 和 FE。

    • 如果页面是城市,那么 colPos 就是街道。或者更确切地说,想象后端是您正在绘制的地图,前端是您根据该地图构建的乐高城市 :-)) 如果没问题,我会坚持使用这个比喻。

    ColPos 是记录所在页面的确定部分。如果可以,请查看数据库中的 tt_content 表:您会看到 colPos 只是一个带有数字的列。所以在“第 1 页”城市中,有一条名为“colPos 7”的街道,其中包含一些记录(那些将是房屋)。使用 TYPO3 中的 be_layout 向导,您将创建该城市的行政地图:编辑器应如何查看这些街道。

    在您调用的FLUIDTEMPLATE 中,根据所选的be_layout,您将创建城市本身;渲染的前端。

    以下是此类流体模板 (Home.html) 的另一个真实示例:

    <f:render partial="Mobilenav" />
    <f:render partial="Header"/>
    
    <div class="row">
    <f:cObject typoscriptObjectPath="lib.home-teaser" />
    </div>
    
    <aside>
      <div class="row">
        <div class="columns">
          <div class="row">
            <div class="fp-teaser-outer small-48 medium-24 large-12 columns">
              <div class="fp-teaser-box-wrapper">
                <f:cObject typoscriptObjectPath="lib.home-something" />
              </div>
            </div>
            <div class="fp-teaser-outer small-48 medium-24 large-12 columns">
              <div class="fp-teaser-box-wrapper">
                <f:cObject typoscriptObjectPath="lib.home-somethingelse" />
              </div>
            </div>
            <div class="fp-teaser-outer small-48 medium-24 large-12 columns">
              <div class="fp-teaser-box-wrapper">
                <div class="fp-teaser-box">
                  <f:cObject typoscriptObjectPath="lib.home-news-plugin-title" />
                  <div class="fp-teaser-hr"></div>
                  <div class="fp-teaser-content">
                    <f:cObject typoscriptObjectPath="lib.home-news" />
                  </div>
                </div>
              </div>
            </div>
            <div class="fp-teaser-outer small-48 medium-24 large-12 columns">
              <div class="fp-teaser-box-wrapper">
                <div class="fp-teaser-box">
                  <f:cObject typoscriptObjectPath="lib.home-blog-plugin-title" />
                  <div class="fp-teaser-hr"></div>
                  <div class="fp-teaser-content">
                    <f:cObject typoscriptObjectPath="lib.home-blog" />
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </aside>
    
    <f:render partial="Footer"/>
    

    ...好吧,但是与 colPos 的相关性在哪里? 还没有!我(虽然肯定还有其他方法)在 TypoScript 中这样做:

    lib.home-something < styles.content.get
    lib.home-something {
      select.where = colPos = 7
    }
    

    因此,我们为流体模板准备内容:获取该页面第 7 列的所有内容(使用扩展名 fluid_styled_content)并将其放入“lib”内容对象中。

    然后通过f:cObject viewhelper 将其插入页面:

    <f:cObject typoscriptObjectPath="lib.home-something" />
    

    像这样,第 7 街的所有房屋都被放入城市中的这个位置 - 并因此呈现在您的页面中。

    【讨论】:

    • 我有两个问题:1) 你可以让“home-something”在一个布局中的 colPos 7 中,而在另一个布局中的 colPos 6 中吗? 2) 如果你有 2 个流体模板共享相同的 BE 布局,你会怎么做?
    • 1) 这只是命名 - 是的。您可以随意设置。你不能做的是在两个不同的地方有相同的内容元素/记录。因为你不能在第 6 街和第 7 街拥有相同的房子。不过,您可以在两条街道上放置两座相同的房屋。或者,当它正在计算时,将您的房子从第 6 街镜像到第 7 街
    • 2) 模板只是说明内容是如何呈现的。您可以根据需要为相同的内容制作尽可能多的模板。您的情况可能是在某些情况下您想将一个模板应用于页面,但在其他情况下又是另一个?而且您不知道如何传递该信息(使用哪个模板)?好吧,你必须在你的 TypoScript 中引入更多的逻辑;例如“如果设置了这个 GET 参数,那么选择这个不同的 BE 布局”。我建议为此设置一个单独的问题。
    • 所以对于 1) 你是说我应该简单地将列命名为特定于他们的模板,例如“home1maincontent”和“home2maincontent”(假设我有两个主页)?
    • 我不确定您所说的“命名列”是什么意思。可能是。标准答案是“如果它适合你,那就没问题”。我建议您了解更多有关流体 / TypoScript 的背景知识,然后一切都会变得更加清晰。或者练习,这就是你正在做的。继续尝试:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 2016-10-18
    • 2016-09-14
    • 1970-01-01
    • 2010-11-06
    相关资源
    最近更新 更多