插件开发简介
在所有适用于Joomla!的扩展类型中,插件是最容易实施的,但也可以是用于定制您的Joomla!网站的强大扩展。Joomla!中已经存在一些事件,允许触发插件执行,这使我们能够通过在其中插入自己的代码来补充Joomla!的本地代码。
想象一下,您为一位客户构建了一个网站,该客户希望为其客户实施一个网络研讨会(在线研讨会)。当然,这些网络研讨会的日期和时间将根据用户的时区而变化,因此理想情况下,我们希望向用户显示其本地日期和时间。
作为网站创建者,您的第一步可能是搜索JED中的一个扩展来满足这一目标,而且肯定至少有一个扩展可以满足这一目标,但如果我们想要的解决方案“过于强大”,而我们需要的是简单的解决方案怎么办?或者,如果我们试图解决的问题没有现成的扩展怎么办?
在这种情况下,您可能需要考虑创建自己的内容插件。这可以用几行简单的代码来完成,您不需要成为编程高手就能创建它。
您的第一步是创建一个名为plg_content_tzconvertor的文件夹,并在该文件夹中创建您的插件安装文件tzconvertor.xml。此文件向Joomla!说明了您的插件所需的所有信息:包含的文件、插件类型和作者。
如果您打算与社区分享此插件,我建议您先在JED上检查您选择的名称是否已被使用。
<?xml version="1.0" encoding="UTF-8"?> <extension version="3.0" type="plugin" method="upgrade" group="content"> <name>Content – Timezone Convertor</name> <author>Tim Plummer</author> <creationdate>April 2014</creationdate> <copyright>Copyright (C) 2014 Your Company. All rights reserved.</copyright> <license> http://www.gnu.org/licenses/gpl-3.0.html</license> <authoremail>This email address is being protected from spambots. You need JavaScript enabled to view it. </authoremail> <authorurl>http://www.yourcompany.com</authorurl> <version>1.0.0</version> <description>This plugin will replace date and time with the local equivalent based on user’s timezone. Don't forget to publish this plugin!</description> <files> <filename plugin="tzconvertor">tzconvertor.php</filename> <filename>index.html</filename> </files> </extension>
插件的“内容组”告诉Joomla!插件类型,并确定我们可以使用哪些事件触发器。
现在,我们必须创建我们的插件PHP文件。在您的plg_content_tzconvertor文件夹中创建一个名为tzconvertor.php的文件。
<?php defined('_JEXEC') or die; jimport('joomla.plugin.plugin'); class plgContentTzconvertor extends JPlugin { function plgContentTzconvertor( &$subject, $params ) { parent::__construct( $subject, $params ); } public function onContentPrepare($context, &$row, &$params, $page = 0) { // Do not run this plugin when the content is being indexed if ($context == 'com_finder.indexer') { return true; } if (is_object($row)) { return $this->Tzconvertor($row->text, $params); } return $this-> Tzconvertor ($row, $params); } protected function Tzconvertor (&$text, &$params) { $user = JFactory::getUser(); $timeZone = $user->getParam('timezone'); // matches date and time in format yyyy-mm-dd hh:mm $pattern = '/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})/'; $found = preg_match_all($pattern, $text, $matches); if ( $found ) { foreach ( $matches[0] as $value ) { $replacement=JHtml::date(strtotime($value) , 'Y-m-d g:i a', true); if($timeZone) { $replacement .= ' ('.$timeZone.')'; } $text = preg_replace($pattern, $replacement, $text); } } return true; } }
《onContentPrepare》是我们针对此插件的目标事件,它在我们在网站上显示文章内容时执行。它调用 Tzconvertor 函数,这是我们集成所有自定义代码并完成大部分工作的地方。首先,我们获取当前登录用户的详细信息,并查看他的时区。
然后我们在文章文本中查找,看是否有元素与我们的正则表达式模式匹配,该模式搜索 yyy-mm-dd hh:mm 格式的日期和时间。如果我们找到匹配项,我们将日期和时间替换为适应用户时区的版本。我们还显示时区名称,以便让用户明白这个时区对应的是哪个日期和时间。
请注意,JHtml:date 函数中的 true 标志允许我们指示使用用户配置的时区,而不是使用系统时区的“false”值。
现在,在您的 plg_content_tzconvertor 目录中创建一个 index.html 文件,它将为用户显示一个空页面,以防他们尝试直接从浏览器中访问此目录,而不是显示可能被恶意用户利用的您的网站信息。
<html><body bgcolor="#FFFFFF"></body></html>
现在您只需将您的文件夹压缩并安装到您的网站上。
当此插件激活并且对于已登录的用户时,它会搜索文章中的所有 yyy-mm-dd hh:mm 格式的日期和时间,并将其适应用户的时区。
请注意,文章中显示的日期和时间必须以 UTC 时区表示。
当悉尼时区的用户登录时,他会看到显示其时区的日期和时间。
因此,正如您所看到的,我们实际上已经向 Joomla! 标准内容插件中添加了 17 行自定义代码,在我看来,任何网站创建者都能够做到这一点。现在您已经发现插件实现起来有多么简单,为什么不尝试在您的客户提出不同寻常的需求时使用它呢。
在 Joomla! 社区杂志上发表的一些文章代表作者对特定主题的个人观点或经验,可能不与 Joomla! 项目的官方立场一致。
通过接受,您将访问由https://magazine.joomla.net.cn/之外的第三方提供的服务
评论