Joomla Google Summer of Code 2019

此博客突出展示了构建我的 GSoC 项目的下三个任务的开发过程。

这些包括

  1. 改善文章中模块的整合
  2. 在模块组件中集成工作流
  3. 将精选模型合并到文章中

改善文章中模块的整合

PR 链接:https://github.com/joomla/joomla-cms/pull/34764

此任务有两个部分

  1. 在文章编辑视图中创建模块
  2. 导入模块标签

在文章编辑视图中创建模块

用户可以在 Joomla 的文章中添加模块。这是通过模块 xtd-editor 插件实现的。然而,这个插件打开一个模态框,只允许用户选择一个预先存在的模块。没有直接在文章编辑视图中添加新模块的选项。为了增强这一点,这个 PR 在文章编辑视图中引入了一个直接创建模块的按钮。

您可以在这里查看上述功能的视频演示:https://youtu.be/68JgXZcuPJI

这是通过使用一个 cookie 实现的,该 cookie 可以被 PHP(用于在不保存的模块中不显示工具栏中的保存和关闭按钮)和 JavaScript(用于在关闭模态框时清除此标志)读取和修改。隐藏保存和关闭按钮在这里是必要的,因为我们需要确保在关闭模态框之前模块已保存(在我们的数据库中),以便我们可以获取模块的 ID。

这个任务是通过重用现有的控制器函数实现的,修改它们以支持向后兼容性。

导入模块标签

这个标签允许我们使用按钮对导入的模块执行编辑和删除操作。它显示通过任何三种可能的语法(支持较旧的导入语法以实现向后兼容性)导入的模块。

  1. {loadmodules :mod_type}

这些匹配使用正则表达式进行,我们找到与上述任一配置匹配的表达式。使用匹配的索引,我们过滤 id / mod_type 或位置,并在进一步的查询中使用它来从数据库中获取关于这些模块的更多信息。

然后以表格的形式显示这些附加信息,用户可以通过编辑和删除按钮与这些模块进行交互。

Picture1

在模块组件中集成工作流

PR 链接:https://github.com/joomla/joomla-cms/pull/35101

这是一个在主要项目描述中未提及的附加功能增强。到目前为止,工作流仅在 `com_content` 中使用,即文章组件。在这个任务中,我们将探讨如何将其集成到其他组件中。为了这个任务,我们选择了 `com_modules`,即模块作为我们的组件。

访问

已添加相应的 access.xml 动作。

文章模型

getListQuery() 方法将旧查询与 workflow_associations 连接,也考虑属于 com_content.articles 的工作流阶段。

SQL 更改

  • 以下已添加到数据库表中
    • 1 个新的工作流:`COM_WORKFLOW_BASIC_WORKFLOW_MODULES`
    • 1 个新的阶段:`COM_WORKFLOW_BASIC_STAGE`
    • 3 个新的转换
  • 发布
  • 取消发布
  • 垃圾箱
    • 通过更新脚本/安装期间的查询为所有现有模块创建了工作流关联。

引入新的后端菜单项

在侧边栏中为模块添加一个新的菜单页面项:工作流,用于对 com_modules 执行 CRUD 操作

启用工作流集成的选项

这可以在全局配置中切换。它控制是否启用工作流

Searchtools 过滤

添加了一个新的选项,通过工作流阶段过滤模块。

ModulesComponent.php

添加了由工作流插件(工作流、特色和发布)使用所需的函数。

模块模型

  • 查询现在考虑每个模块关联的工作流阶段。
  • 添加了保存之前和之后的工作流事件
  • 添加了一个函数,用于获取模块的初始阶段(默认工作流和默认阶段)
  • 添加了一个查询,在复制模块时创建工作流关联
  • 添加了一个准备工作流字段的函数

模块模型

该项目添加了一个 filterForm 函数,基于工作流阶段进行过滤。这个查询还连接了模块表和工作流关联。

