Serhii Matrunchyk
Serhii Matrunchyk

Reputation: 9363

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.

Upvotes: 7

Views: 10039

Answers (5)

Nikhil Malik
Nikhil Malik

Reputation: 478

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.

Upvotes: 6

user11292674
user11292674

Reputation: 1

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;
}

Upvotes: 0

kevstev01
kevstev01

Reputation: 340

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

Upvotes: 6

lexguru
lexguru

Reputation: 121

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..

Upvotes: 0

HDP
HDP

Reputation: 4221

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.

Upvotes: 0

Related Questions