有没有更好的方法然后使用VQMOD
/OCMOD
来更改OpenCart's
核心文件?
是否存在一些“覆盖”文件夹,以便我可以简单地创建PHP
与文件结构相对应的任何文件并简单地覆盖核心文件?(就像在PrestaShop
和中是可能的Magento
)。
VQMOD
/OCMOD
非常不方便。有人使用任何黑客和技巧来达到结果吗?
我不想接触任何核心文件以保持系统清洁和可管理。
非常感谢!
有没有更好的方法然后使用VQMOD
/OCMOD
来更改OpenCart's
核心文件?
是否存在一些“覆盖”文件夹,以便我可以简单地创建PHP
与文件结构相对应的任何文件并简单地覆盖核心文件?(就像在PrestaShop
和中是可能的Magento
)。
VQMOD
/OCMOD
非常不方便。有人使用任何黑客和技巧来达到结果吗?
我不想接触任何核心文件以保持系统清洁和可管理。
非常感谢!
如果您想在遵循 OC 结构的系统中调用您的函数,请避免使用搜索/替换模块,请尝试使用新的 Opencart 事件(又名钩子):
https://github.com/opencart/opencart/wiki/Events-System
或者,您仍然可以使用Opencart 覆盖引擎(由第 3 方开发人员提供)。
我的解决方案是修改 system/startup.php 中的 1 个函数 (modification()),然后允许您将任何现有的 PHP 文件复制到“覆盖”文件夹中并修改它而不更改原始文件。
我想找到一种仅替换更改/添加的功能的方法,但是 OpenCart 中的 OOP 方法并不容易做到这一点。
我已经调整了一些 OCMOD 模块以适应我的覆盖方法(通过应用模块,将更改的文件复制到我的覆盖结构中,然后删除模块),因为我认为它更容易维护和更容易开发,当我创建自己的模块,在主结构中创建虚拟文件,在“覆盖”目录中创建实际文件,
可以生成创建 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
您可以在 OpenCart 中使用 Vqmod 或 Occmod。两者都在 OpenCart 中工作以覆盖代码。
对于 vqmod:
阅读这份 OpenCart 官方文档。 http://docs.opencart.com/administration/vqmod/
对于 ocmod:
OCMOD 独立工作。您必须创建带有“ .ocmod.xml ”扩展名的 ocmod xml 文件,然后您可以使用opencart 管理面板中的“ Extension Installer ”上传该文件。
您必须清除并刷新修改缓存以更新系统并使扩展工作。您可以通过管理面板中扩展 > 修改页面上的右上角按钮清除和刷新。
如果其他地方存在替代方案,是否有可能识别出依赖于控制器文件的控制器文件?您可以使用 vq/ocmod 一次编写一个脚本,上面写着“如果 xyz 位置存在替代核心文件,请使用它,否则,使用基础文件夹之外的核心文件”,然后将新核心文件添加到您创建的 mods 目录中。 。 只是一个想法..
您可以尝试以下解决方案。优点是您可以将它与移动到系统/覆盖文件夹中的任何文件一起使用
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;
}