Лучший способ модифицировать OpenCart, не касаясь ядра и VQMOD / OCMOD

Лучший способ модифицировать OpenCart, не касаясь ядра и VQMOD / OCMOD

04.10.2015 04:25:26 Просмотров 33 Источник

Есть ли лучший способ, чем использование VQMOD/ OCMODдля изменения OpenCart'sфайл PHP, соответствующий структуре файла, и просто переопределить файл ядра? (Как это возможно в PHPи PrestaShop).

VQMOD/ OCMODкрайне неудобен. Использует ли кто-то какие-либо хаки и уловки для достижения результата?

Я не хочу касаться каких-либо основных файлов, чтобы сохранить систему чистой и управляемой.

Большое спасибо!

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/32933978/best-way-to-modify-opencart-without-touching-core-and-vqmod-ocmod#comment53694447_32933978
Никогда не слышал о такой вещи

Ответы - Лучший способ модифицировать OpenCart, не касаясь ядра и VQMOD / OCMOD / Best way to modify OpenCart without touching Core and VQMOD/OCMOD

HDP

05.10.2015 09:02:12

Вы можете использовать Vqmod или Ocmod в OpenCart. оба работают в OpenCart для переопределений кода.

Для движка:

Прочтите официальную документацию OpenCart. http://docs.opencart.com/administration/vqmod/

Для ocmod:

OCMOD работает независимо. Вы должны создать XML-файл ocmod с помощью " .ocmod.XML "расширение, то вы можете загрузить этот файл с помощью "Extension Installer" из панели администратора opencart.

Вы должны очистить и обновить кэш изменений, чтобы обновить систему и заставить расширение работать. Вы можете очистить и обновить с помощью верхних правых кнопок на странице расширения > модификации> в панели администратора.

https://stackoverflow.com/questions/32933978/best-way-to-modify-opencart-without-touching-core-and-vqmod-ocmod/32942143#comment53734889_32942143
Спасибо, но я стараюсь избегать Vqmodи Ocmod. Они для меня непригодны. Существует много правил регулярных выражений, необходимых для install.xml/.ocmod.xml-файлы. И AFAIK к сожалению эти системы не поддерживают многострочный поиск. И что, если когда-нибудь после обновления он начнет подбирать неправильные строки... Еще вопросы, потом собственно Программирование :)
lexguru

07.10.2015 07:07:51

возможно ли идентифицировать файл контроллера зависимым, если альтернатива существует где-то еще? Вы можете использовать vq/ocmod один раз, чтобы написать сценарий, который говорит: "если альтернативный файл ядра существует в местоположении xyz, используйте его, в противном случае используйте файл ядра из базовой папки", а затем добавьте новые файлы ядра в каталог mods, который вы создали.. всего лишь мысль..

Nikhil Chaudhary

07.10.2015 07:18:54

Если вы хотите вызвать свою функцию в системе, которая следует структуре OC, избегайте модов поиска / замены, попробуйте использовать вместо них новые события Opencart (они же крючки).:

https://github.com/opencart/opencart/wiki/Events-System

Или вы все еще можете использовать механизм переопределения Opencart (сторонним разработчиком).

https://stackoverflow.com/questions/32933978/best-way-to-modify-opencart-without-touching-core-and-vqmod-ocmod/32997454#comment78521329_32997454
Годы спустя, это все еще проблема. Документация плохая и редко обновляется. На oc 3x теперь-что делать, если требуется простое изменение файла tpl / twig с помощью системы событий... Как заменить / вставить строку кода? Нет никакой документации, которая имеет смысл, или рабочего примера этого. OC постоянно обновляют свой основной код, но не могут обновить документы вместе с ним и помочь сообществу. vQmod был моим методом, и это было легко, но вытесняется из-за потери контроля со стороны OC, @jaygilford проделал большую работу над этим, это позор. OCmod глючит и запутан, события плохо документированы.
Является ответом!
Serhii Matrunchyk

11.12.2015 02:27:51

Решил это с помощью пользовательского Хака (и написал об этом там):

Например, вам нужно применить много изменений в catalog/controller/common/header.phpфайл. Хорошая новость — вам не нужно делать a .ocmod.xml-файл для достижения этой цели.

Просто скопируйте исходный файл в system/storage/modification/catalog/controller/common/header.phpи изменить все, что вам нужно!

Таким образом, вы можете переопределить любые файлы (контроллеры, модели, языки, шаблоны, помощники) и создать свои собственные файлы вне основного каталога!

Примечание: Вы можете быть разочарованы, почему это не может работать прямо сейчас. Это потому, что система модификации OpenCart отключена. Чтобы включить его, просто откройте Панель администратора OpenCart: расширения - > модификации> и нажмите синюю кнопку Обновить!

Примечание 2: Не нажимайте кнопку Обновить после внесения каких-либо изменений в system/storage/modification, так как он стирает ваши файлы!

