Не применяется MOD в 4.1. Как их писать теперь?

Тема в разделе "Общие вопросы", создана пользователем Delovoy, 11 сен 2025.

  1. Delovoy

    Delovoy Новичок

    Сообщения:
    4
    Симпатии:
    0
    Что не так делаю?
    Пробую ocmod на русской сборке 4.1.0.0 (rs.2), до этого писал моды только под 3-ю версию движка.

    Cоздал файл install.xml, упаковал в mod_name.ocmod.zip, загрузил в админке и получил ошибку: Could not find install.json!

    Добавил install.json. Установка прошла успешно, но мод появился только в списке установленных расширений.
    Папка system/storage/modification не создалась. Архив лег в system/storage/marketplace/. В site_root/extension/ создалась папка распакованного архива.
    Но модификация к файлу не применилась - измененного его нигде нет, как и изменений на сайте.
    Деинсталлировал модуль в админке.

    Переименовал install.xml в mod_name.ocmod.xml и вместе с install.json упаковал в mod_name.ocmod.zip
    Установил и все снова как на предидущем шаге: мод появился в списке установленных расширений, system/storage/modification не создалась, на сайте изменений нет.

    Или под модификаторами теперь понимаются только свои собственные файлы, которые раньше клались в upload/ установочного архива .ocmod.zip?

    Т.е. изменения в самих файлах движка теперь недоступны?
     
  2. Ravilr

    Ravilr Специалист

    Сообщения:
    4.210
    Симпатии:
    1.449
    Не используйте пока модификаторы, они не работают так как раньше. Пока возможно модифицировать только twig файлы. Контроллеры тоже поддаются изменению, но не так как раньше.

    Да, почти так.

    Когда внедряли события итд, на это был и расчет... но все пошло не так ...
     
    Delovoy нравится это.
  3. vrndorog

    vrndorog Пользователь

    Сообщения:
    36
    Симпатии:
    5
    В Опенкарт 4.1 не создается system/storage/modification. При регистрации модификатора создается /extension/ocmod, куда и складываются модифицированные файлы. XML-код добавляется в таблицу oc_modification при активации расширения. Проверьте, создается ли соответствующая запись о Вашей модификации в таблице.
    Есть подозрение (пока проверить руки не доходят), что при активации не читается файл install.xml, но следующий код в методе install расширения работает:

    Код:
    if ($modificator) {
                $this->load->model('setting/extension');
                $install_info = $this->model_setting_extension->getInstallByCode('my_extension');
    
                $filePath = DIR_EXTENSION . 'my_extension/system/modification/controllers.xml';
    
                $modification_data = [
                    'extension_install_id' => $install_info['extension_install_id'],
                    'name' => 'category',
                    'description' => 'Делает много чего',
                    'code' => 'my_extension',
                    'author' => '',
                    'version' => '1.01',
                    'link' => 'site.ru',
                    'xml' => file_get_contents($filePath),
                    'status' => 1
                ];
    
                $this->load->model('setting/modification');
    
                $this->model_setting_modification->addModification($modification_data);
            }
    Но прежде, чем использовать модификаторы, подумайте, нельзя ли решить ту же задачу при помощи event. Зачем менять код, если достаточно изменить данные, которые этот код принимает или возращает?
     
    Последнее редактирование: 11 сен 2025
    Delovoy нравится это.
  4. Delovoy

    Delovoy Новичок

    Сообщения:
    4
    Симпатии:
    0
    А как?

    Я еще тогда этой задумки не понял. В систему событий контроллер возвращает данные, выбранные и обработанные по "его" логике, а мне надо под "свою" данные добавить. Значит я в своем event должен заново обратиться к тем же таблицам, вытащить из них ту же порцию данных - да зачем так?! Не проще ли оставить мне как и прежде возможность поработать с уже выбранными моделью данными в контроллере? Вобщем, в этой связи я не понял их задумки с event...

    именно сюда у меня ничего не упало, а вот в /extension/ появилась папка с именем моего архива mod_name.ocmod.zip и с файлами из него: /extension/mod_name/*

    Нет

    Может и читается, но как это проверить - где увидеть результат, где что должно появиться?

    А вот тут не понял: где я должен написать такой метод?
    И что именно должно записаться в поле xml таблицы модификаторов? В примере своего кода вы читаете файл controllers.xml - что это за файл? Раньше я создавал только install.xml.

    Часто проще внести небольшую правку или дополнить массив данными из бд (вкратце об этом писал выше) и запускать ради этого через event целый процесс повторного обращения к бд за той же самой порцией данных, которая только что уже была выбрана моделью в контроллер... Ладно бы требовалось дополнить данные контроллера результатами совершенно иной логики, основанной на отдельных данных из бд, которые не выбирались в контроллер, тогда да, для чистоты кода и разделения логики контроллера движка от своей - это неплохо.
     
  5. vrndorog

    vrndorog Пользователь

    Сообщения:
    36
    Симпатии:
    5
    Попробуем разобраться.
    • Переходим на страницу модули/расширения ->Установка расширений, открываем консоль браузера и переходим на вкаладку Сеть. Далее жмем на зеленую кнопку какого-нибудь расширения. В консоли видим, что один из запросов уходит в метод контроллера marketplace/installer с говорящим названием xml.
    • В методе xml видим, что источником xml файлов для этого метода является DIR_STORAGE . 'marketplace/' . $extension_install_info['code'] . '.ocmod.zip' . Метод находит в этой директории папку ocmod и перебирает в цикле все файлы в этой папке, которые имеют расширение .ocmod.xml. Значит, чтобы создать модификатор, нужно создать файл с любым именем, но с расширением .ocmod.xml (Имя файла, будет идентификатором модификатора в БД).
    Надеюсь, теперь понятно, как создать модификатор в Опенкарт 4.1.0.0. Нужно создать файл .ocmod.xml с валидным xml и разместить его в папке ocmod, которую положить в архив своего расширения.

    Также модификатор можно создать в исталяционных инструкциях своего расширения. Метод install находится в файле /extension/mod_name/admin/controller/module/mod_name.php (возьмите для примера любое расширение, это не обязательно module). Пример кода для создания модификатора я приводил выше.

    Имя файла не имеет значения. По сути это файл, из которого берется xml для модификатора. (file_get_contents($filePath))

    Надеюсь, это поможет. Опенкарт 4 классная штука, особенно версия 4.1.0.0, где для безвыходных ситуаций есть модификаторы.
     
    Последнее редактирование: 12 сен 2025
    Delovoy нравится это.
  6. Ravilr

    Ravilr Специалист

    Сообщения:
    4.210
    Симпатии:
    1.449
    Для безвыходных нет модификатора!!! Модификатор не может "напрямую вносить изменения" как раньше, так как нужно соблюдать пространство имен.
     
    vrndorog нравится это.
  7. vrndorog

    vrndorog Пользователь

    Сообщения:
    36
    Симпатии:
    5
    Вы правы. Не всегда, но данная версия декларирует оба класса - и оригинальный, и модифицированный. Чем дальше в лес тем толще партизаны!
     
  8. World-Web

    World-Web Пользователь

    Сообщения:
    58
    Симпатии:
    11
    Выложить можете что выкладываете? Попробуем разобраться что не работает? Там есть кое какие изменения которые нужно учитывать при создании файлов модификаторов.
     
  9. Delovoy

    Delovoy Новичок

    Сообщения:
    4
    Симпатии:
    0
    Все делалось. Даже xml заведомо с ошибкой подсовывал, о чем получал сообщение в логах модификаторов - значит какая-то обработка идет (да, в /extension/ создается папка распакованного архива и в oc_extension_install делается запись). Но дальше этого никуда - oc_modification пустая и на сайте реакции нет.
    Уже сам в oc_modification -> xml руками xml записывал, указывая в extension_install_id ид-шник из oc_extension_install - никакой реакции на сайте.

    Это уже исправлено: install.json положен, рядом с ним рабочий на 3ке install.xml (он же install.ocmod.xml - без разницы, выше уже написал).

    install.json:
    {
    "name": "Название модуля",
    "version": "1.0.0",
    "description": "Работа модуля.",
    "author": "Company",
    "link": "http://www.company.pro"
    }

    install.xml:
    <?xml version="1.0" encoding="UTF-8"?>
    <modification>
    <name>Название модуля.</name>
    <version>1</version>
    <code>company_module_name</code>
    <author>Company</author>
    <link>http://www.company.pro</link>


    <file path="path">
    <operation error="skip">
    <search><![CDATA[search_data]]></search>
    <add position="replace"><![CDATA[
    changed_data

    ]]></add>
    </operation>
    </file>
    </modification>

    install.json и install.xml упаковываются в архив mod_name.ocmod.zip
    install.xml переименовывался в install.ocmod.xml - все безрезультатно.

    Подскажите какие и где про них посмотреть.
     
  10. World-Web

    World-Web Пользователь

    Сообщения:
    58
    Симпатии:
    11
    В файле install.xml:
    Замените строчку <name>Название модуля.</name> на <id>Название модуля.</id>
     
    Последнее редактирование: 12 сен 2025
  11. Delovoy

    Delovoy Новичок

    Сообщения:
    4
    Симпатии:
    0
    Не помогло. Папка архива распаковывается в /extension/module_name/*, в oc_extension_install делается запись, oc_modification пустая, в system/storage/ папки modification нет.
    В логах модификаторов ошибок нет.
    На этом все.
     
  12. World-Web

    World-Web Пользователь

    Сообщения:
    58
    Симпатии:
    11
    Какой VQMod используете?
    Попробуйте этот модуль.
     

    Вложения:

  13. vrndorog

    vrndorog Пользователь

    Сообщения:
    36
    Симпатии:
    5
    У Вас сейчас в архиве \storage\marketplace лежит Ваше расширение? В нем есть папка ocmod? В папке ocmod есть install.ocmod.xml? Отключите расширение на странице Установка расширений и включите вновь. Включите модификатор. Обновите модификаторыю Если все так, должно работать или получите ошикбку (Fatal error ...)
     
  14. World-Web

    World-Web Пользователь

    Сообщения:
    58
    Симпатии:
    11
    Пришлите полный архив что пытаетесь выгрузить. А то уже непонятно что конкретно хотите и что не получается.
     
  15. Ravilr

    Ravilr Специалист

    Сообщения:
    4.210
    Симпатии:
    1.449
    Вот простой пример. Изучайте :)
     

    Вложения:

  16. World-Web

    World-Web Пользователь

    Сообщения:
    58
    Симпатии:
    11
    А чего его изучать? Вот разбор. Рабочий вариант переделанный.
     

    Вложения:

  17. Ravilr

    Ravilr Специалист

    Сообщения:
    4.210
    Симпатии:
    1.449
    В смысле переделанный? :) Я дал рабочий вариант для изучения вопрошающему.
     
  18. World-Web

    World-Web Пользователь

    Сообщения:
    58
    Симпатии:
    11
    На Version 4.1.0.0 (rs.2) он не работает при установке.
     
  19. Ravilr

    Ravilr Специалист

    Сообщения:
    4.210
    Симпатии:
    1.449
    У меня работает. Возможно у Вас с вкумодом и не работает.
     
  20. World-Web

    World-Web Пользователь

    Сообщения:
    58
    Симпатии:
    11
    VQMod не работает с этим архивом. Работает с этим архивом что я скинул (исправленный).
    А вот что у пользователя не получается я так и не понял. Какие то махинации с файлами.