问题
Is there a better way then using VQMOD
/OCMOD
to change OpenCart's
core files?
Is there some "overrides" folder exists so that I can simply create any PHP
file corresponding to the file structure and simply override a core file? (Like it is possible in PrestaShop
and Magento
).
VQMOD
/OCMOD
is highly inconvenient.
Does someone use any hacks & tricks to achieve the result?
I don't want to touch any core files to keep the system clean and manageable.
Thanks a lot!
回答1:
If you want to call your function within the system which follows the OC structure, avoid the search/replace mods, try using the new Opencart Events (a.k.a. hooks) instead:
https://github.com/opencart/opencart/wiki/Events-System
Or, you can still use the Opencart override engine (by a 3rd-party developer) though.
回答2:
My solution was to modify 1 function (modification()) in the system/startup.php which then allows you to copy any existing PHP file into an 'override' folder and modify it without making changes to the original file.
I'd like to find a way of just replacing the functions changed/added, but the OOP approach in OpenCart doesn't easily allow this.
I've adapted a few OCMOD modules to fit my override method (by applying the module, copying the changed files into my override structure and then removing the module), as I think it's easier to maintain and easier to develop with, and when I create my own modules, I create dummy files in the main structure and the actual files in the 'override' directory, which means all my modifications/additions are in one folder that maintains the structure of the original layout.
It would be possible to generate file diffs that create an OCMOD, but I haven't had time to do that yet. I do mark all my changes, so I can upgrade to newer versions by re-applying my changes manually (which is usually a "good thing" (c), and there is potential to have conflict with other extensions, so manually marking changes means I can apply changes to OCMOD patched files too.
My modification function looks like this:
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;
}
and my directory structure looks like this
/override
/override/admin
/override/catalog
/override/system
回答3:
You can use Vqmod or Ocmod in OpenCart. both are working in OpenCart for overrides code.
For vqmod:
Read this Official OpenCart documentation. http://docs.opencart.com/administration/vqmod/
For ocmod:
OCMOD works independently. You have to create ocmod xml file with ".ocmod.xml" extension, then you can upload that file using "Extension Installer" from admin panel of opencart.
You have to clear and refresh the modification cache to update the system and make the extension work. You can clear and refresh by top right buttons on Extension > Modification page in admin panel.
回答4:
wouldn't it be possible to identify a controller file dependent if an alternative exists somewhere else? You could use vq/ocmod one time to write a script that says "if alternative core file exists in xyz location, use it, otherwise, use core file out of base folder" then add new core files to the mods directory that you created.. just a thought..
回答5:
You can try the following solution. The advantage is you can use it with any files moved into system/override folder
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;
}
回答6:
Solved this using a custom hack (and wrote about this there):
For example, you need to apply a lot of changes in catalog/controller/common/header.php
file. Good news — you don't need to make a .ocmod.xml
file to achieve this.
Simply copy the original file to system/storage/modification/catalog/controller/common/header.php
and change anything you need!
So that you can override any files (controllers, models, languages, templates, helpers) and create your own files outside the core directory!
Note: You can be disappointed why it might not work right now. It's because OpenCart's modification system is off. To turn it on simply open OpenCart's admin panel: Extensions —> Modifications and click a blue Refresh button!
Note 2: Don't click on Refresh after any changes are made under system/storage/modification
directory since it wipes off your files!
来源:https://stackoverflow.com/questions/32933978/best-way-to-modify-opencart-without-touching-core-and-vqmod-ocmod