使用VQMOD
/ OCMOD
更改OpenCart's
核心文件有更好的方法吗?
是否有一些"覆盖"文件夹存在,以便我可以简单地创建对应于文件结构的任何PHP
文件,并简单地覆盖核心文件? (就像在PrestaShop
和Magento
中一样)。
VQMOD
/ OCMOD
高度不方便。
有人使用任何 hacks&技巧来实现结果?
我不想触摸任何核心文件以保持系统清洁和易于管理。
非常感谢!
答案 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
目录下进行任何更改后,请勿点击刷新,因为它会擦除您的文件!