关于Joomla 3.0扩展开发的系列[文章]:开始开发
为了得到这个关于Joomla 3.0组件开发的系列教程的某个好的工作样本,我决定从头开始写一个扩展。这个组件将在配套的网站上供查看和下载,我将在本教程和未来的教程中引用这个网站。我的目标是写一个相当完善的组件,超出简单的“你好,世界!”组件,并完全展示组件开发的关键点。
- 作者:大卫·休利(David Hurley) 1
- 译者:亚历山大·斯米诺夫
零步:准备咖啡
同样,您需要正确开始您的一天和项目。培养一种习惯,某种节奏,当您再次坐下工作时,您会发现您的创造力、专注力和编码能力都准备好了。当您开始工作时,不要忽视保持正确的精神状态的重要性。
第一步:为需要的文件编写组件的初始计划
首先需要做的是创建一个关于这些文件、文件夹、数据库表以及相关字段的粗略概述。对于我们的组件,我们将创建以下系统。
组件详细数据
名称: Lendr
组件名称: com_lendr
描述: Lendr是一个基于Bootstrap 3.0的组件,允许用户创建个人资料,添加自己的书籍到个人图书馆,查看其他用户的图书馆,申请借阅书籍,添加到愿望清单,并注册等待借阅某些特定书籍。
初始功能
这个新的Lendr组件将提供以下功能
- 用户账户/初始个人资料
- 书籍/用户的图书馆
- 愿望清单
- 借阅书籍
- 申请借阅书籍
- 已借出书籍的等待列表
现在我们必须记录我们需要的初始文件结构。这个列表不会是完整的,并且在随着我们通过这个过程的进展很可能会被修改。但是,拥有一个初步的计划可以帮助我们保持秩序。以下是Lendr所需关键文件的初始结构。
初始文件
控制器 | 模型 | 视图 | 表格 | 其他 |
保存 | ||||
列表 | 书籍 | |||
添加 | 默认 | 书籍 | ||
编辑 | 图书馆 | 心愿单 | 书籍 | |
借阅 | 个人资料 | 图书馆 | 心愿单 | 安装 |
删除 | 评论 | 个人资料 | 图书馆 | 路由器 |
心愿 | 等待列表 | 等待列表 | 等待列表 | XML |
评论 | 心愿单 | 评论 | 评论 | |
请求 | ||||
默认 |
现在,既然我们已经记录了这一切并创建了一个大致的计划,我们就开始在我们的文件夹结构中创建这些文件。
第二步:编写数据表文件
我们从创建数据库表文件开始。我们将它们存储在我们的组件前端部分的"tables"文件夹中。为了刷新您的记忆,了解您本地[开发]环境应该如何配置,请参阅我们这个系列的第一篇文章。我们创建初始计划中描述的每个文件。下面是其中一个文件
/joomla_root/components/com_lendr/site/tables/book.php
在我们的例子中,这个表文件只包含一个函数"construct"。这个函数提供了一个与这个"JTable"文件相关的特定表名,并在该文件中定义了主键字段,即书籍的ID号"book_id"。
在创建这些数据库表的过程中,我们应该开始创建install.mysql.sql脚本,它将在Joomla管理面板中安装此组件时使用。下面是这个文件的开始
/joomla_root/administrator/components/com_lendr/admin/install.mysql.sql
在创建我们的表的过程中,我们将继续添加到这个文件。在我们创建表的同时添加这些表将简化此组件的编译和安装过程。
第三步:创建组件文件夹和文件
在创建这些数据库表之后,我们为整个组件配置文件结构。以下是初始文件夹结构。
com_lendr/
admin/
controllers/
models/
views/
index.html
install.mysql.sql
lendr.php
site/
assets/
controllers/
helpers/
language/
models/
tables/
views/
index.html
lendr.php
router.php
install.php
lendr.xml
这些文件和文件夹中的每一个都很重要,尽管不是所有的都是必需的。我们将开始处理这些文件和它们包含的功能。在过程中,我们将解释每个的功能。
第四步:编写安装文件、根文件、控制器和视图控制器
在这一步,我们将向几个文件中添加一些内容。首先,我们将查看这些安装文件,然后我们将处理一些控制器,最后我们将添加我们的视图控制器。
安装文件
这些根级别文件是在安装此组件的过程中由Joomla使用的文件。在您的组件文件夹中,它们位于"site"和"admin"文件夹之外。存在一个XML文件,它用于定义组件数据和所有相关文件、菜单和语言;还有一个install.php文件。这个install.php文件包含一些在安装组件时执行的功能。这个名称并不是特定的,但它应该正确包含在XML文件中。不需要调用这些函数,甚至它们的存在也不一定是必需的,但它们可以在安装组件时执行额外操作。
示例文件
2 这个代码块定义了组件的信息。这个信息显示在您的Joomla扩展管理器中,并存储在该扩展的表中。
2 这个代码块告诉Joomla系统此组件的SQL文件的位置。它由Joomla系统在安装组件的过程中处理,以创建所需的数据库表。注意,您可以在此处指定您使用的字符编码和数据库驱动程序类型。
您也可以[在此处]添加具有相似结构的卸载块,以定义在卸载过程中将执行的某个SQL文件。
2 此块定义了将在Joomla!网站的首页组件文件夹/components/中安装的目录。无需列出所有文件,只需列出目录和任何根级文件。
2 这是一个脚本文件,用于定义在安装过程中执行的功能集合。在我们的例子中,我们将其命名为install.php。
2 此语言部分定义了必要的语言文件。它们将被安装在Joomla!网站根目录的语言文件夹中,并带有适当的语言标签。这里我们有两个语言文件,其中一个是这个组件的系统语言文件。此语言文件在安装过程中使用,并且[同样]在任何组件外部(例如,在扩展管理器中)显示有关此组件的信息时使用。
2 下一个块定义了管理部分的数据,包括管理菜单和组件管理分区文件。对于菜单项,可以引用图像。图像路径属于组件的管理部分。
请注意,子菜单可以定义,但不是必须的。
2 在管理员标签内部,除了定义安装到管理部分的文件和文件夹外,还定义了安装的语言文件。在我们的例子中,我们在这些元素中添加了目录标签"admin",以便告诉Joomla!系统应引用安装包中的哪个文件夹。名称可以是任意的,由您选择。此(第二个)系统语言文件将在下一文件及其描述中[更详细]解释。
install.php
2 在此第一个代码块中,我们定义了安装类和辅助[类],我们希望导入以帮助此文件中的安装功能。
2 "install"函数在安装完成后执行,通常可以包含成功的安装消息。文本应使用在文件XX-XX.com_lendr.sys.ini中定义的管理语言字符串。
2 "update"函数在安装方法定义为"update"时执行。这可能是一个执行与现有表SQL列相关的一些函数的好地方。
2 "pre-flight"和"post-flight"函数的名称不言而喻。在这里,您可以定义您希望在安装开始前或完成后执行的特定函数。如果您想为组件的不同版本提供另一组文件,则可以在"pre-flight"函数中指定那些文件的更新路径。它可以用于执行针对组件数据的唯一SQL代码(而不是组件表结构本身的结构)。
根文件(lendr.php)
位于我们网站根目录的lendr.php文件是[系统]Joomla首先识别和读取的文件。此文件管理将任务转发到其他控制器,加载"helper"文件、样式、JavaScript、插件库和其他组件所需的主要部分。它将在本系列课程的后续课程中扩展。
此文件将加载与此组件相关的表;导入组"lendr"中的任何现有插件;定义请求特定用户的特定控制器,然后根据此请求执行适当的控制器。
控制器
在Joomla 3组件中,控制器以具有特定功能的类形式创建。通常,控制器的名称决定了该控制器的任务。这与以前的Joomla版本不同,以前的版本中,某个控制器被分配给与组件的某个特定部分相关的各种任务。具有单个执行功能的控制器创建提供了将控制器结合在一起形成易于跟踪的路径、操作和错误的更好的机会。下面是一个为Lendr定义的具体控制器示例,接下来是用于某些初始功能的默认控制器。
示例文件
edit.php
default.php
这类控制器
Joomla的视图工作方式有些独特。Joomla使用某些次要控制器来帮助处理数据的执行方面和分配给视图的变量。这个次要控制器位于组件的“views”文件夹中,通常称为类似于期望执行类型的名称(例如,html.php用于执行HTML,phtml.php用于执行模板的一部分,raw.php用于执行未处理的数据等)。下面是[我们的组件] Lendr使用的一个视图控制器。
示例文件
html.php
2 此视图控制器根据书籍的ID号获取特定书籍的数据。模型中的getBook()函数将在下一步定义。请注意,在布局中使用的变量直接在当前对象中分配。视图控制器可能包含非常少的逻辑或非常多的逻辑,具体取决于情况。这个特定的(在这方面)是最小的。
raw.php
此视图控制器根据书籍的ID号获取特定书籍的“原始”(未处理)数据。
第五步:创建模型
Joomla模型与大多数MVC架构的系统一样工作,管理大部分数据处理和提取。Lendr组件的模型将在下一课中详细讨论,所以在这里我们只看看它们的总体结构。
示例文件
book.php
2 同样,为了简单起见,在本课中我们省略了每个函数的详细信息,将在下一课中讨论。重要的是要注意,在这种情况下,我们再次使用了我们自己的“default”类。这样,我们可以向单个模型添加常用的通用功能,并在每个模型中使用它们。
default.php
2 在我们的默认控制器中,我们做了两件事。首先,我们提供了一个特定于“默认”操作的控制器,这通常是在没有定义其他操作时启动的操作。在这种情况下,Joomla!仍然执行一个单独的任务对一个控制器的相关方法。此默认控制器将接受一个特定的视图,找到相应的视图文件,加载相应的模型,并获取该视图。Joomla 3要求在每次加载视图文件时加载某个模型,并且通过在视图和模型之间执行必要的命名,我们可以将它们关联起来并分配它们,而无需任何额外代码。如果由于某种原因某个模型不存在,则加载默认模型。
值得关注的是SplPriorityQueue是什么样的。在PHP中,它是一个数组,是特殊“堆”的应用,它根据优先级对特定数据进行排序。
Joomla模型仅是创建Lendr组件系统所需的所有文件中的两个[文件]。其他模型在性质和结构上类似,但将在下一课中详细介绍。
总结开发初期
现在,由于我们已创建了该组件的初始结构,编写了数据库表、安装文件、控制器、视图控制器和模型,我们的组件应准备好安装。当然,尽管[这个组件]还没有[功能]并且只创建了一个空壳,但创建可安装的组件确实提供了一种满足感。请确保您已研究了我们的GitHub存储库并查看其他尚未在此处编写的数据库表、控制器、视图控制器和模型。
通过以下链接查看包含代码的完整课程http://lendr.websparkinc.com.
在下一课中,我们将深入了解不同模型中编写的功能。
本文是David Hurley(David Hurley)关于Joomla组件开发的五课系列中的第二课。错过了第一课“设置场景”?请通过以下链接了解它https://magazine.joomla.net.cn/international-stories-all/articles-in-russian-all/joomla-30-extension-development-series-setting-the-stage-ru
1 本文作者David Hurley(David Hurley)的原始英文文本:https://magazine.joomla.net.cn/issues/issue-feb-2013/item/1062-joomla-30-extension-development-series-beginning-development
2 本文作者在“Joomla社区杂志”上发表的原始文章中缺少此文本,但可在作者的网站上找到此课程文本。
在Joomla社区杂志上发表的一些文章代表了作者在特定主题上的个人观点或经验,可能不符合Joomla项目的官方立场
通过接受,您将访问https://magazine.joomla.net.cn/外部第三方提供的服务
评论