bmack/modern-template-building

对TYPO3旧式基于标记的模板的致敬。包括TEMPLATE和FILE cObjects。

安装数: 8,994

依赖关系: 3

建议者: 0

安全: 0

星级: 11

关注者: 2

分支: 5

开放问题: 0

类型:typo3-cms-extension

1.1.1 2024-04-03 20:44 UTC

This package is auto-updated.

Last update: 2024-09-17 08:41:22 UTC


README

在TemplaVoila或基于Fluid的模板出现之前,TYPO3的创建者Kasper Skaarhoj创建了一个名为"Modern Template Building"的指南——其中集成者可以用占位符(所谓的"标记"和"子部分")编写HTML模板,而无需在TypoScript中编写一切。

这个概念一直存在于TYPO3 v10,但现在不推荐使用,因为TemplaVoila和Fluid提供了更多创建模板的更灵活的方式。

对于所有怀念TYPO3的爱好者,我创建了这个扩展,它包含两个"内容对象"——TEMPLATEFILE,以便在未来的TYPO3版本中使用。

这个扩展是一个完美的例子,说明20年前用这种方法创建的模板,仍然可以在TYPO3 v9、v10或更高版本上运行,无需进行任何修改。TYPO3因其

  • 向下兼容性,
  • 升级路径和
  • 灵活性

而受到喜爱,而这正是通过一个简单的扩展所能实现的。

安装

只需从TYPO3扩展存储库安装此扩展(扩展键modern_template_building),或通过composer req bmack/modern-template-building,然后就可以使用了。

一旦扩展安装完成,您就可以在自定义的TypoScript代码中继续使用cObjects FILETEMPLATE

配置

这是从原始TYPO3文档中提取的,并对该扩展进行了轻微修改。

TEMPLATE内容对象

使用类型为TEMPLATE的对象,您可以定义一个模板(例如一个HTML文件),该模板应作为整个网站的基础。在模板文件中,您可以定义标记,这些标记稍后将被TYPO3替换为动态内容。

template (数据类型:cObject)

这必须加载模板代码。通常这是通过FILE cObject完成的。如果没有加载代码,该对象返回空值。

示例

page.10 = TEMPLATE
page.10 {
   template = FILE
   template.file = fileadmin/template.html
}

这将使用fileadmin/template.html作为您网站的模板。

subparts.[数组] (数据类型:cObjects数组)

这是一个包含子部分标记(大小写敏感)的数组。

子部分由模板中的两个标记定义。标记必须被"###"包围。您可以在HTML注释标签内插入子部分标记!

示例

在模板中有一个名为"HELLO"的子部分

<!-- start of subpart ###HELLO### -->
This is the HTML code, that will be loaded in the register
and will be replaced with the result...
<!-- end ###HELLO### -->

下面的TypoScript代码现在用"值"中的文本替换子部分"HELLO"。

page.10.subparts {
  HELLO = TEXT
  HELLO.value = En subpart er blevet erstattet!
}

注意:在生成每个子部分的内容对象之前,将提取并加载数组中的所有子部分到注册表中,这样您就可以稍后从那里加载它们。

每个子部分代码的注册键为"SUBPART_[theSubpartkey]"。

此外,在解析子部分的cObject之前,将加载每个子部分的内容。这使得加载cObject的子部分(例如:".current = 1")变得相当简单。例如,上面的子部分具有注册键"SUBPART_HELLO"。

这仅在属性 .nonCachedSubst 未设置的情况下有效(见下文)!

relPathPrefix (数据类型:字符串/属性)

找到所有相对引用(例如到图像或样式表)并前缀此值。

如果您指定属性(大写),则这些将与HTML标签匹配并指定它们的替代路径。请参见以下示例。

如果属性名为 "style",它将为 "<style>" 部分中可能存在的 "url()" 包装器设置一个替代路径。

示例

page.10 = TEMPLATE
page.10 {
  template = FILE
  template.file = fileadmin/template.html
  relPathPrefix = fileadmin/
  relPathPrefix.IMG = fileadmin/img/
}

在此示例中,找到的所有相对路径都以前缀 "fileadmin/" 开头,除非它是 img 标签的 src 属性,在这种情况下路径以前缀 "fileadmin/img/" 开头。

marks.[array](数据类型:cObjects 数组)

这是一个标记标记的数组(区分大小写)。

标记由模板中的 一个 标记定义。标记必须在两侧用 "###" 包装。与子部分相反,你 不能 在 HTML 注释标签中插入子部分标记!(它们不会被移除)

示例

在模板中

<div id="copyright">
  &copy; ###DATE###
</div>

以下 TypoScript 代码现在将动态地将 "DATE" 标记替换为当前年份

