为网站构建者编写的插件开发入门
在所有可用的Joomla扩展类型中,插件是最容易实现的,但在定制您的Joomla!网站方面可能也是最强大的。Joomla!中内置了一些事件,这些事件会触发插件的执行,这实际上允许我们劫持标准的Joomla!代码或输出并插入我们自己的代码。
想象一下,您正在为客户构建一个网站,他们希望为客户举办网络研讨会。现在,这些网络研讨会的时间和日期将根据观众的时区而变化,所以理想情况下,我们希望向用户显示当地时间。
作为网站构建者,您的第一步可能是搜索JED以查找适合此目的的现有扩展,毫无疑问,可能已经存在一个,但如果我们现有的解决方案过于复杂,您只想做些简单的事情怎么办?或者,如果您正在尝试解决的问题没有可用的解决方案怎么办?
这是一个您可能考虑创建自己的内容插件的场景。这只需要几行代码,而且您不需要成为编程高手就能创建它。
您的第一步是创建一个名为plg_content_tzconvertor的文件夹,并在其中创建您的插件安装XML文件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>
插件组content告诉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》的函数,这是我们放置所有自定义代码的地方,这些代码完成了所有繁重的工作。首先,我们获取当前登录的用户详细信息,并查找他们设置的时区。
然后,我们搜索文章的文本,看是否有任何内容与我们的正则表达式模式匹配,该模式寻找 yyyy-mm-dd hh:mm 格式的日期时间。如果找到匹配项,我们将日期时间替换为考虑了用户时区偏好的调整版本。我们还显示时区名称,以便用户清楚地知道这个日期时间是哪个时区。
注意《JHtml:date》函数中的《true》标志,这表示使用用户的时区设置,而不是使用《false》值,后者将使用系统设置的时区。
现在,在您的《plg_content_tzconvertor》文件夹中,创建一个名为《index.html》的文件,当用户直接浏览文件夹时,它将向用户显示一个空白页面,而不是可能向恶意用户暴露有关您网站的信息。
<html><body bgcolor="#FFFFFF"></body></html>
现在您只需要将其压缩并安装到您的网站上。
当此插件启用时,对于登录用户,它将找到文章中的任何 yyyy-mm-dd hh:mm 格式的日期时间并调整为用户的本地时区。
请注意,文章中输入的日期和时间应使用 UTC 时区。
当用户设置了悉尼时区并登录时,他们将看到调整后的日期时间。
如您所见,我们实际上向标准 Joomla! 内容插件中添加了 17 行自定义代码,我认为每个网站构建者都能做到这一点。现在您已经看到插件可以有多简单,为什么不尝试在您的客户给您一个不同寻常的需求时试试看呢。
《Joomla 社区杂志》上发布的某些文章代表了作者在特定主题上的个人观点或经验,可能并不与 Joomla 项目官方立场一致。
通过接受,您将访问 https://magazine.joomla.net.cn/ 外部第三方提供的服务
评论