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

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.


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