14分钟阅读时间 (2761个单词)

构建组件的工具 - 第1集:简介和核心解决方案

July-Components

你可能知道Joomla是创建网站的最佳工具,因为它从盒子里出来就非常完整。如果你需要更多一点,你可以使用Joomla扩展目录中可用的数千个扩展之一...或者自己创建一个。在这个系列中,Herman Peeren将带我们了解这些选项。

Joomla可扩展

Joomla不仅仅是一个用于在网站上显示文章的内容管理系统。它的核心非常灵活,提供了许多定制选项。Joomla可以通过组件、模块、插件和模板几乎无限地扩展。(1)

除了现有的内容外,你还可以创建自己的扩展。这样做非常有趣!在这个系列中,我们将展示各种定制和扩展Joomla的方法。我们的主要重点是创建一个组件,但也会涵盖核心功能和其他解决方案,以便在不构建组件的情况下添加自定义功能。

过去的一些有用工具不再维护。因此,我们只限制了与Joomla 4或更高版本兼容的解决方案。

制作组件的工具

在这个系列中,我们将创建一个用于活动日程的自定义组件,并展示几个辅助构建过程的功能。

  • 第一篇文章:我们将展示如何仅使用Joomla的核心功能创建活动日程,而不创建组件。
  • 第二篇文章:仍然不构建组件,我们将使用内容构建工具包(Seblod)和应用构建工具(Fabrik)来开发活动日程。
  • 第三篇文章:我们终于要为我们的活动日程创建一个真正的Joomla组件了!我们将介绍一些用于脚手架的工具,如create-joomla-extensionJExt。还有一些用于开发和打包的工具,如JoRobo或语言字符串助手。
  • 然后,我们计划撰写一系列关于根据您的规格生成组件的Component CreatorComponent Generator以及可能J Cook Pro等软件即服务解决方案的文章,以及生成Joomla扩展的Joomla扩展,如Joomla Component BuilderExtension Generator
  • 最后,我们将比较展示的解决方案,根据价格、学习曲线、输出、维护、性能、灵活性、分发、文档和支持等标准进行评估。

工具可能很有帮助,但……

低代码/无代码(LCNC)平台和生成式AI的兴起,使用户能够以最少的编程经验构建应用程序。

然而,这引发了一个质量保证悖论

  • 有经验的程序员不需要这些工具,可以评估生成的输出。
  • 新手程序员只能通过这些工具进行编码,可能缺乏判断代码质量的专长。

这些工具仅仅是辅助工具。熟练的工匠可以用高质量的工具更快、更好地工作,但新手必须谨慎,不要过度依赖自动代码生成。没有一种工具可以在不付出努力、最少技能或专家指导下为你做所有事情。

“傻瓜的工具仍然是傻瓜”(Grady Booch)

哲学说够了,让我们开始工作。

示例扩展:活动日程

我们的示例基于Tom van der Laan在荷兰JoomlaDagen 2024上的演讲,关于Joomla Component Builder,是一个创建活动日程的组件。例如,例如JoomlaDagen的日程 (2)

这个JoomlaDagen日程包括2页或标签页,用于活动的2天。每天,演讲、地点和时间都详细说明。

我们的活动日程更通用,不仅仅适用于会议,因此使用更通用的术语

  • 每场演讲被称为一个活动
  • 一个房间被称为一个部分
  • 一天被称为一个容器

在开发人员的语言中,“活动”、“部分”和“容器”是实体(存在的东西,来自拉丁语“esse”,即“是”)。实体关系图(ERD)可以说明它们之间的关系

上面的图是使用http://www.plantuml.com制作的,但还有其他几个免费工具(3)

线条末端的符号具有以下含义:

Symbols for multiplicity, used in an Entity Relationship Diagram

您可以在这里了解更多有关在实体关系图中使用的符号。图中的“FK”标记表示“外键”:它指向另一个实体。

所以,上面的图表示

  • 一个容器可以有多个部分。
  • 一个部分可以属于多个容器。
  • 一个容器和一个部分都可以有多个活动。
  • 但是:一个活动只能在一个容器和一个部分中。

