编程

Opencart 4 OCMOD 教程-使用 OCMOD 开发扩展

57 2025-05-29 07:14:00

在这个 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 文件夹时,将发生以下事情:

  1. 检测用户是否有权限。如果没有,将出现如下错误提示:  
    “Warning: You do not have permission to modify modifications!”
  2. 检查是否已存在安装临时文件夹 zip。如果它找到了文件,并且文件创建时间小于 5 秒,则它会尝试取消链接或删除文件,如果它无法删除文件,则会抛出错误:  
    “Extension installation taking place please wait a few seconds before trying to install!”
  3. 它检查文件名是否在 3 到 128 个字符之间。如果部署,它将显示这样的错误提示:  
    ‘Filename must be between 3 and 128 characters!’;
  4. 检测上传的 zip 文件后缀是否为 .ocmod.zip
  5. 检查是否有其他文件上传错误,UPLOAD_ERR_OK: Value: 0; 则没有错误,文件上传成功。如果有任何错误,它将显示如下错误:  
    “File could not be uploaded!”
  6. 如果一切正常,那么它将创建一个 .tmp 文件并执行函数 move_uploaded_file
  7. 然后,检查模块文件是否已存在,或者模块代码是否已在数据库中。如果存在,则抛出以下错误:  
    ‘Extension already installed!’
  8. 如果以上所有内容都很好,那么它将验证文件是否可以打开,以及是否可以读取 install.json。如果找不到 install.json,则抛出以下错误:  
    ‘Warning: Could not find install.json!’
  9. 如果解压 ocmod.zip 文件时出现问题,则会抛出以下错误:  
    ‘Zip file could not be opened!’

数据库操作

  1. 如果一切正常,那么它将从 install.json 中获取所有信息。它获取名称、描述、代码、版本、作者和链接
  2. 最后,它将扩展详细信息添加到数据库表 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 示例扩展的安装按钮时发生的流程。

  1. 检测用户是否有权限。如果没有,将出现如下错误提示:  
    “Warning: You do not have permission to modify modifications!”
  2. 然后从 oc_extension_install 数据库表中获取扩展详情。
  3. 确保文件在 storage 文件夹 >> Market 中存在。如果文件未找到,则抛出错误:  
    ‘Install file %s could not be found!’;
  4. 如果没有出现错误,则开始解压 ***.ocmod.zip 文件,如果无法正常解压 ocmod.zip 文件,则抛出错误:  
    “Zip file could not be opened!”
  5. 解压后,检测是否有任何已经存在。它只提取上传文件夹的内容。如果有图像,则会复制图像,然后为 vendor 文件夹存储不同的路径。
  6. 检测路径是否非目录,并检查是否没有现有文件,然后存储文件并在 oc_extension_path 数据库表中添加该路径。
  7. 它通过更新 oc_extension_install 数据库表的该模块的状态来启用模块。
  8. 它在 oc_modification 表中添加该 XML 代码。  
  9. 最后,你将看到安装成功的消息。
  10. 转到 Extensions >> Modifications 并通过点击蓝色安装按钮安装该扩展。 
     
  11. 点击清除图标,你将看到新应用的 OCMOD 

OCMOD 开发者小贴士

  • 扩展目录需要 ocmod 目录
  • ocmod.zip 之前的文件名与 <code> 值应该相同。
  • 压缩文件夹时,压缩 install.jsonocmo/ 文件夹,而不是只是文件夹。
  • 对 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 扩展。