5分钟阅读时间 (994个单词)

插件开发简介

在所有适用于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 格式的日期和时间,并将其适应用户的时区。

image001

请注意,文章中显示的日期和时间必须以 UTC 时区表示。

当悉尼时区的用户登录时,他会看到显示其时区的日期和时间。

 image002

因此,正如您所看到的,我们实际上已经向 Joomla! 标准内容插件中添加了 17 行自定义代码,在我看来,任何网站创建者都能够做到这一点。现在您已经发现插件实现起来有多么简单,为什么不尝试在您的客户提出不同寻常的需求时使用它呢。

在 Joomla! 社区杂志上发表的一些文章代表作者对特定主题的个人观点或经验,可能不与 Joomla! 项目的官方立场一致。

0
Citius Altius Fortius
 

评论

已经注册?请在此登录
尚未发表评论。成为第一个发表评论的人

通过接受,您将访问由https://magazine.joomla.net.cn/之外的第三方提供的服务