插件开发简介
在所有适用于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> https://gnu.ac.cn/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/之外的第三方提供的服务
评论