在不接触 Core 和 VQMOD/OCMOD 的情况下修改 OpenCart 的最佳方法

Best way to modify OpenCart without touching Core and VQMOD/OCMOD

有没有比使用 VQMOD/OCMOD 更改 OpenCart's 核心文件更好的方法?

是否存在一些 "overrides" 文件夹,以便我可以简单地创建与文件结构对应的任何 PHP 文件并简单地覆盖核心文件? (就像在 PrestaShopMagento 中是可能的)。

VQMOD/OCMOD非常不方便。 有人使用任何黑客和技巧来达到这个结果吗?

我不想触及任何核心文件以保持系统清洁和易于管理。

非常感谢!

您可以在 OpenCart 中使用 Vqmod 或 Ocmod。两者都在 OpenCart 中工作以获取覆盖代码。

对于 vqmod:

阅读此 OpenCart 官方文档。 http://docs.opencart.com/administration/vqmod/

对于 ocmod:

OCMOD 独立工作。您必须创建带有“.ocmod.xml”扩展名的 ocmod xml 文件,然后您可以使用“Extension Installer[=28] 上传该文件=]" 来自 opencart 的管理面板。

您必须清除并刷新修改缓存才能更新系统并使扩展正常工作。您可以通过管理面板中扩展>修改页面右上角的按钮清除和刷新。

如果其他地方存在替代方案,是否可以识别依赖的控制器文件?您可以使用 vq/ocmod 一次编写一个脚本 "if alternative core file exists in xyz location, use it, otherwise, use core file out of base folder" 然后将新的核心文件添加到您创建的 mods 目录..只是一个想法..

如果您想在遵循 OC 结构的系统中调用您的函数,请避免使用 search/replace 模组,尝试使用新的 Opencart Events(a.k.a.hooks):

https://github.com/opencart/opencart/wiki/Events-System

或者,您仍然可以使用 Opencart override engine(由第 3 方开发人员提供)。

我的解决方案是修改 system/startup.php 中的 1 个函数 (modification()),然后允许您将任何现有的 PHP 文件复制到 'override' 文件夹并在不更改原始文件的情况下对其进行修改。
我想找到一种仅替换函数的方法 changed/added,但 OpenCart 中的 OOP 方法不容易做到这一点。
我已经调整了一些 OCMOD 模块以适应我的覆盖方法(通过应用模块,将更改的文件复制到我的覆盖结构中,然后删除模块),因为我认为它更容易维护和开发,并且当我创建我自己的模块,我在主结构中创建虚拟文件,在 'override' 目录中创建实际文件,这意味着我所有的 modifications/additions 都在一个保持原始布局结构的文件夹中。
可以生成创建 OCMOD 的文件差异,但我还没有时间这样做。我确实标记了我所有的更改,所以我可以通过手动重新应用我的更改来升级到更新的版本(通常是 "good thing" (c),并且有可能与其他扩展发生冲突,因此手动标记更改意味着我也可以将更改应用于 OCMOD 修补文件。 我的修改函数如下所示:

function modification($filename) {
    $mod_dirs = array(
        DIR_MODIFICATION,
        dirname(DIR_SYSTEM).'/override/'    // do this second in case there are other over-rides needed for modules
    );

    foreach($mod_dirs as $mod) {
        if (!defined('DIR_CATALOG')) {
            $file = $mod . 'catalog/' . substr($filename, strlen(DIR_APPLICATION));
        } else {
            $file = $mod . 'admin/' .  substr($filename, strlen(DIR_APPLICATION));
        }

        if (substr($filename, 0, strlen(DIR_SYSTEM)) == DIR_SYSTEM) {
            $file = $mod . 'system/' . substr($filename, strlen(DIR_SYSTEM));
        }

        if (is_file($file)) {
            return $file;
        }
    }

    return $filename;
}

我的目录结构是这样的

/override
/override/admin
/override/catalog
/override/system

您可以尝试以下解决方案。优点是您可以将它与移动到 system/override 文件夹

中的任何文件一起使用
function modification($filename) {

    if (defined('DIR_CATALOG')) {
        $file = DIR_MODIFICATION . 'admin/' .  substr($filename, strlen(DIR_APPLICATION));
    } elseif (defined('DIR_OPENCART')) {
        $file = DIR_MODIFICATION . 'install/' .  substr($filename, strlen(DIR_APPLICATION));
    } else {
        $file = DIR_MODIFICATION . 'catalog/' . substr($filename, strlen(DIR_APPLICATION));
    }

    if (substr($filename, 0, strlen(DIR_SYSTEM)) == DIR_SYSTEM) {
        $file = DIR_MODIFICATION . 'system/' . substr($filename, strlen(DIR_SYSTEM));
    }

    if (is_file($file)) {

        $new_file = str_replace("/storage/modification/" , "/override/",$file ); 

         if (is_file($new_file))   $__file =  $new_file;
            else $__file =  $file;

        return $__file; 
    }

    if( preg_match("/\/catalog\/model\//",  $filename) ) 
       $new_file      = str_replace("catalog/model", "system/override/catalog/model", $filename );  
    else if( preg_match("/\/catalog\/controller\//",  $filename) ) 
      $new_file = str_replace("catalog/controller", "system/override/catalog/controller",$filename );  
    else   $new_file = '';

    if (file_exists($new_file )) $__file = $new_file; 
    else $__file = $filename;

    return $__file;
}