page.10.marks {
  DATE = TEXT
  DATE {
    stdWrap.data = date : U
    stdWrap.strftime = %Y
}

标记由 str_replace-函数替换。在注册器中加载的子部分也适用于标记的 cObjects(只有当 .nonCachedSubst 未设置时!)。

wraps.[array](数据类型:cObjects 数组)

这是一个 wraps 标记的数组(区分大小写)。

以下是一个示例,说明这一点

示例

在模板中有子部分 "MYLINK"

This is <!--###MYLINK###-->a link to my<!--###MYLINK###--> page!

使用以下 TypoScript 代码,子部分将被替换为 MYLINK cObject 返回的内容。

page.10.wraps {
    MYLINK = TEXT
    MYLINK.value = <a href="#"> | </a>
}

workOnSubpart(数据类型:字符串 / stdWrap)

这是对要处理的子部分的可选定义。换句话说;如果您定义此值,则从模板中提取该子部分,并将其作为整个模板对象的依据。

markerWrap(数据类型:wrap / stdWrap)

默认值:### | ###

这是标记所包装的包装。默认值是 ### | ###,结果标记将呈现为 ###[marker_key]###

在设置围绕 marker_key 之前,会从包装项周围移除任何空白。

substMarksSeparately(数据类型:布尔值 / stdWrap)

如果设置,则标记在子部分和包装替换之后的内容中替换。

通常,当使用 TEMPLATE cObject 的默认缓存模式时,标记不会在子部分和包装内部替换。如果您有子部分内的标记,这是一个问题!但设置此标志将使标记替换成为一个非缓存的后续过程。

另一种解决方案是关闭缓存,见下文。

nonCachedSubst(数据类型:布尔值 / stdWrap)

如果设置,则此 cObject 的替换模式将完全不同。通常,读取原始模板并将其划分为由 marks、subparts 和 wraps 键指定的部分。好处是速度快,因为此“预解析”模板被缓存。坏处是依赖于增量替换(替换顺序很重要的替换)的模板可能无法很好地工作。

通过设置此标志,首先在模板中将标记逐个通过 str_replace 替换 - 一次一个。然后逐个替换子部分。最后,逐个替换包装。

显然,您会失去使用上述注册键引用模板中其他部分的能力。

stdWrap(数据类型:stdWrap)

此 cObject 也可以通过全局 stdWrap 功能进行管理。

示例

page.10 = TEMPLATE
page.10 {
  template = FILE
  template.file = fileadmin/test.tmpl
  subparts {
    HELLO = TEXT
    HELLO.value = This is the replaced subpart-code.
  }
  marks {
    Testmark = TEXT
    Testmark.value = This is replacing a simple marker in the HTML code.
  }
  workOnSubpart = DOCUMENT
}

在此示例中,加载并使用了一个名为 test.tmpl 的模板。模板文件中的子部分 "HELLO" 和标记 "Testmark" 将被替换为相应 cObject 的输出。

FILE 内容对象

此对象返回属性 "file" 中指定的文件的內容。

注意:不要将此与 cObject :ref:FILES <cobj-files> 混淆;这两个都是不同的 cObjects。

file(数据类型:资源 / stdWrap)

应返回其内容的文件。

如果资源是 jpg, jpeg, gif 或 png,则图片将以图像标签的形式插入。所有其他格式都会被读取并插入到HTML代码中。

内部设置的文档最大文件大小为1024 KB!

linkWrap(数据类型:linkWrap / stdWrap)

在".wrap"和".stdWrap"之前执行。

wrap(数据类型:wrap / stdWrap)

在".linkWrap"和".stdWrap"之后执行。

stdWrap(数据类型:stdWrap)

此 cObject 也可以通过全局 stdWrap 功能进行管理。

在".linkWrap"和".wrap"之后执行。

altText / titleText(数据类型:string / stdWrap)

仅针对输出!

如果没有指定alttext,则将使用空alttext。

emptyTitleHandling(数据类型:string / stdWrap)

值可以是keepEmpty以保留空标题属性,或者useAlt以使用alt属性。默认为useAlt

longdescURL(数据类型:string / stdWrap)

仅针对输出!

"longdesc"属性(指向包含关于图像详细信息的文档的URL)。

示例

在这个例子中定义了一个页面,但body标签之间的内容直接来自文件"gs.html"。

page = PAGE
page.typeNum = 0
page.10 = FILE
page.10.file = fileadmin/gs/gs.html

许可协议

该扩展在GPL v2+许可下使用,与TYPO3核心相同。有关详细信息,请参阅此存储库中的LICENSE文件。

开放问题

如果您发现任何问题,请随时在GitHub上创建一个问题或pull request。

致谢

此扩展由Benni Mack于2020年创建。最初的致谢归功于TYPO3开发团队和贡献者,他们在此代码被从核心移除之前,维护了超过20年。