工作流关联包括一个将特定扩展下的每个元素与其活动工作流阶段关联的表。这个表允许我们轻松找到模块及其工作流阶段之间的关系。

模块模板

  • 在表格中添加了工作流列
  • 当启用工作流时,此列才会条件性地渲染
  • 默认批处理正文添加了工作流字段

流程

创建新模块时,必须选择一个工作流,保存时,此 workflow_id 下的默认阶段设置为模块的初始阶段。编辑现有模块时,显示工作流转换字段而不是 workflow_id 字段,其工作方式类似于 com_content。

新模块:选择工作流

类似于 com_content 的工作流分配,我们将其链接到类别以初始化其工作流。我们可以在创建时选择与之关联的工作流。

Picture2

编辑现有模块:转换字段

此字段仅显示已创建的模块。在这里,我们不是选择关联的工作流,而是执行转换。

Picture3

将特色文章合并到文章中

PR 链接:https://github.com/joomla/joomla-cms/pull/35228

本次任务的主要目标是重构代码,以提高代码的可重用性并消除冗余。通过合并用于特色文章和所有文章的模型(Model)、视图(View)、控制器(Controller)和模板(Template)的不同文件,消除了冗余,形成了一个通用的MVC。

[A] 新的选择器下拉菜单

添加了一个searchtools选择器,可以用来在以下选项之间切换

选项  值 
 全部  """
 非特色  0
 特色  1

 

Picture4

[B] 模型合并

使用getUserState从请求中返回特色选择器筛选参数的新方法

$featured = $this->getUserStateFromRequest($this->context . '.featured', 'featured', '');

上述方法的优势在于,我们还可以将值作为GET参数传递到URL,这有助于我们生成可以初始化下拉框值的重定向URL

$featured变量用作条件来调整查询以适应特色

[C] 模板合并

我们使用state->get('featured')来根据是否为特色有条件地渲染模板代码。

[D] 视图合并

我们使用state->get('featured')来有条件地渲染工具栏选项。

[E] 控制器合并

从FeaturedController合并删除功能

模块位置徽章

这是一个额外任务。这里的目的是视觉上指示不属于任何活动模板样式的位置。这可以帮助用户了解是否有任何有效但未激活的位置。

getValidPositions()

添加了一个新的模型方法getValidPositions,它执行以下操作

1. 从数据库中获取活动模板(1个查询)

Picture5

2. 获取与步骤1的结果对应的templateDetails.xml文件

3. 将这些位置存储在数组中并返回

  1. 将这些位置存储在数组中并返回

上述模型方法返回的数组将在......

  1. 将getValidPositions方法的 结果存储在数组中
  2. 从数据库中获取所有模块进行渲染后,检查每个模块行的位置是否存在于步骤1的数组中。如果是,将$row->activePosition设置为true。如果不是,将$row->activePosition设置为false

最后,在tmpl文件中,我们使用activePosition标志来有条件地在bg-primary和bg-secondary之间选择。非活动(不属于活动模板)位置的徽章有一个bg-secondary类。

Picture6

导师

我的导师们是我旅程中不可或缺的一部分。正是他们不断的指导帮助我成功地完成了所有的任务并提交了健壮的代码。谢谢

  1. Christiane Maier-Stadtherr
  2. Niels Braczek
  3. Benjamin Trenkle
  4. Achilleas Papageorgiou
  5. Luca Marzo

特别感谢Richard Fath以及我的Joomla GSoC学生开发者同伴:Kumar Shivam、Rishabh Ranjan Jha、Rahul Saini和Eyvaz Ahmadzada。

未来路线图

尽管所有任务的第一轮已经完成并处于功能阶段,但总还有改进的空间。我计划继续参与Joomla。我将定期提交提交,以便进行更多的审查和建议。我还计划以其他可能的方式扩展我的参与,包括为主仓库做出贡献、修复错误、审查PR并帮助新贡献者通过代码库学习。