将其翻译回JoomlaDagen的演讲

  • 在一天中,多个房间可以可用。
  • 一个房间可以在多天可用。
  • 一天和房间都可以有多个演讲。
  • 但是:一个演讲最多只能在一个房间的一天中。

此系统将稍后扩展,允许对同一事件进行多次调度。

容器可以表示各种概念,例如日历日或位置。例如,在瑜伽学校的每周日程表中,星期几是部分,或在摇滚音乐节中,舞台是列出表演乐队的部分。

我们的日程表始终进行交叉表(横向)和时间(纵向)的排列,允许并行事件调度。不同的容器代表不同的日程。

核心解决方案
字段、字段组和类别

自3.7版(2017年)以来,Joomla核心允许通过自定义字段向内容类型添加属性。

Joomla中存在两种对“自定义字段”的用法。

  1. 向现有内容类型(文章、联系人、用户、类别)添加附加字段。这被构建Joomla站点的人广泛使用。请参阅:[https://docs.joomla.org/J4.x:Adding_custom_fields](https://docs.joomla.org/J4.x:Adding_custom_fields)

  2. 将其他类型的表单字段添加到您的组件中,例如在[https://manual.joomla.net.cn/docs/general-concepts/forms-fields/custom-fields-overview/](https://manual.joomla.net.cn/docs/general-concepts/forms-fields/custom-fields-overview/)中。这主要用于开发人员在构建组件时。

在本文的剩余部分,我将使用“附加字段”来指代第一种自定义字段类型,并使用“表单字段”来指代第二种类型。两者都可以是标准或自定义的。

对于我们的活动日程,我们将向文章添加附加字段,使其成为事件。

在创建组件时,您通常会为大多数实体应用单独的数据库表。但是,如果您向文章添加附加字段,这些附加字段都将添加到文章中,成为我们系统中的“事件”实体。

使用附加字段实现多个实体通常有三种解决方案

  1. 作为主实体中的一个字段,在添加一个单字段实体时。通常作为列表字段实现。

  2. 使用一个子表单字段:您可以使用它指定其他实体的所有字段。您甚至可以有多个子表单实例!

  3. 使用另一个文章、联系人、用户或类别来添加附加字段,以创建实体。然后通过SQL字段或通过自定义附加字段添加对该其他实体的链接(4)。其他实体将作为单独的记录存储在数据库表中。

我们将把部分和容器作为列表字段实现我们的活动实体。对于JoomlaDagen日程表,没有必要使这两个列表相互依赖,因为两天(=容器)都有相同的房间(=部分)可用。

使用附加字段构建活动日程表

我们不会在这里重复整个关于附加字段的杂志系列。请参阅本文下的[链接](#additional-fields)。但一般来说,构建某物的步骤是

  1. 确定要使用哪些核心内容类型(文章、联系人、用户或类别)作为我们的实体基础。
  2. 确定这些内容类型的现有字段,以供我们的实体重用。
  3. 添加必要的附加字段。
  4. 创建模板覆盖和/或替代模板布局以显示实体。

1 - 实体基础

我们将使用文章作为我们事件实体的基础。我们将为文章创建一个“活动日程”类别和一个“活动日程”字段组。

2 - 重用文章字段

我们可以重用一些文章字段来为我们的事件实体服务:

  • 标题可以用来表示活动名称。
  • 简介(=直到“阅读更多……”)可以用作简短描述。
  • 全文(=在“阅读更多……”之后)可以包含活动的完整描述。
  • 我们将使用模板覆盖中的标签进行样式设计。在JoomlaDagen概述中:为不同的目标受众或活动类型使用不同的颜色。

通常,文章中经常被重复使用的字段包括图片、作者(指用户)以及当然还包括围绕视图访问和其他访问权限的所有管理。

3 - 其他字段

我们目前添加的其他字段有:

  • 演员:目前是一个简单的文本区域字段,您可以在此列出执行活动的人员的姓名:会议上的主持人、音乐节上的乐队、比赛中的队伍等。
  • 时长:活动所需分钟数的一个整数。
  • 开始时间:ACF 时间选择器字段。
  • 结束时间:ACF 时间选择器字段。
  • 容器:一个列表框,可以选择一个容器。
  • 部分:一个列表框,可以选择一个部分。

 

好吧,我有点作弊:在 Joomla 核心中并没有将时间选择器字段作为附加字段 (5)。我使用了来自 ACF 时间选择器字段 的免费版本,这是由 Tassos Marinos 开发的 高级自定义字段

我还为日程创建了一些 通用字段:您希望日程从什么时候开始,什么时候结束,以及您希望垂直时间轴的高度是多少(以每分钟像素高度计)。您可以将这些字段视为我们事件日程类别的一种参数。因此,这些附加字段是为了我们的 类别 而不是文章创建的。


 4 - 日程的模板覆盖

我们将为类别博客布局创建一个模板覆盖,以在选项卡中显示每个容器,以表格格式显示日程,部分水平排列,时间垂直排列。事件将按正确的时间顺序在每个部分下列出。

为此,我们需要使用模板中的 Administrator FieldModel 获取我们的列表字段“容器”和“部分”的已定义选项

$app = Factory::getApplication();
$mvcFactory = $app->bootComponent('com_fields')->getMVCFactory();
$fieldModel = $mvcFactory->createModel('Field', 'Administrator',
              ['ignore_request' => true]);

// Get the container options
$container = $fieldModel->getItem(5); 
$this->containerOptions=$container->fieldparams['options'];

// Get the section options
$section = $fieldModel->getItem(6);
$this->sectionOptions = $section->fieldparams['options'];

警告:查看此代码可能导致头痛或恶心!

好吧,摘下你的安全眼镜,深吸一口气。你不知道为什么这是糟糕的编码实践吗?幸运的是,你还对编码一无所知。

这种做法违反了基本的编程原则,因为它将数据检索和模板混合在一起。Joomla 的一个优点就是这两者的分离。我们通常在模型中处理所有数据,在视图中处理所有模板。就像将你的餐厅和洗手间分开一样。

因为我们无法覆盖核心模型,只能覆盖模板布局,所以有必要将模型责任混合到视图中。在第三集,我们将展示如何在我们构建自己的组件时做得更好。

在模板中添加附加字段时的另一个编码“罪过”是:附加字段的 ID 必须硬编码。如果您已经有了其他附加字段,那么您将不得不在您的 getItem() 方法中使用另一个数字作为 ID,而不是我们刚刚显示的 5 或 6。因此,您不能简单地复制此代码,而必须首先查找您的安装中那些字段的 ID。在您的模板中,您将获得以下附加字段的值:

<?php echo $this->item->jcfields[X]->value; ?>

其中 X 是我们附加字段的 ID。

技巧:不要在模板中散布所有这些硬编码的附加字段引用,而尽可能多的将它们放在(主要)模板的开始部分的变量中。然后,如果任何 ID 发生变化,您只需在一个地方更改即可。

对于类别的 schedule_start 附加字段,可能看起来像这样

$this->category->schedule_start = $this->category->jcfields[7]->value;

然后在模板(s)中,您可以引用 $this->category->schedule_start。

扩展我们的示例

我们将为事件日程添加 2 个功能

  • 多次使用事件:将定位事件的时间和地点的部分拆分到另一个称为“定位器”的实体。
  • 避免冗余的传记:当演讲者进行多次演讲时:创建一个名为“演员”的额外实体。

扩展示例的实体关系图将如下所示

定位器将作为事件-实体中的多个子表单实现,而演员则作为一个不同的类别,在文章中添加额外的字段。

分发配置

与创建组件相比,使用额外字段定制Joomla的一个缺点是您的定制无法像其他组件那样容易地分发。例如,您不能将其放在Joomla扩展目录(JED)上。与此相关,最近在Mattermost上有一个关于工具的问题“导出自定义字段并将其导入其他网站。不是数据,只是字段定义”

与Pieter-Jan de Vries讨论这个问题时,产生了制作一个组件的想法,该组件可以轻松导出和导入您的额外字段配置。这是一个概念验证,仍然有其局限性;它现在适用于干净的Joomla安装中的字段、字段组和类别,但(目前)还没有考虑自定义ACL和模板覆盖。话虽如此,我们很高兴向您介绍一个专门为这篇文章制作的组件: Hopper。欢迎使用它并将您的字段跳转到其他网站! Hopper不仅导出字段、字段组和类别,还将这些数据放入一个可安装的包中,并附带导入器。

“Hopper”这个名字是对Grace Hopper的致敬,她编写了第一个编译器,并倡导通过使用基于英语的计算机编程语言简化编程。

Grace Hopper, official portrait in US Navy uniform

她还提出了计算机中的“bug”一词:1947年,当她在美国哈佛大学工作并致力于Mark II计算机时,她的同事们发现了一只卡在继电器中的蛾子,这阻碍了计算机的操作。在取出这只昆虫后,它在当天的日志上贴上了“首次发现实际虫子”的标签。

在下次“比萨饼、虫子与乐趣”聚会上,您将有一个关于虫子的奇妙故事。关于比萨饼和乐趣的更多内容将在后续的一些章节中介绍。

下个月:其他可能性
不构建组件

在本期节目中,我们展示了构建我们的事件日程表的核心可能性。下个月我们仍然不会创建组件,但将探索使用内容构建工具包(Seblod)和应用构建器(Fabrik)来构建我们的日程表。

 


注意

  1. 有许多模板提供商和几个模板框架可用;请参阅5月2024年开始的系列,Emmanuel Lemor在Joomla社区杂志上关于模板的文章。组件、模块和插件可以在Joomla扩展目录(JED)中找到,目前提供约5500个扩展,涵盖电子商务、预订和预订、发票等多个主题的解决方案。
  2. 荷兰JoomlaDagen的活动日程表是用DP-calendar创建的。
  3. 绘图工具和创建此类图示的自定义Joomla组件是一个其他文章的主题。
  4. 例如,Peter van Westen的Article Field或Tassos Marinos的ACF Articles Field,或者创建自己的自定义额外字段。
  5. 标准日历字段可以用来输入日期和可选的时间,但不仅限于时间。如果您只想严格使用核心附加字段,可以使用简单的文本字段,并手动以hh:mm(两位数字的小时,一个冒号和两位数字的分钟)的格式输入时间。

资源

本文中使用的代码

本文系列中使用的代码可以在https://github.com/HermanPeeren/Joomla-Component-Tools找到。

关于第1集

  • 使用com_hopper导出事件时间表示例的包。
  • 我们示例的模板覆盖

要将附加字段配置转移到另一个网站,可以找到Hopper组件https://github.com/pjdevries/com_hopper。版本1.0.0可以从https://github.com/pjdevries/com_hopper/releases/tag/v1.0.0下载。

未来几集中我们将关注的工具

附加字段

由Marc Dechèvre撰写的Joomla社区杂志(JCM)系列

 

在Joomla社区杂志上发表的一些文章代表了作者对特定主题的个人观点或经验,可能不与Joomla项目的官方立场一致

1
 

评论 2

已注册? 在此登录
Brian Teeman 在 2024年7月19日 星期五 19:10
Hopper

OMG 很高兴看到 com_hopper,它是我的开发过程中的一个真正的缺失环节。迫不及待地想真正尝试一下

1
OMG 很高兴看到 com_hopper,它是我的开发过程中的一个真正的缺失环节。迫不及待地想真正尝试一下
Herman Peeren 在 2024年7月20日 星期六 17:08
Hopper 发布

com_hopper 的第一个版本(可安装的压缩包)可以在以下位置找到:https://github.com/pjdevries/com_hopper/releases/tag/v1.0.0

仅适用于 Joomla 5;有关在 Joomla 4 中使用的评论,请参阅 "Hopper" 下的 https://github.com/HermanPeeren/Joomla-Component-Tools/tree/main/Episode_1 中的 Read.me。

0
com_hopper 的第一个版本(可安装的压缩包)可以在以下位置找到:https://github.com/pjdevries/com_hopper/releases/tag/v1.0.0。仅适用于 Joomla 5;有关在 Joomla 4 中使用的评论,请参阅 "Hopper" 下的 https://github.com/HermanPeeren/Joomla-Component-Tools/tree/main/Episode_1 中的 Read.me。

接受后,您将访问由 https://magazine.joomla.net.cn/ 外部的第三方提供的服务