Página 1 de 1

Manual - Correção bug OCMOD OpenCart 4.x

Enviado: 26 Dez 2025, 14:03
por veteranodf
Olá;

Essa é uma pequena dica para quem está utilizando o opencart 4.x e as modificações XML OCMOD não entra em vigência após atualizar as modificações, isso ocorre devido ao opencart não buscar a alteração OCMOD e sim os arquivo nativo do opencart, com base nisso personalizei um script PHP que deve ser executado na raiz da loja "frete da loja", ele irá substituir algumas linha em dois arquivos, e com isso as extensões ocmod irão funcionar corretamente;

Salve o conteúdo abaixo em um arquivo chamado "corrigir_bug_ocmod.php" na raiz de sua loja e acesse o mesmo pela url exemplo "https://www.seudominio.com.br/corrigir_bug_ocmod.php"
Código: Selecionar todos
<?php
//OpenCart 4.x BUG FIX OCMOD -> https://github.com/opencart/opencart/pull/14622/files

declare(strict_types=1);

error_reporting(E_ALL);
ini_set('display_errors', '1');

$root = realpath(__DIR__);
$changes = 0;

function backup(string $file): void {
    copy($file, $file . '.bak_' . date('Ymd_His'));
}

function replace_once(string $file, string $search, string $replace): void {
    global $changes;

    $content = file_get_contents($file);

    if (strpos($content, $replace) !== false) {
        return;
    }

    if (strpos($content, $search) === false) {
        return;
    }

    backup($file);
    file_put_contents($file, str_replace($search, $replace, $content));
    $changes++;
}

function insert_before(string $file, string $marker, string $block): void {
    global $changes;

    $content = file_get_contents($file);

    if (strpos($content, 'function modification(') !== false) {
        return;
    }

    $pos = strpos($content, $marker);
    if ($pos === false) {
        return;
    }

    backup($file);
    $content = substr($content, 0, $pos) . $block . substr($content, $pos);
    file_put_contents($file, $content);
    $changes++;
}

/**
 * system/engine/autoloader.php
 */
$autoloader = $root . '/system/engine/autoloader.php';
replace_once(
    $autoloader,
    'include_once($file);',
    'include_once(modification($file));'
);

/**
 * system/startup.php
 */
$startup = $root . '/system/startup.php';

$function = <<<PHP

function modification(\$filename): string {
    \$modification = DIR_EXTENSION . 'ocmod/' . substr(\$filename, strlen(DIR_OPENCART));

    if (is_file(\$modification)) {
        return \$modification;
    }

    return \$filename;
}

PHP;

insert_before($startup, '// OpenCart Autoloader', $function);

replace_once(
    $startup,
    "require_once(DIR_SYSTEM . 'engine/autoloader.php');",
    "require_once(modification(DIR_SYSTEM . 'engine/autoloader.php'));"
);

replace_once(
    $startup,
    "require_once(DIR_SYSTEM . 'engine/config.php');",
    "require_once(modification(DIR_SYSTEM . 'engine/config.php'));"
);

header('Content-Type: text/plain; charset=utf-8');
echo "Correção OCMOD OpenCart 4.x finalizada\n";
echo "Alterações aplicadas: {$changes}\n";