您是否曾经花费大量时间修改Joomla模板文件,结果在下一次更新时所有心血付诸东流?好消息是,从​​Joomla 4.1​​开始,这个问题已成为历史!核心功能中新增的​​子模板 (Child Templates)​​,让您的定制修改得以永久保留。本文将深入解析其工作原理与使用方法。

Joomla 4.0 的铺垫与 4.1 的实现​

早在2020年8月,社区就期待子模板能随Joomla 4.0发布。相关讨论与开发历程详见于Github:https://github.com/joomla/joomla-cms/pull/30192。该讨论展现了概念的演进:虽核心构想已成型,但初期缺乏用户界面(UI)。后经开发团队重构,此功能最终在​​Joomla 4.1​​中作为核心特性完整落地。

Joomla模板引擎工作简析(高度简化)

或许有必要概述一下模板引擎的工作原理。这里做了高度简化,请理解这一点。

  • 过程始于对网站页面的请求。一旦请求通过解析后的 DNS 经由 URL 到达服务器,服务器需要判断是否有静态文件可以提供。如果没有,服务器上的 PHP 就开始行动,指示 Joomla CMS 来满足该请求。
  • Joomla 有其生命周期,在执行代码部分时,最终会到达路由器 (router)。在路由器处,Joomla 会询问所有组件是否有能力满足该请求。如果有任何组件响应说它可以,那么请求就会通过该组件的模型-视图-控制器 (Model View Controller, MVC) 层进行处理。
  • 首先,控制器 (controller) 启动并加载模型 (model),模型将从数据库获取数据。接着,数据被传递给视图 (view),视图是组件的模板化区域。视图会将模型提供的数据结构连接 (concatenate) 成一个 HTML 结构。
  • 然后,它会唤醒站点的模板 (template),模板会遍历并替换所有的 jdoc:include 标签。这里就是构建模块 (modules) 和页面其他部分的地方。当读取到 jdoc:include 标签时,它们会启动遇到的模块(如 mod_menu),然后各个模块会评估它们应该做什么,并将结果添加到模板正在组装的信息中。
  • 全部完成后,生成的 HTML 被发送到浏览器,浏览器渲染页面供您查看。就这么简单!

​​子模板登场​​

子模板背后的概念是使用单个 XML 文件来克服困扰当前模板编辑的问题:即对模板的任何编辑在模板更新时都会丢失。

子模板是一个只有一个文件的模板,这个文件就是 templateDetails.xml。子模板必须有一个父模板;它们不能在没有引用的父模板的情况下存在。主模板文件中也进行了一些更改以支持这一点。

在 Cassiopeia 模板中,您会在其 XML 文件中看到一些新的内容。最引人注目的之一是:

<inheritable>1</inheritable>

这很重要,因为这是父模板声明它可以拥有子模板的地方。

另一个重要的变化是媒体文件的目标路径 (media destination)。

<media destination = “templates/site/cassiopeia” folder=”media”>

 这定义了模板的媒体 (media) 文件夹应该位于何处。为什么要在模板的 XML 定义中更改这个媒体文件夹的位置?

在某种程度上,这是为了帮助清理历史遗留的不一致。Joomla 中的所有其扩展包(packages) 都将它们的静态资源存储在 media 文件夹中。模板一直是此规则的唯一例外。因此,从现在开始,标准是:

/media/templates/[administrator 或 site]/yourtemplate

在子模板中,您可以在 XML 中指定文件存放的位置。让我们用一个例子来说明:

<media folder="media" destination="templates/site/cassiopeia_phils">
<folder>css</folder>
<folder>js</folder>
<folder>images</folder>
</media>
<inheritable>0</inheritable>
<parent>cassiopeia</parent>
</extension>

​​使用子模板的方法​​

您可以在模板区域找到创建子模板的地方:​​管理员后台 -> 系统 -> 模板 -> 站点模板 (System -> Templates -> Site Templates)​​。选择您希望从中创建子模板的父模板。

现在我们就可以开始进行更改了。例如,假设您想为 user.css 文件创建一个覆盖 (override)。以前的做法是复制模板中的所有文件,创建主模板的一个副本,然后将其设为默认模板。接着我们再去编辑我们想要编辑的那个文件。这需要复制大量文件,仅仅是为了做一个更改。

如果我们使用子模板,子模板只是一个文件,然后我们只需添加我们想要编辑的特定文件,总共就 2 个文件,管理和维护起来要容易得多。

例如,我们可以复制主 Cassiopeia 模板的 index.php 文件,然后简单地编辑它以更改输出的顺序、添加新区域,彻底改变页面。区别在哪里?您无需复制所有模板文件夹和文件,只需复制您需要编辑的那个文件即可。

如果您想添加一个新的模块位置 (module position),同样非常容易。我们只需复制 templateDetails.xml 文件并添加新的位置声明:

<position>My new Position</position>

 然后,我们就可以立即在模块中使用这个位置,提供了一种快速简便的方法来扩展模板的模块位置。

我们还可以在 templateDetails.xml 中添加额外的字段(fields),保存文件后,这些额外字段就会变得可用。

​​所有资源的一站式管理​​

我们已经提到了父模板中静态文件存储位置的变化:/media。

对于子模板,所有资源都位于 media 文件夹中。我们所说的资源是指什么?资源是指用于改变模板外观和感觉的东西:

  • CSS
  • JavaScript
  • 图片 (Images)
  • 字体 (Fonts)
  • 图标 (Icons)

通过在子模板中包含您的资源,您可以轻松地在子模板中提供不同的 JavaScript、CSS、图片、字体和图标,而不会覆盖父模板的文件!

​​可以导出子模板吗?​​

是的,可以。目前还没有导出功能,但您只需要将模板的文件打包成一个 zip 文件,就可以将它们导入到另一个站点。需要的文件和文件夹是:

​​文件:​​
templateDetails.xml
index.php
​​文件夹:​​
media
在 media 文件夹中,您会找到该子模板的特定媒体文件。

如果您打算将子模板导入到同一个站点以快速创建一个新的子模板,您将需要在 XML 文件中更改子模板的名称和媒体目标路径。

​​如何将不同的子模板分配给您的站点?​​

这与使用多个模板时相同:您只需进入子模板的​​菜单分配 (Menu Assignment)​​ 选项卡。

在管理员区域,转到 ​​系统 -> 站点 -> 站点模板样式 (System -> Site -> Site Template Styles)​​。选择您想要分配的、作为子模板的模板样式,然后选择第三个选项卡“菜单分配 (Menu Assignment)”。在那里,您可以选择哪些菜单项将使用您的子模板。

​​什么时候覆盖最好,什么时候子模板最好?

首先,什么是覆盖?覆盖是您可以在模板的 html 文件夹中创建并存储的文件,它允许您为组件或模块提供自己的布局。到目前为止都很好,但通常模板会自带核心 Joomla 组件的覆盖,以便模板可以创建与标准 Joomla 模板不同的布局。如果您随后想更改模板覆盖的外观,就需要直接编辑模板文件,这不是个好主意。更新时,您的工作可能会被覆盖。

这就是子模板的美妙之处:无论您的模板中是否有自定义覆盖,或者您想为组件的布局添加自己的特色,您都可以使用子模板,并确信在组件和模板更新时,您仍然掌控着修改。

作者: 樱木花道

Joomla程序员,从J1.5到J4.x始终都在做Joomla相关开发定制工作,有超过10年行业经验,国内Joomla扩展开发商ZMAX团队的核心成员

作者网站:ZMAX程序人

评论 (0)

  • 最新在前
  • 最佳在前