我亲爱的孩子... 深入探究Joomla子模板
你是否曾经修改过模板文件,却发现所有更改在下一个更新后都消失了?那么我们有个好消息要告诉你:从Joomla 4.1版本开始,这已经成为历史!随着创建子模板选项被添加到核心中,你可以做出持久的更改。本文将解释这是如何工作的。
回到2020年8月,人们希望子模板能加入Joomla 4.0
讨论和开发最好在GitHub上跟进
https://github.com/joomla/joomla-cms/pull/30192
这个线程非常吸引人,因为它展示了之前的概念和这个概念的演变。
概念是有的,但用户界面(UI)缺失,所以由Dimitris Grammatikogiannis进行了重新设计,经过修改后的尝试在4.1版本中完全作为子模板加入。
Joomla模板引擎
了解一下模板引擎是如何工作的可能是个好主意。
这是一个非常简化的概述,所以请考虑这一点。
这个过程从对网站页面的请求开始。
一旦请求通过解析DNS通过URL到达服务器,服务器就必须查看是否有静态文件可以提供,如果没有,那么服务器上的PHP就会跳入行动,指示Joomla CMS满足请求。
Joomla有一个生命周期,当它执行代码的部分时,它最终会到达路由器。在路由器中,Joomla会询问所有组件是否有什么可以满足请求的。如果有任何组件站出来表示它可以,那么请求就会通过该组件的模型视图控制器层(MVC)工作。
首先,控制器介入并加载模型,模型将从一个数据库中获取数据,然后它被传送到视图,这是组件的模板区域。
它将把模型提供的所有数据结构连接成一个HTML结构。
接下来,它会唤醒站点的模板,模板将遍历替换所有jdoc:include标签。
这是构建模块和其他页面部分的地方。随着jdoc:include标签被读取,它们会启动遇到的模块,如mod_menu,然后各个模块会评估它们应该添加的信息,并将其添加到模板正在组装的信息中。
一旦完成,生成的HTML将发送到浏览器,浏览器为您渲染页面。
简单!
向前迈进子模板
子模板背后的概念是使用单个XML文件来克服编辑当前模板的问题:即任何对模板的编辑在模板更新时都会丢失。
子模板是一个只有一个文件的模板,即templateDetails.xml
。子模板必须有父模板;它们不能在没有引用父模板的情况下存在。
主要模板文件已进行了一些更改,以允许这种情况发生。在Cassiopeia模板的XML文件中,您将看到一些新的包含内容。
其中最明显的是
<inheritable>1</inheritable>
这一点很重要,因为这是父模板声明它可以有子模板的地方。
如果生活能这么简单就好了!
另一个重要的更改是媒体目标。
<media destination = “templates/site/cassiopeia” folder=”media”>
这定义了模板的媒体文件夹应该位于哪里。
为什么将媒体文件夹更改到模板的XML定义中?
在一定程度上,这是为了帮助解决历史不一致的问题。
Joomla中的所有其他包都将它们的静态资产存储在媒体文件夹中。
模板一直是这个规则的唯一例外。
几个模板俱乐部和模板构建者已经声明,他们将从将模板资产存储在模板或任何其他位置中移动到标准的Joomla,位于/media。
所以从现在开始,标准是:/media/templates/[管理员或站点]/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>
使用子模板的方法
您可以在模板区域找到创建子模板的位置:管理员 ->系统 ->模板 ->站点模板。
选择您希望从中创建子模板的父模板。
现在我们有了开始进行更改的能力。
比如说,您想创建对user.css文件的覆盖。
完成此操作的方式是通过分叉模板中的所有文件,创建我们主要模板的副本,然后将其设为默认模板。然后我们会进入并编辑我们想要编辑的一个文件。
这只是为了做一个更改而复制了太多的文件。
如果我们使用子模板,子模板是一个单文件,然后我们会添加我们想要编辑的特定文件,这只有2个文件,更容易导航和维护。
例如,我们可以创建主要Cassiopeia模板的新索引文件,然后简单地编辑它以更改输出顺序,添加新区域,真正改变页面。
区别在哪里?您不需要复制所有模板文件夹和文件,只需复制您需要编辑的一个文件即可。
所以简单!
如果您想添加新的模块位置,这也很容易,我们只需复制templateDetails.xml文件并添加新的位置。
<position>我的新位置</position>
然后我们可以立即使用这个位置与模块一起使用,这为扩展模板的模块位置提供了快速简单的方法。
我们可以在templateDetails.xml中添加额外的字段,并在保存文件后,额外的字段变为可用。
一个地方存放您所有的资产
我们已经提到了父模板中静态文件存储的更改。
/media
在子模板中,所有资产都在媒体文件夹中。我们所说的资产是指什么?
资产是用于改变模板外观和感觉的东西
- CSS
- JavaScript
- 图片
- 字体
- 图标
通过在子模板中包含您的资产,您可以在不覆盖父文件的情况下,轻松地提供不同的javascript、css、图片、字体和图标!
是否可以导出子模板?
可以的。虽然目前还没有导出功能,但您只需要创建一个包含模板文件的压缩包,然后您就可以将其导入到另一个网站上。
需要的文件和文件夹是
文件
templateDetails.xml
index.php
文件夹
media
在媒体文件夹中,您可以找到该子模板的特定媒体文件。
如果您打算将子模板导入到同一网站以快速创建一个新的网站,您需要在xml文件中更改子模板的名称和媒体目标。
如何将不同的子模板分配到您的网站?
这和使用多个模板时是一样的:您只需前往子模板中的菜单分配选项卡。
在管理员区域,转到
系统 -> 网站 -> 网站模板样式
选择您想要分配的子模板模板样式,然后选择第三个选项卡“菜单分配”。在那里,您可以选择哪些菜单项将使用您的子模板。
覆盖与子模板
一个很好的问题是何时使用覆盖最佳,何时使用子模板最佳?
首先,什么是覆盖?
覆盖是一个可以创建并存储在模板HTML文件夹中的文件,它允许您为组件或模块提供自己的布局。
到目前为止,一切顺利,但通常模板会包含对模板中核心Joomla组件的覆盖,以便模板可以创建与标准Joomla模板不同的布局。如果您想更改模板覆盖的外观,则需要直接编辑模板文件,这不是一个好主意。更新后,您的工作可能会被覆盖。
这就是子模板的美丽之处:无论是您的模板中是否有自定义覆盖,还是您想为组件的布局添加自己的特色,您都可以使用子模板,并且有信心在组件和模板更新时您是掌控者。
子模板的演示
在最近的一次Joomla伦敦用户组会议上,Dimitris Grammatikogiannis就子模板做了出色的演讲。如果您想尝试这个概念,在将子模板纳入您的Joomla编码工具包之前观看视频是个明智的选择。
https://www.youtube.com/watch?v=8lX44gS9QG8&t=72s
在Joomla社区杂志上发表的一些文章代表了作者对特定主题的个人观点或经验,可能与Joomla项目的官方立场不一致
通过接受,您将访问https://magazine.joomla.net.cn/之外第三方提供的服务的链接
评论 2
感谢一篇不错的文章,解释了新的功能和纠正了系统错误。
一位非常能干的程序员告诉我,每个系统的文件系统都是任何学习者遇到的第一个绊脚石,我在30多年的时间里反复遇到这种情况,现在在许多系统中仍然遇到,包括Joomla。我知道底层文件系统是Unix风格的,但我被各种Joomla过程的方式搞糊涂了,这些过程不告诉我我在哪里。
在你的文章中,你包括了一个屏幕截图,清楚地说明了模板媒体目录位置的更改。做得好,谢谢。
感谢您这篇文章,以及Joomla中子模板的详细解释。这个功能从Joomla! v4.1版本开始提供,在我看来,这是这个版本最伟大的新功能,尤其是对模板开发者来说。我们已经修改了所有我们的Joomla 4模板(约90个),并将它们全部改为子模板。父模板是我们的框架,现在升级、错误修复等操作都变得更加简单。
继续加油!Joomla! 4很棒!
最好的祝愿,
米洛斯