https://stackoverflow.com/questions/32933978/best-way-to-modify-opencart-without-touching-core-and-vqmod-ocmod/34222495#comment58077880_34222495
Конечно, это предложение может быть рецептом катастрофы, если кто-то нажмет обновить, и у вас есть практически весь сайт, построенный с использованием в папке модификации? Также есть некоторые новые плагины OC, не требующие обновления файла ocmod? Я могу ошибаться.
https://stackoverflow.com/questions/32933978/best-way-to-modify-opencart-without-touching-core-and-vqmod-ocmod/34222495#comment58079274_34222495
@Adrian, вы не ошибаетесь. Но я имею в виду только время разработки. После того, как новая функция готова, стоит использовать инструмент diff для компиляции изменений в модуль OC и установки его в обычном режиме.
kevstev01

20.06.2017 02:37:31

Мое решение состояло в том, чтобы изменить 1 функцию (modification ()) в системе / запуске.php, который затем позволяет скопировать любой существующий файл PHP в папку "override" и изменить его без внесения изменений в исходный файл.
Я хотел бы найти способ просто заменить функции, измененные/добавленные, но подход ООП в OpenCart не позволяет легко это сделать.
Я адаптировал несколько модулей OCMOD, чтобы соответствовать моему методу переопределения (применяя модуль, копируя измененные файлы в мою структуру переопределения и затем удаляя модуль), так как я думаю, что его легче поддерживать и легче разрабатывать, и когда я создаю свои собственные модули, я создаю фиктивные файлы в основной структуре и фактические файлы в каталоге "переопределения", что означает, что все мои модификации/дополнения находятся в одной папке, которая поддерживает структуру исходного макета.
Можно было бы сгенерировать файловые диффы, которые создают OCMOD, но у меня еще не было времени это сделать. Я отмечаю все свои изменения, поэтому я могу перейти на более новые версии, повторно применяя свои изменения вручную (что обычно является "хорошей вещью" (c), и существует вероятность конфликта с другими расширениями, поэтому вручную помечая изменения, я могу применить изменения и к исправленным файлам OCMOD. Моя функция модификации выглядит так:

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

и моя структура каталогов выглядит так

/override
/override/admin
/override/catalog
/override/system
https://stackoverflow.com/questions/32933978/best-way-to-modify-opencart-without-touching-core-and-vqmod-ocmod/44652022#comment76290886_44652022
Хороший подход! Спасибо, что поделились
https://stackoverflow.com/questions/32933978/best-way-to-modify-opencart-without-touching-core-and-vqmod-ocmod/44652022#comment97654680_44652022
Это хороший подход в некотором смысле, но он, вероятно, будет препятствовать работе всех расширений?
https://stackoverflow.com/questions/32933978/best-way-to-modify-opencart-without-touching-core-and-vqmod-ocmod/44652022#comment97912297_44652022
Функция @PaulFeakins My modification () также проверяет существующую папку DIR_MODIFICATION, в которой расширения хранят измененные файлы, поэтому этот метод работает вместе с модулями расширения VQMOD/OCMOD.
https://stackoverflow.com/questions/32933978/best-way-to-modify-opencart-without-touching-core-and-vqmod-ocmod/44652022#comment97950999_44652022
Но что он будет делать, если обнаружит там измененный файл? Просто используй свой вместо этого? В этом случае он сломает любые расширения?
https://stackoverflow.com/questions/32933978/best-way-to-modify-opencart-without-touching-core-and-vqmod-ocmod/44652022#comment98003500_44652022
@Paul Feakins-на самом деле все наоборот, поскольку моя настраиваемая функция модификации сначала использует папку DIR_MODIFICATION, поэтому, если модуль настроил файл OpenCart по умолчанию, он будет использоваться, даже если он существует в папке "override". Это было сделано для того, чтобы модули могли быть применены, а затем любые измененные файлы могут быть объединены в папку "override", как отмечено в ответе, я успешно сделал это сам. Это решение, которое сработало для меня, YMMV ;)
https://stackoverflow.com/questions/32933978/best-way-to-modify-opencart-without-touching-core-and-vqmod-ocmod/44652022#comment98066316_44652022
Итак, чтобы быть ясным, он пытается применить vQmods и OCMODS к специально созданным файлам в папке override? Если это так, то я вижу, что это будет работать в большинстве случаев, пока пользовательские файлы все еще содержат "крючки", которые ищут моды vQ и OC.
https://stackoverflow.com/questions/32933978/best-way-to-modify-opencart-without-touching-core-and-vqmod-ocmod/44652022#comment98069748_44652022
в этом коде никакие моды не применяются к файлам, он просто использует существующие файлы. OpenCart предоставляет метод, который "предпочитает" сначала извлечь файл из папки (DIR_MODIFICATION), а не структуру файла по умолчанию, и если он существует, возвращает этот файл, в противном случае файл по умолчанию. Модули OCMOD используются для создания новых файлов из специально созданных инструкций DIFF, обычно использующих регулярные выражения для выполнения операций поиска / замены файлов по умолчанию, чтобы сохранить полученный файл в папке DIR_MODIFICATION. Все, что я сделал, это добавил в папку "override", так что он проверяет там тоже.
user11292674

01.04.2019 05:13:22

Вы можете попробовать следующее решение. Преимущество в том, что вы можете использовать его с любыми файлами, перемещенными в папку system / override

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;
}
Закрыть X