类别项目计数:通向通用解决方案
上个月,我描述了如何开发一个新功能来计算每个类别的文章数量。在2015年JoomlaDay France的第二天结束时,该功能正在运行……也就是说,它计算了文章类别管理器(com_content)中的所有文章。我通过在类别管理器中添加硬编码的“if extension = com_content”检查来实现它。这不是一个解决方案,而是一个权宜之计,我完全清楚这一点。
当我从JoomlaDay France回家时,我不知道如何使其通用,以便所有核心组件(甚至第三方组件)都能使用com_categories显示其自己的项目计数器。
Thomas Hunziker和Robert Deutz给我提供了一些建议,使其更加通用。我尝试使用一个特定的助手文件。该文件包含了一些代码,用于扩展查询对象,添加一些额外的连接。com_categories组件将查找它并将其添加到自己的SQL查询中。它成功了!
然而,为什么创建一个额外的助手文件,而每个使用Joomla类别管理器的组件已经有了助手文件呢?Roland Dalmulder帮助我访问现有的助手文件。所以我能够将额外的查询代码移动到那个现有的文件中。这使得功能通用:现在类别计数项目功能已成为一个通用功能,您可以在自己的组件中使用它……我将在本文的后面向您展示。首先,为了使用它,新功能必须经过测试,并添加到Joomla核心中。
改进Joomla核心
那么,如果你发现Joomla中的一个错误(或隐藏的功能)怎么办?或者,如果你想要进行改进呢?
报告错误
报告错误不需要编写代码。只需访问issues.joomla.org,登录(或注册)并创建一个新问题。在这样做之前,请搜索问题跟踪器,看看它是否已经被知道。另一个有用的步骤是安装Joomla的最新版本(在GitHub上的“staging”版本)以查看它是否已在下一个版本中解决...
如果尚未知道或在下一个版本中仍然存在,请创建一个新问题。提供所有必要的详细信息,并描述重现错误的步骤。而且因为一张图片胜过千言万语,请制作一些屏幕截图以可视化问题。
如果其他用户能够重现错误,一些开发者可能会深入研究问题并为它创建一个补丁。
创建补丁
为了修复问题或添加新功能,开发者将创建一些将被放入补丁中的代码。补丁用代码描述了与最新Joomla版本的差异。代码和补丁使用git(=软件版本控制)管理,并在GitHub(=代码的维基百科)上提供。
开发者将在他们自己的Joomla CMS副本中进行更改。所有更改都会被记录,并且可以通过拉取请求(PR)提交给原始Joomla CMS。换句话说,开发者请求Joomla将他们的更改代码拉入Joomla核心。
在Joomla项目考虑将此类PR纳入Joomla核心代码之前,需要由除开发者以外的其他人进行测试。您的PR至少需要2次成功的测试才能被标记为RTC(Ready To Commit),这意味着它已准备好添加到Joomla核心代码中。
测试补丁
任何人只要知道如何使用Joomla就可以测试补丁。是的,您没有听错,您也可以帮助进行测试。您所需的一切是…
- 一些空闲时间
- 默认Joomla安装(请使用来自https://github.com/joomla/joomla-cms的最新测试“staging”版本),使用“测试英语(GB)示例数据”安装它,不要像正常网站那样删除/installation/文件夹)
- 安装“补丁测试组件”(com_patchtester,请参阅https://docs.joomla.org/Component_Patchtester_for_Testers)
- 需要测试的补丁(请参阅http://issues.joomla.org/),
测试您是否可以重现问题,安装补丁并测试它是否解决问题,然后报告。
完整说明:https://docs.joomla.org/Testing_Joomla!_patches & 快速参考指南:https://docs.joomla.org/Testing_Joomla!_patches_QuickReferenceGuide
为了使事情变得更容易,甚至更有趣,Joomla社区经常组织特别的“bug patch testing events”。这些活动被称为“Joomla Pizza, Bugs and Fun”:一群人帮助新用户测试补丁。好处是:您将了解有关开源软件开发过程的一些知识,体验测试补丁的乐趣,了解Joomla的新功能,并分享您对Joomla和开源的热情。坏处:它可能会上瘾 :-)
返回类别项目计数
许多人帮助我处理了这个PR!我已经提到了一些帮助我的人。一些特别的人(您知道是谁!如果不是:Tobias Zulauf,Thomas Hunziker,Marc Dechèvre和Peter Lose。谢谢!)给我提供了关于他们发现的错误的大量宝贵反馈。我设法解决了这些问题。
最后,Hans Kuijpers、Marc Dechèvre 和 Stefan Wendhausen 成功地对我的PR进行了测试,这使我获得了进入RTC所需的两个积极测试。
在整个测试和反馈过程中,一些标签被分配给了PR(您可以在#6916的顶部左侧看到它们)
- 语言更改 - 语言字符串已发生变化。翻译团队需要知道,为了将新/更改的字符串翻译到所有不同Joomla语言的语言文件中(有关所有语言包的概述,请参阅https://community.joomla.net.cn/translations/joomla-3-translations.html)
- 新功能 - PR不是错误修复,而是一个新功能。错误修复包含在每个(次要)更新中(例如3.4.2、3.4.3等)。新功能仅会在主要版本中添加(例如3.5.0、3.6.0等)
- PR预发布 - PR已添加到当前的预发布版本中。
- RTC - 准备提交
- 因为它是一个新功能,所以被标记为里程碑Joomla! 3.5.0,这意味着它绝对不会添加到下一个次要版本3.4.2中,但可能会添加到下一个Joomla版本中。
哎呀 - 我们有一个小问题……
我决定将这个新功能添加到一些也使用com_categories的核心组件中:横幅(PR #6934)、联系人(PR #6938)和新闻源(PR #6936)。这些PR都遵循了相同的程序:进行了测试并标记为RTC和里程碑Joomla! 3.5.0。然而,其中之一出现了一些问题:横幅。
由于新功能,类别管理器(com_categories)将在下面创建一些带有超链接的数字计数器。所有这些超链接都具有状态过滤器&filter[published]=,您可以点击它们来过滤状态的项目。所有组件都监听“选择状态”过滤器&filter[published]=(并期望状态码为0、1、2和-2)。除了横幅组件外,它监听&filter[state]=
在横幅模型及其filter_banners.xml中进行少量更改后,横幅组件以与其他所有核心组件类似的方式过滤其项目。因此,类别项目计数现在也适用于横幅项目……
如何在您的组件中使用它?
让我们希望这个新功能将包含在Joomla 3.5.0中。如果是这样,那么您应该能够在自己的组件中使用这个功能!要将此新功能包含到自己的扩展中,您只需编辑一个文件:辅助文件
如果您的组件使用Joomla的类别管理器(com_categories)来管理类别,那么您可能已经在组件的管理员文件夹中有一个辅助文件。当您通过/administrator/index.php?option=com_categories & extension=com_yourcomponent从组件打开类别管理器时,类别管理器将检索组件的辅助文件。然后,它将使用addSubmenu方法创建一个子菜单,其中包含指向您的扩展的链接。这使得从类别管理器返回到您的组件变得容易。
我们将为此辅助文件添加一个新功能,以扩展类别管理器的$query对象中的SQL查询。这些SQL查询计算每个类别的项目数量,以及四种不同的状态:已发布、未发布、存档和已删除。
将以下内容添加到辅助文件/administrator/components/com_yourcomponent/helpers/yourcomponent.php中,在以下
class YourcomponentHelper extends JHelperContent
方法中
public static function countItems(&$query)
{
// 将文章与类别连接并计算已发布的项目
$query->select('COUNT(DISTINCT cp.id) AS count_published');
$query->join('LEFT', '#__yourcomponent_items AS cp ON cp.catid = a.id AND cp.state = 1');
// 统计未发布的项目
$query->select('COUNT(DISTINCT cu.id) AS count_unpublished');
$query->join('LEFT', '#__yourcomponent_items AS cu ON cu.catid = a.id AND cu.state = 0');
// 统计存档项目
$query->select('COUNT(DISTINCT ca.id) AS count_archived');
$query->join('LEFT', '#__yourcomponent_items AS ca ON ca.catid = a.id AND ca.state = 2');
// 统计已删除的项目
$query->select('COUNT(DISTINCT ct.id) AS count_trashed');
$query->join('LEFT', '#__yourcomponent_items AS ct ON ct.catid = a.id AND ct.state = -2');
return $query;
}
如果你不使用“state”来表示项目的状态,而是使用“published”,那么你需要相应地修改SQL。如果你的组件没有“存档”项目,则可以不在函数中包含它。类别管理器将自动显示count_published、count_unpublished、count_archived和count_trashed的列。
结论
目前尚不清楚类别项目计数是否会集成到Joomla核心中。如果确实如此,它可能会在未来的Joomla 3.5中集成。如果集成到核心中,你可以用它为自己的组件(使用Joomla类别管理器进行其类别)。
希望我已经向您展示了功能如何集成到Joomla核心中,以及您如何帮助改进Joomla核心代码(即使您不知道如何编码)。
如果您想了解更多关于开发PR、测试补丁和Joomla开发过程的信息,请访问Pizza Bugs and Fun活动。
最后,再次感谢所有帮助我开发这个功能的每一个人!
结束...
(bug、补丁和测试dummy图像来自https://commons.wikimedia.org)
在Joomla社区杂志上发表的一些文章代表了作者在特定主题上的个人观点或经验,可能不符合Joomla项目的官方立场。
通过接受,您将访问https://magazine.joomla.net.cn/外部第三方提供的服务
评论