步骤 6 添加脚本文件
简介
从这一步开始,我们将介绍一些更高级的主题。
在这一步中,我们包含了一个安装脚本文件。每当安装或卸载扩展时,都会运行此脚本文件,并且可用于执行与安装相关的各种操作,例如
- 检查所需的最低 PHP 版本和 Joomla 版本
- 为扩展预定义默认配置
源代码可在 mod_hello 步骤 6 中找到。
安装脚本文件是一个包含 5 个函数的类
- preflight - 在安装过程开始时调用
- install、update、uninstall - 在过程中调用
- install 在操作是扩展的初始安装时调用
- update 在操作是现有扩展的安装时调用
- uninstall 在操作是扩展的删除时调用
- postflight - 在安装过程结束时调用
安装过程
您应该首先阅读有关 Joomla 安装过程 的信息,以了解脚本文件如何融入整个过程。
脚本文件
编写脚本文件最简单的方法是使用 libraries/src/Installer/InstallerScriptInterface.php 中的 \Joomla\CMS\Installer\InstallerScriptInterface 定义。
您只需返回一个实现 5 个安装程序函数的类的实例。类名无关紧要,因此在下面我们使用匿名类
script.php
<?php
defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\Installer\InstallerAdapter;
use Joomla\CMS\Installer\InstallerScriptInterface;
use Joomla\CMS\Language\Text;
return new class () implements InstallerScriptInterface {
private string $minimumJoomla = '4.4.0';
private string $minimumPhp = '7.4.0';
public function install(InstallerAdapter $adapter): bool
{
echo "mod_hello install<br>";
return true;
}
public function update(InstallerAdapter $adapter): bool
{
echo "mod_hello update<br>";
return true;
}
public function uninstall(InstallerAdapter $adapter): bool
{
echo "mod_hello uninstall<br>";
return true;
}
public function preflight(string $type, InstallerAdapter $adapter): bool
{
echo "mod_hello preflight<br>";
if (version_compare(PHP_VERSION, $this->minimumPhp, '<')) {
Factory::getApplication()->enqueueMessage(sprintf(Text::_('JLIB_INSTALLER_MINIMUM_PHP'), $this->minimumPhp), 'error');
return false;
}
if (version_compare(JVERSION, $this->minimumJoomla, '<')) {
Factory::getApplication()->enqueueMessage(sprintf(Text::_('JLIB_INSTALLER_MINIMUM_JOOMLA'), $this->minimumJoomla), 'error');
return false;
}
return true;
}
public function postflight(string $type, InstallerAdapter $adapter): bool
{
echo "mod_hello postflight<br>";
return true;
}
};
在函数调用中
$type
是一个包含安装类型的字符串:“install”、“update”或“uninstall”。(或者可能是“discover-install”,但这超出了我们在此处介绍的范围)。$adapter
是 \Joomla\CMS\Installer\Adapter\ModuleAdapter(来自 libraries/src/Installer/Adapter/ModuleAdapter.php)的实例。
对于几个函数,代码只是将文本回显到屏幕上,如果扩展安装成功,您将看到这些消息。上面的文本是英文的,但如果您将它们放入 .sys.ini 文件中,则可以使用语言字符串。
preflight 版本检查 Joomla 和 PHP 版本;这很重要,因为 mod_hello 代码使用在 Joomla 4 版本之前不可用的 API 调用。
如果安装失败(例如,如果最低版本检查失败),则 Joomla 会对 HTTP 请求做出响应,并重定向回安装扩展页面。这意味着任何 echo
输出都将看不到,而必须使用 enqueueMessage
。此函数将消息存储在会话中,Joomla 在重定向响应后的下一个 HTTP 请求中输出消息。
清单文件
剩下的就是更新清单文件以通知 Joomla 存在要处理的脚本文件
mod_hello/mod_hello.xml
<?xml version="1.0" encoding="UTF-8"?>
<extension type="module" client="site" method="upgrade">
<name>MOD_HELLO_NAME</name>
<version>1.0.6</version>
<author>me</author>
<creationDate>today</creationDate>
<description>MOD_HELLO_DESCRIPTION</description>
<namespace path="src">My\Module\Hello</namespace>
<files>
<folder module="mod_hello">services</folder>
<folder>src</folder>
<folder>tmpl</folder>
<folder>language</folder>
</files>
<scriptfile>script.php</scriptfile>
<config>
<fields name="params">
<fieldset name="basic">
<field
name="header"
type="list"
label="MOD_HELLO_HEADER_LEVEL"
default="h4"
>
<option value="h3">MOD_HELLO_HEADER_LEVEL_3</option>
<option value="h4">MOD_HELLO_HEADER_LEVEL_4</option>
<option value="h5">MOD_HELLO_HEADER_LEVEL_5</option>
<option value="h6">MOD_HELLO_HEADER_LEVEL_6</option>
</field>
</fieldset>
</fields>
</config>
</extension>