Opencart 4 OCMOD 教程-使用 OCMOD 开发扩展
在这个 Opencart 教程中,我们将介绍 Opencart 4 OCMOD,并展示如何在 OCMOD 中开始编码以更改文件和扩展 Opencart 的功能。我们希望这有助于学习掌握 OCMOD 的分步说明,将线上店铺提升到新的高度,并使用 OCMOD 开发多个 Opencart 扩展。
OCMOD 是一个系统,允许店铺所有者通过上传包含 XML、SQL 和 PHP 文件的压缩文件来修改他们的商店。OCMOD 有助于在不更改任何核心文件的情况下修改 OpenCart 存储。这意味着当我们删除修改时,我们不需要还原或修复 Opencart 文件。
在这里,我们将展示当有人上传 ***.ocmod.zip 文件时出现的流程,然后创建一个 test.ocmod.xml 文件来显示左列中的模块链接,并为你提供 Opencart 4 中 ocmod 文档的详细信息。
OCMOD 扩展的文件及目录结
所有 ocmod xml 都应该在ocmod 文件夹中。在这个例子中,我们正在创建 webocreation_admin_menu 扩展文件夹,其中包含 install.json 和 ocmod 文件夹。在 ocmod 文件夹中,我们添加了 XML 文件,XML 文件名应与代码相同。这里的文件名是 webocreation_admin_menu.ocmod.xml
,在 xml 中的代码是 <code>webocreating_admin_mnu</code>
。

OCMOD 流程
使用 OCMOD 上传扩展
根据核心代码,当你从 Extensions>>Installer 上传 ***.ocmod.zip 文件夹时,将发生以下事情:
- 检测用户是否有权限。如果没有,将出现如下错误提示:
“Warning: You do not have permission to modify modifications!” - 检查是否已存在安装临时文件夹 zip。如果它找到了文件,并且文件创建时间小于 5 秒,则它会尝试取消链接或删除文件,如果它无法删除文件,则会抛出错误:
“Extension installation taking place please wait a few seconds before trying to install!” - 它检查文件名是否在 3 到 128 个字符之间。如果部署,它将显示这样的错误提示:
‘Filename must be between 3 and 128 characters!’; - 检测上传的 zip 文件后缀是否为 .ocmod.zip
- 检查是否有其他文件上传错误,
UPLOAD_ERR_OK: Value: 0;
则没有错误,文件上传成功。如果有任何错误,它将显示如下错误:
“File could not be uploaded!” - 如果一切正常,那么它将创建一个 .tmp 文件并执行函数
move_uploaded_file
。 - 然后,检查模块文件是否已存在,或者模块代码是否已在数据库中。如果存在,则抛出以下错误:
‘Extension already installed!’ - 如果以上所有内容都很好,那么它将验证文件是否可以打开,以及是否可以读取
install.json
。如果找不到install.json
,则抛出以下错误:
‘Warning: Could not find install.json!’ - 如果解压
ocmod.zip
文件时出现问题,则会抛出以下错误:
‘Zip file could not be opened!’
数据库操作
- 如果一切正常,那么它将从 install.json 中获取所有信息。它获取名称、描述、代码、版本、作者和链接
- 最后,它将扩展详细信息添加到数据库表
oc_extension_install
中。运行的查询如下:$this->db->query(“INSERT INTO `” . DB_PREFIX . “extension_install` SET `extension_id` = ‘” . (int)$data[‘extension_id’] . “‘, `extension_download_id` = ‘” . (int)$data[‘extension_download_id’] . “‘, `name` = ‘” . $this->db->escape($data[‘name’]) . “‘, `description` = ‘” . $this->db->escape($data[‘description’]) . “‘, `code` = ‘” . $this->db->escape($data[‘code’]) . “‘, `version` = ‘” . $this->db->escape($data[‘version’]) . “‘, `author` = ‘” . $this->db->escape($data[‘author’]) . “‘, `link` = ‘” . $this->db->escape($data[‘link’]) . “‘, `status` = ‘0’, `date_added` = NOW()”);
如你所见,状态仍然是 0。文件上传已完成,扩展名信息已添加到数据库中。
上传已完成。
安装 OCMOD 扩展
你将在 Extensions >> Installer 中看到扩展列表。如下:

