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

时间:2015-10-04 13:25:27

标签: override opencart core opencart2.x vqmod

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

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

VQMOD / OCMOD 高度不方便。 有人使用任何 hacks&技巧来实现结果?

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

非常感谢!

6 个答案:

答案 0 :(得分:6)

如果你想在遵循OC结构的系统内调用你的函数,避免搜索/替换mods,尝试使用新的Opencart事件(a.k.a. hooks):

https://github.com/opencart/opencart/wiki/Events-(script-notifications)-2.2.x.x

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

答案 1 :(得分:3)

我的解决方案是修改system / startup.php中的1个函数(modification()),然后允许您将任何现有的PHP文件复制到'override'文件夹中并修改它而不更改原始文件。<登记/> 我想找到一种方法来替换已更改/添加的功能,但OpenCart中的OOP方法并不容易实现这一点。
我已经改编了一些OCMOD模块以适应我的覆盖方法(通过应用模块,将更改的文件复制到我的覆盖结构然后删除模块),因为我认为它更容易维护,更容易开发,当我创建我自己的模块,我在主结构中创建虚拟文件,在'override'目录中创建实际文件,这意味着我所有的修改/添加都在一个文件夹中,以保持原始布局的结构。
有可能生成创建OCMOD的文件差异,但我还没有时间这样做。我会标记所有更改,因此我可以通过手动重新应用我的更改来升级到更新版本(这通常是“好事”(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

答案 2 :(得分:0)

您可以在OpenCart中使用Vqmod或Ocmod。两者都在OpenCart中用于覆盖代码。

对于vqmod:

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

对于ocmod:

OCMOD独立运作。您必须使用&#34; .ocmod.xml &#34;创建ocmod xml文件。扩展,然后您可以使用&#34; Extension Installer &#34;上传该文件来自opencart的管理面板。

您必须清除并刷新修改缓存以更新系统并使扩展工作。您可以通过扩展程序&gt;上的右上角按钮清除和刷新管理面板中的修改页面。

答案 3 :(得分:0)

如果其他地方存在替代方案,那么

是不是可以识别依赖的控制器文件?您可以使用vq / ocmod一次编写一个脚本,上面写着“如果xyz位置存在替代核心文件,请使用它,否则,使用基本文件夹中的核心文件”然后将新核心文件添加到您创建的mods目录中。只是一个想法..

答案 4 :(得分:0)

您可以尝试以下解决方案。优点是您可以将其与移入系统/替代文件夹

的任何文件一起使用
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;
}

答案 5 :(得分:-2)

使用自定义hack解决了这个问题(并撰写了关于此there的信息):

例如,您需要在catalog/controller/common/header.php文件中应用大量更改。好消息 - 您无需制作.ocmod.xml文件即可实现此目的。

只需将原始文件复制到system/storage/modification/catalog/controller/common/header.php并更改您需要的任何内容!

这样你就可以覆盖任何文件(控制器,模型,语言,模板,助手)并在核心目录之外创建自己的文件!

注意:您可能会对它为什么现在无法正常工作感到失望。这是因为OpenCart的修改系统已关闭。要打开它,只需打开OpenCart的管理面板:扩展程序 - &gt;修改并单击蓝色刷新按钮!

注意2 :在system/storage/modification目录下进行任何更改后,请勿点击刷新,因为它会擦除您的文件!