上一节已经成功的安装了插件,在这一节,我们将介绍如何写代码来实现业务逻辑。
实现思路
我们插件的目标是实现关键词替换功能。管理员在后台的插件控制页面输入搜索的关键词和需要替换的关键词,然后程序代码在整个页面中进行搜索替换。实现这个功能,要解决两个问题,第一个问题是何时执行我们的代码?第二个问题如何才能拿到页面的所有内容?
何时执行我们的代码?
joomla是一个单一入口的程序,就是说所有的页面输出都是来自同一个入口,这就保证了插件可以替换每一个页面匹配的关键词。我们的代码执行的最佳时间点应该是系统将页面已经生成了,但是还没有发送给浏览器的这个时刻。而Joomla系统核心刚刚好有一个onAfterRender事件,这个事件会在页面渲染完成之后通知插件是否要进行处理。完美的满足了我们的要求。
如何才能拿到页面的内容?
由于onAfterRender事件并没有携带参数,因此,我们需要自己通过API来获得当前页面的内容。joomla对于页面操作提供了相当丰富的API函数,我们可以轻松的获得内容。
至此,我们大概能够勾勒出一个实现过程了:插件响应onAfterRender事件钩子,在这个事件中获得页面的内容,进行搜索替换。
增加配置参数
首先为了给后台的管理界面增加关键词的配置参数,我们修改了zreplace.xml这个文件,在之前的fieldset节点下面增加了两个field节点。代码如下:
<?xml version="1.0" encoding="utf-8"?> <extension version="4.0" type="plugin" group="system" method="upgrade"> <name>ZMAX关键词替换插件</name> <author>ZMAX程序人</author> <creationDate>2022-09-29</creationDate> <copyright>(C)南宁市程序人软件科技有限责任公司 2014 - 2022 . All rights reserved.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorUrl>www.zmax99.com</authorUrl> <version>0.0.2</version> <description>提供网页关键词替换</description> <files> <filename plugin="zreplace">zreplace.php</filename> </files> <config> <fields name="params"> <fieldset name="basic"> <field name="key" label="关键词" hint="请输入关键词" description="需要搜索匹配的关键词" /> <field name="value" label="替换成" hint="请输入替换成,为空表示删除" description="需要替换成新的词。如果是删除,保留为空" /> </fieldset> </fields> </config> </extension>
做完了这些,如果你此时重新打包并且安装插件(也可以直接修改安装好的插件的xml文件),就会看到管理界面出现的配置选项了,插件的所有的配置参数存储为json格式,由系统自动维护。在上面我们使用了text这种字段类型,以方便管理员设置录入关键词和需要替换的词。更多关于表单字段field的用法,大家可以参考本站的Joomla开发手册中的表单字段章节,在这里就不做展开了。后台截图如下:
响应onAfterRender事件
响应某一个事件的方法也很简单,就是在你插件的类中实现一个和事件相同的方法函数。在本例中将响应onAfterRender事件。修改了zreplace.php文件,代码如下:
<?php defined( '_JEXEC' ) or die; use Joomla\CMS\Plugin\CMSPlugin; use Joomla\Event\Event; class plgSystemZreplace extends CMSPlugin { //当渲染完成后回调的钩子 public function onAfterRender() { //STEP 1:检查是否设置了需要替换的关键词 $key = $this->params->get("key"); $value = $this->params->get("value"); if(empty($key)) //没有设置参数 { return ; } //STEP 2:获得整个页面的内容 $app = \JFactory::getApplication(); $content = $app->getBody(); //STEP 3:执行替换 $content = str_replace($key,$value,$content); $app->setBody($content); return ; } }
关于以上代码的说明
1,plgSystemZreplace 这个类名是如何确定的,Joomla核心依赖一系列的命名规范来完成自动加载。对于插件,joomla的命名约定规则如下:
class
plg +插件组的名称 + 插件的名称
extends
CMSPlugin
当我们的插件XML文件确定后,你的插件的类名也就确定了,所有类的命名建议采用驼峰式。这是规则,记住就行了。 因此,我们需要实现的插件的类的定义以及继承就如下:
class
plgSystemZreplace
extends
CMSPlugin
2,如何获得后台的设置参数?
插件的配置参数由系统进行存储,当插件类实例化的时候,系统会将后台的设置参数 注入到插件中,也就是上面代码中的$this->params ,这是一个JRegitry对象,提供了
set和
get方法来对设置参数进行操作。
get方法接受两个参数,一个是属性名,一个是默认值。更多关于
JRegirstry类的用法,可以查看本站的相关文档。
3,如何对页面内容进行操作
//STEP 2:获得整个页面的内容 $app = \JFactory::getApplication(); $content = $app->getBody(); //STEP 3:执行替换 $content = str_replace($key,$value,$content); $app->setBody($content);
启用插件,测试效果
将以上代码重新打包称一个zip文件,然后重新安装,进行测试。请一定要注意,由于安全的原因,所有安装的插件默认情况下是未启用的,为了能够看到效果,所以务必先启用插件,启用插件的方法就是改变右上角的插件状态,将其设置为启用。截图如下:
至此,我们就完成了Joomla4的一个标准插件的开发了。
更多
[下载文件:]plg_system_zreplacev0.0.2_2022-09-30_for_j4x.zip
虽然上面的插件已经能够正常的工作了,但也仅仅只是一个抛砖引玉,如何按照需要来书写插件,还需要更多的实践。这个简单的替换插件仅供教学使用,如果要让其变得更加的好用,还有许多改进的地方,大家可以自己改进一下,以下是一些改进建议:
- 支持多个关键词的替换
- 支持只替换特定页面的关键词
- 支持多语言
另外,大家在学习中,如果有什么不明白的地方也可以和作者联系。Email:这个 E-mail 受反垃圾邮件程序保护,您需要启用 JavaScript 才能查看。
评论 (0)