overridingopencartopencart2.xvqmod

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


Is there a better way than using VQMOD/OCMOD to change OpenCart's core files?

Is there some "overrides" folder 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.


Solution

  • 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