现在,我们展示了当单击 Opencart OCMOD 示例扩展的安装按钮时发生的流程。
- 检测用户是否有权限。如果没有,将出现如下错误提示:
“Warning: You do not have permission to modify modifications!” - 然后从
oc_extension_install
数据库表中获取扩展详情。 - 确保文件在 storage 文件夹 >> Market 中存在。如果文件未找到,则抛出错误:
‘Install file %s could not be found!’; - 如果没有出现错误,则开始解压 ***.ocmod.zip 文件,如果无法正常解压 ocmod.zip 文件,则抛出错误:
“Zip file could not be opened!” - 解压后,检测是否有任何已经存在。它只提取上传文件夹的内容。如果有图像,则会复制图像,然后为 vendor 文件夹存储不同的路径。
- 检测路径是否非目录,并检查是否没有现有文件,然后存储文件并在
oc_extension_path
数据库表中添加该路径。 - 它通过更新 oc_extension_install 数据库表的该模块的状态来启用模块。
- 它在 oc_modification 表中添加该 XML 代码。
- 最后,你将看到安装成功的消息。
- 转到 Extensions >> Modifications 并通过点击蓝色安装按钮安装该扩展。
- 点击清除图标,你将看到新应用的 OCMOD
OCMOD 开发者小贴士
- 扩展目录需要 ocmod 目录
- ocmod.zip 之前的文件名与 <code> 值应该相同。
- 压缩文件夹时,压缩
install.json
和ocmo/
文件夹,而不是只是文件夹。 - 对 OCMOD 的修改进行测试会显得比较麻烦,如果你必须对 XML、zip 进行修改,并重新在 installer 中上传,然后清除修改。因此,给开发者的建议是,可以上传扩展并启用它,然后从扩展文件夹中更改扩展代码,而不需要一次又一次地压缩和上传,你只需清除 modification 中的缓存,就可以检查更改,一旦你满意,你就可以复制、制作扩展并上传。
- oc_modification、oc_extension_install 和 oc_extension_path 是上传和安装 ocmod 的三个数据库表格。
OCMOD 代码示例
下例的在 install.xml 中,******** 是你自定义的内容
<?xml version="1.0" encoding="utf-8"?>
<modification>
<name>*******</name>
<version>*******</version>
<author>*******</author>
<link>*******</link>
<code>*******</code>
<description>*******</description>
<file path="*******">
<operation>
<search><![CDATA[ ******* ]]></search>
<add position="*******"><![CDATA[*******]]></add>
</operation>
</file>
</modification>
别忘了 <code>
,虽然它没在 Modification 系统文档 https://github.com/opencart/opencart/wiki/Modification-System 中提及。你可以使用多个文件操作(operation)。其中有两个操作,search 及 add。使用 add 操作,你可以在 position 中添加替换(replace)、addd before、add after。
<file path="">
<operation>
<search><![CDATA[]]></search>
<add position=""><![CDATA[]]></add>
</operation>
</file>
OCMOD 控制器代码示例
<file path="admin/controller/catalog/attribute.php">
<operation>
<search>
<![CDATA[Opencart\Admin\Controller\Catalog;]]>
</search>
<add position="replace">
<![CDATA[Opencart\Admin\Controller\Extension\Ocmod\Catalog;]]>
</add>
</operation>
<operation>
<search regex="false">
<![CDATA[$this->load->language('catalog/attribute');]]>
</search>
<add position="before">
<![CDATA[echo 'BEFORE WORKS</br>';]]>
</add>
</operation>
<operation>
<search regex="false">
<![CDATA[$this->load->language('catalog/attribute');]]>
</search>
<add position="after">
<![CDATA[echo 'AFTER WORKS</br>';]]>
</add>
</operation>
<operation>
<search regex="false">
<![CDATA[controller_catalog_attribute]]>
</search>
<add position="replace">
<![CDATA[controller_extension_ocmod_catalog_attribute]]>
</add>
</operation>
<operation>
<search regex="false">
<![CDATA[$this->load->language('catalog/attribute');]]>
</search>
<add position="replace">
<![CDATA[$this->load->language('catalog/attribute');
echo 'REPLACE WORKS</br>';
]]>
</add>
</operation>
</file>
OCMOD 模型代码示例
<file path="admin/model/catalog/attribute.php">
<operation>
<search>
<![CDATA[Opencart\Admin\Model\Catalog;]]>
</search>
<add position="replace">
<![CDATA[Opencart\Admin\Model\Extension\Ocmod\Catalog;]]>
</add>
</operation>
<operation>
<search regex="false">
<![CDATA[public function addAttribute(array $data): int {]]>
</search>
<add position="before">
<![CDATA[echo 'MODEL BEFORE WORKS</br>';]]>
</add>
</operation>
<operation>
<search regex="false">
<![CDATA[public function addAttribute(array $data): int {]]>
</search>
<add position="after">
<![CDATA[echo 'AFTER WORKS</br>';]]>
</add>
</operation>
</file>
OCMOD 视图示例代码
<file path="admin/view/template/catalog/attribute.twig">
<operation>
<search regex="false">
<![CDATA[<div class="float-end">]]>
</search>
<add position="before">
<![CDATA[ // BEFORE WORKS]]>
</add>
</operation>
<operation>
<search regex="false">
<![CDATA[<div class="float-end">]]>
</search>
<add position="after">
<![CDATA[ // AFTER WORKS]]>
</add>
</operation>
</file>
OCMOD 库代码示例
<file path="system/library/template/template.php">
<operation>
<search regex="false">
<![CDATA[include]]>
</search>
<add position="after">
<![CDATA[ // AFTER WORKS]]>
</add>
</operation>
</file>
OCMOD Admin 扩展代码示例
<file path="extension/opencart/admin/controller/report/customer_order.php">
<operation>
<search>
<![CDATA[Opencart\Admin\Controller\Extension\Opencart\Report;]]>
</search>
<add position="replace">
<![CDATA[Opencart\Admin\Controller\Extension\Ocmod\Extension\Opencart\Report;]]>
</add>
</operation>
<operation>
<search regex="false">
<![CDATA[$this->load->language('extension/opencart/report/customer_order');]]>
</search>
<add position="after">
<![CDATA[echo 'WORKS!';]]>
</add>
</operation>
</file>
添加 OCMOD 扩展的 Admin 模块菜单
我们使用 OCMOD 创建了一个免费模块,在管理部分的左侧菜单中显示模块链接,这样我们就可以直接转到模块区域,而不需要继续使用扩展过滤器。如下:

OCMOD 扩展的目录创建
- 创建一个目录,并将其命名,比如 webocreation_admin_menu
- 在目录中创建 install.json 文件
- 在 webocreation_admin_menu 目录中,创建
ocmod
目录 - 在 ocmod 目录中,创建一个 XML 文件,并将其命名为 webocreation_admin_menu.ocmod.xml
install.json 文件代码
{
"name": "Webocreation Admin Menu",
"version": "1.0",
"author": "Webocreation",
"link": "https://www.webocreation.com"
}
webocreation_admin_menu.ocmod.xml 代码
<?xml version="1.0" encoding="utf-8"?>
<modification>
<name>Webocreation Admin Menu</name>
<description>Add a Module link in top menu item in the Admin section.</description>
<code>webocreation_admin_menu</code>
<version>1.0</version>
<author>Webocreation</author>
<link>https://webocreation.com</link>
<file path="admin/controller/common/column_left.php">
<operation>
<search regex="false">
<![CDATA[if ($marketplace) {]]>
</search>
<add position="before">
<![CDATA[
if ($marketplace) {
$data['menus'][] = [
'id' => 'menu-extension',
'icon' => 'fas fa-puzzle-piece',
'name' => 'Module',
'href' => $this->url->link('marketplace/extension', 'user_token=' . $this->session->data['user_token'].'&type=module'),
'children' => []
];
}
]]>
</add>
</operation>
</file>
</modification>
OCMOD 错误日志
你可以在 Extensions >> Modifications >> Log 选项卡中看见 OCMOD 的错误日志。
其中一些错误代码:
如果搜索的代码未找到,它将显示如下日志:
MOD:
FILE: admin/controller/common/column_left.php
CODE: if ($this->user('access', 'marketplace/modification')) {
NOT FOUND - OPERATIONS ABORTED!
通过以上的方式,你可以使用 OCMOD 开发 Opencart 4 扩展。