В последнее время всё чаще встречаются вопросы: что такое OCMOD? или как работает OCMOD? Попробуем разобраться, а заодно небольшая инструкция о том, как адаптировать модуль "Упрощенный заказ для Opencart 2" под Ваш шаблон.
OCMOD - принцип работы
OCMOD - это такой программный комплекс, который позволяет изменять (дополнять) интернет-магазин на OpenCart не изменяя и не перезаписывая исходные файлы интернет-магазина. Да! Изменять, не изменяя! 🙂 Если OCMOD дополнение создано правильно, то при его удалении просто восстанавливается предыдущее состояние интернет-магазина. Красота!!!
После установки, файл OCMOD-модификатора создает временный файл в папке system/storage/modification/ который и используется движком Opencart. Эти файлы обновляются каждый раз, когда Вы нажимаете кнопку "Обновить" в "Менеджере дополнений" административной части.
Обратите внимание: если Вы вносите изменения непосредственно в файлы, расположенные в папке system/storage/modification/ Вы потеряете все изменения сразу же после нажатия кнопки! Эти файлы можно использовать для проверки работоспособности вносимых изменений, но затем все изменения должны быть перенесены в OCMOD файл!
Установка OCMOD
OCMOD идёт в стандартной поставке OpenCart 2.x и его не требуется устанавливать! Ветка на github находится здесь.
Из чего состоит OCMOD модификатор
OCMOD модификатор может состоять из одного файла с расширением xml (как пример - local copy ocmod). В этом случае на сервер ничего кроме него не загружается, а только выполняются инструкции из этого файла. Есть обязательное правило для имени такого файла: расширение файла должно быть .ocmod.xml К примеру у модификатора local copy - это файл localcopy.ocmod.xml
Если помимо инструкций нам необходимо загрузить на сервер дополнительные файлы (допустим файлы модуля), тогда файл должен представлять из себя zip-архив с расширением .ocmod.zip (как пример - мой модуль "Упрощенный заказ для Opencart 2"). При этом структура архива тоже должна подчиняться определенным правилам:
- папка upload, которая содержит все загружаемые на сервер файлы в соответствии со структурой папок OpenCart
- файл install.xml, который содержит инструкции для модифицирования исходных файлов интернет-магазина.
Помимо этого, OCMOD модификатор может содержать необходимые SQL- и PHP-инструкции, но в этой статье мы их рассматривать не будем.
Ошибка в Установщике дополнений OCMOD - неверный тип файла
Один из способов установки zip-архива дополнения OCMOD - распаковать файл у себя на компьютере, залить через ftp или через панель хостинга содержимое папки uplod на сервер, а затем через установщик дополнений установить xml-файл. Однако, если Вы попытаетесь загрузить install.xml непосредственно в "Установщик дополнений OCMOD" - Вы получите ошибку "неверный тип файла". Как этого избежать? Легко - просто переименуйте файл в, например, buyoneclick.ocmod.xml то есть Вы должны устанавливать только файлы с расширением .ocmod.xml
Перейдём непосредственно к структуре OCMOD XML файла:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?xml version="1.0" encoding="utf-8"?> <modification> <code>9638944527</code> <name>Opencart - Быстрый заказ for OpenCart 2.0.x, 2.1.x</name> <version>3.0.1</version> <author>Domus159@gmail.com</author> <link>http://xdomus.ru/opencart/uproshhennyj-zakaz-dlya-opencart-2-besplatno/</link> <file path="catalog/controller/common/header.php"> <operation> <search> <![CDATA[ ... ]]> </search> <add position="after"> <![CDATA[ ... ]]> </add> </operation> </file> </modification> |
К обязательным элементам структуры OCMOD файла относятся:
- заголовок <?xml version="1.0" encoding="utf-8"?>
- <modification> </modification> - без параметров
- <code> </code> - содержит уникальный код (можете придумать любой, состоящий из цифр и латинских букв)
- <name> </name> - содержит имя модификатоора
- <version> </version> - версия модификатора
- <author> </author> - автор модификатора
Необязательные элементы:
- <link> </link> - ссылка на сайт автора или ещё куда-либо.
Далее идёт код, который отвечает за модификацию файлов:
- <file path="catalog/controller/common/header.php"> </file> - указывает путь к файлу, в котором необходимо сделать изменения. Если необходимо заменить / изменить одинаковый кусок кода можно использовать звёздочку (*), фигурные скобки и запятые:
- <file path="catalog/view/theme/*/template/product/product.tpl"> </file> (удобно использовать для замены во всех темах).
- <file path="catalog/controller/module/{bestseller.php,featured.php,latest.php,special.php}"> </file> (Обратите внимание: перечисление должно быть без пробелов!!!)
- <operation> </operation> - так как к одному и тому же файлу могут применяться разные операции, таких тегов может быть несколько в одном файле.
Тег <search> </search>
Далее идёт поиск вхождения: <search> </search>. Обратите внимание: поиск осуществляется по одной целой строке, если необходимо заменить более одной строки необходимо использовать либо атрибут regex для тега <search> </search>, либо атрибут offset для тега <add> </add>.
Здесь остановимся подробнее применительно к модулю "Упрощенный заказ для Opencart 2". Часто мне задают вопрос: как адаптировать модуль под какую-либо тему. Вот здесь и кроется ответ на этот вопрос! <search> </search> осуществляет поиск вхождения какой-либо части кода. Вот часть кода из файла install.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<file path="catalog/view/theme/*/template/product/product.tpl"> <operation> <search> <![CDATA[ <button type="button" id="button-cart" data-loading-text="<?php echo $text_loading; ?>" class="btn btn-primary btn-lg btn-block"><?php echo $button_cart; ?></button> ]]> </search> <add position="after"> <![CDATA[ <?php if ($buyoneclick_status) { ?> <br /> <button type="button" data-loading-text="<?php echo $text_loading; ?>" class="btn btn-primary btn-lg btn-block boc_order_btn" <?php if ($buyoneclick_ya_status || $buyoneclick_google_status) { ?> onClick="clickAnalytic(); return true;" <?php } ?> data-toggle="modal" data-target="#boc_order" data-product="<?php echo $heading_title; ?>" data-product_id="<?php echo $product_id; ?>"><?php echo $buyoneclick_name; ?></button> <?php } ?> ]]> </add> </operation> </file> |
Данный код осуществляет поиск в файле catalog/view/theme/*/template/product/product.tpl части кода:
1 |
<button type="button" id="button-cart" data-loading-text="<?php echo $text_loading; ?>" class="btn btn-primary btn-lg btn-block"><?php echo $button_cart; ?></button> |
Это - код кнопки "в корзину" в файле карточки товара в стандартном шаблоне default.
В других шаблонах / темах этот код может отличаться и отличается в 99% случаев. К примеру, в шаблоне coloring код кнопки выглядит так:
1 2 3 4 5 |
<?php if (($product_quantity <= 0) and $disable_cart_button){ ?> <button type="button" id="button-cart" data-loading-text="<?php echo $text_loading; ?>" class="btn btn-block btn-default " disabled><?php echo $disable_cart_button_text; ?></button> <?php } else { ?> <button type="button" id="button-cart" data-loading-text="<?php echo $text_loading; ?>" class="btn btn-block btn-danger "><?php echo $button_cart; ?></button> <?php } ?> |
Именно поэтому модуль не может найти необходимое вхождение кода и кнопка "Купить в 1 клик" не появляется в ожидаемом месте.
Обратите внимание: в стандартном шаблоне (default) код кнопки "в корзину" занимал 1 строку, а в теме coloring - 5 строк! Нельзя их просто заменить, необходимо будет указать требуемый отступ, о котором чуть ниже.
Необязательный атрибут тега <search> </search>: index, который необходимо использовать если код, который Вы ищете, не уникальный в данном файле. Допустим, в том же файле product.tpl стандартного шаблона код <div class="row"> встречается 3 раза. Мы можем найти первое вхождение этого кода указав <search index="0"> </search>. Обратите внимание: первое вхождение имеет index="0", а не index="1".
Необязательный атрибут для тега <search> </search>: regex, который позволяет искать часть кода по регулярному выражению.
Опять же возвращаясь к модулю "Упрощенный заказ для Opencart 2" разберем вот такую часть кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<file path="catalog/view/theme/*/template/product/{category.tpl,manufacturer_info.tpl,search.tpl,special.tpl}"> <operation> <search regex="true"><![CDATA[ /<div class="button-group">(.*?)<\/div>/is ]]></search> <add position="after"><![CDATA[ <div class="button-group">$1</div> <?php if ($buyoneclick_status_category) { ?> <button type="button" class="btn-block boc_order_category_btn" <?php if ($buyoneclick_ya_status || $buyoneclick_google_status) { ?> onClick="clickAnalytic(); return true;" <?php } ?> data-toggle="modal" data-target="#boc_order" data-product="<?php echo $product['name'] ?>" data-product_id="<?php echo $product['product_id']; ?>"><?php echo $buyoneclick_name; ?></button> <?php } ?> ]]></add> </operation> </file> |
В данном случае, осуществляется поиск части кода, который содержится между <div class="button-group"> и </div>. Используются стандартные операторы регулярных выражений. Таким образом, в стандартном шаблоне будет найдена вот эта часть кода в файле category.tpl:
1 2 3 4 5 |
<div class="button-group"> <button type="button" onclick="cart.add('<?php echo $product['product_id']; ?>', '<?php echo $product['minimum']; ?>');"><i class="fa fa-shopping-cart"></i> <span class="hidden-xs hidden-sm hidden-md"><?php echo $button_cart; ?></span></button> <button type="button" data-toggle="tooltip" title="<?php echo $button_wishlist; ?>" onclick="wishlist.add('<?php echo $product['product_id']; ?>');"><i class="fa fa-heart"></i></button> <button type="button" data-toggle="tooltip" title="<?php echo $button_compare; ?>" onclick="compare.add('<?php echo $product['product_id']; ?>');"><i class="fa fa-exchange"></i></button> </div> |
Я рекомендую пользоваться вот этим тестером регулярных выражений http://uvsoftium.ru/php/regexp.php.
Тег <add> </add>:
Как раз в нём указывается код, который будет добавлен в исходный файл. При этом у него есть важный и обязательный атрибут position, который может принимать значения:
- before - как видно из названия, добавляемый код будет вставлен до кода, найденного тегом <search> </search>
- after - как видно из названия, добавляемый код будет вставлен после кода, найденного тегом <search> </search>
- replace - как видно из названия, добавляемый код будет вставлен вместо кода, найденного тегом <search> </search>
Еще раз посмотрим на код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<file path="catalog/view/theme/*/template/product/product.tpl"> <operation> <search> <![CDATA[ <?php if (($product_quantity <= 0) and $disable_cart_button){ ?> <button type="button" id="button-cart" data-loading-text="<?php echo $text_loading; ?>" class="btn btn-block btn-default " disabled><?php echo $disable_cart_button_text; ?></button> <?php } else { ?> <button type="button" id="button-cart" data-loading-text="<?php echo $text_loading; ?>" class="btn btn-block btn-danger "><?php echo $button_cart; ?></button> <?php } ?> ]]> </search> <strong> <add position="after"> <![CDATA[ <?php if ($buyoneclick_status) { ?> <br /> <button type="button" data-loading-text="<?php echo $text_loading; ?>" class="btn btn-primary btn-lg btn-block boc_order_btn" <?php if ($buyoneclick_ya_status || $buyoneclick_google_status) { ?> onClick="clickAnalytic(); return true;" <?php } ?> data-toggle="modal" data-target="#boc_order" data-product="<?php echo $heading_title; ?>" data-product_id="<?php echo $product_id; ?>"><?php echo $buyoneclick_name; ?></button> <?php } ?> ]]> </add></strong> </operation> </file> |
Как видим: в данном случае код кнопки "купить в 1 клик" добавляется после (after) стандартной кнопки "в корзину".
Необязательный атрибут тега <add> </add>: offset, который позволяет сделать отступ от найденной части кода. Применительно к шаблону coloring, эта часть файла install.xml должна будет выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<file path="catalog/view/theme/coloring/template/product/product.tpl"> <operation> <search> <![CDATA[ <?php if (($product_quantity <= 0) and $disable_cart_button){ ?> ]]> </search> <add position="after" offset="4"> <![CDATA[ <?php if ($buyoneclick_status) { ?> <br /> <button type="button" data-loading-text="<?php echo $text_loading; ?>" class="btn btn-primary btn-lg btn-block boc_order_btn" <?php if ($buyoneclick_ya_status || $buyoneclick_google_status) { ?> onClick="clickAnalytic(); return true;" <?php } ?> data-toggle="modal" data-target="#boc_order" data-product="<?php echo $heading_title; ?>" data-product_id="<?php echo $product_id; ?>"><?php echo $buyoneclick_name; ?></button> <?php } ?> ]]> </add> </operation> </file> |
Говоря понятным языком: в файле темы coloring <file path="catalog/view/theme/coloring/template/product/product.tpl"> найти вхождение кода <?php if (($product_quantity <= 0) and $disable_cart_button){ ?> и, отступив 4 строки добавить код кнопки "купить в 1 клик".
UPDATE! Для Opencart 3.x
В Opencart 3x добавился редактор шаблонов (Theme Editor), позволяющий редактировать их файлы прямо из администраторской части.
Проблема в том, что при его использовании совершенно не учитываются изменения в файлах, вносимые через OCMOD. То есть если какой-то OCMOD модификатор меняет этот же файл шаблона - на выходе этих изменений не будет, несмотря на фактическую отработку OCMOD и наличие измененного файла в его кеше.
Рекомендую использовать следующий патч - Fix Theme Editor - патч редактора тем в Opencart 3x
Добрый день
OpenCart Version 3.0.3.2 (trs-3.0.2.0)
Тема Fanes
В карточке товара кнопка быстрый заказ есть а больше нигде нет
product.twig
часть кода
{{ entry_qty }}
-
+
{{ button_cart }}
{% if minimum > 1 %}
{{ text_minimum }}
{% endif %}
{% if review_status %}
{% for i in 1..5 %}
В чем состоит вопрос?
Здравствуйте. Установил модуль, внес правки под свою тему - кнопка появилась в карточке товара, но она не активна - после нажатия ничего не происходит. Пример:
https://dobro-stroy.dp.ua/ikopal-bitumnaya-cherepica-cambridge-xtreme-aged-redwood
Версия Версия ocStore 2.3.0.2 ставил версию модуля 4.0.3
В чем может быть проблема?
Видимо версия шаблона сильно отличается от дефолтной. Требуется адаптация
Здравствуйте. Установил модуль, все по инструкции, кнопка появилась но письма не отправляются. Шаблон дефолтный версия 3, файл использовал версия модуля 4.0.4
у Вас buyoneclick.js не прописался в header - проверьте почему
Как проверить?
и как прописать
зайдите в модифицированные файлы, посмотрите в catalog/view/theme/*/template/common/header.twig
там есть закрывающий head?
Возможно какой-то иной модификатор его удалил
Так а что здесь прописать
{{ title }}
{% if robots %}
{% endif %}
{% if description %}
{% endif %}
{% if keywords %}
{% endif %}
{% if og_image %}
{% else %}
{% endif %}
{% for style in styles %}
{% endfor %}
{% for script in scripts %}
{% endfor %}
{% for link in links %}
{% endfor %}
{% for analytic in analytics %}
{{ analytic }}
{% endfor %}
Нет не идет кодом..
есть закрывающий тег....
Как прописать js
Полный листинг МОДИФИЦИРОВАННОГО catalog/view/theme/*/template/common/header.twig покажите.
Модифицированные - которые в storage лежат.
а как вам его показать?
Ну там совсем другое прописано не как в главном хедере
отправьте сообщение через сайт
Отправил
ответил на почту
Спасибо большое за вашу помощь. Теперь все работает хорошо.
Здравствуйте!
Кнопка быстрого заказа везде появляется. Кликабельна. Но, ничего не происходит после клика
У вас какой-то из модификаторов изменил footer, в котором скрипт вызова окна должен быть. Попробуйте отключить модификаторы - всё должно заработать. Не забывайте обновлять.
Добрый день!
Такая же ситуация как и у Евгения
Кнопка быстрого заказа везде появляется. Кликабельна. Но, ничего не происходит после клика.
установлено немного модулей:
Auto Fill URL
Buy One Click for OpenCart 3.x
Export/Import Tool (V3.22) for OpenCart 3.x
Localcopy OCMOD Install Fix
Подскажите пожалуйста какой может мешать работе ?
Здравствуйте, Евгения!
Странно что кнопка не кликабельна. Тема дефолтная?
Если дефолтная - попробуйте установить Fix Theme Editor - https://opencartforum.com/files/file/5390-fix-theme-editor-patch-redaktora-tem-v-opencart-3x/
Подскажите, как добавить в форму быстрого заказа пару полей и кнопку?
Допустим это будет город и отделение службы доставки, которое я хочу подгружать аяксом по кнопке.
В настройках поля сильно ограничены. Как наименее безболезненно влезть ручками?
Спасибо
Добрый день, Сергей!
Вы хотите добавить город и отделение во всплывающую форму?
Добрый день!
Установила Fix Theme Editor, всё заработало!
Большое спасибо за помощь!
> Вы хотите добавить город и отделение во всплывающую форму?
Добрый день, XDomus
Да, Вы меня поняли правильно.
Возможно ли добавить свои поля для этой цели? Есть ли решение?
В форме быстрого заказа очень нужны эти поля.
Спасибо
Добрый вечер, Сергей!
Ну, к сожалению не всё так просто.
Как добавить, например, поле город. Город - это не просто поле, это некий select уже имеющихся городов, ведь при оформлении заказа стандартным способом нам не предоставляют пустое поле, в которое мы вписываем город, а дают сначала страну, потом регион и только потом город. При этом все эти поля - страна, регион, город - уже есть в базе данных и они зависимы друг для друга. К примеру нельзя выбрать страну Россия, а город Нью-Йорк. Следовательно чтобы выводить поле, а точнее select города в форме нам придётся предварительно подгружать их из нашей базы. Значит нам нужна будет функция в контроллере которая это делает и лишь потом выводит поле "город".
С полем отделения связи всё ещё хуже... Если некие отделения связи внесены в модуль доставки, тогда нам надо будет получать их оттуда, а значит нам опять же понадобится контроллер обработчик.
Конечно же всё решаемо, но это не тот вариант, который можно описать в комментариях...
Здравствуйте, XDomus.
Кнопку настроил пока для карточки товара.
Всё установилось и работает на ОС3, однако, после клика по кнопке "Заказать" система генерирует два одинаковых по содержанию заказа с разными номерами.
Подскажите, пожалуйста, в каком направлении копать?
Спасибо.
С уважением.
Судя по всему у вас продублировался js код что и вызывает дважды создание заказа. Проверьте через инспектор кода.
Благодарю за скорый ответ.
Проверю.
Будьте здоровы!
Доброго дня, XDomus.
Точно - переборщил с копированием js при интеграции с шаблоном.
Вопрос: а можно Ваш модуль привязать к кнопкам "Оформить заказ" в корзинах (+миникорзина в шапке)?
Спасибо большое!
Привязать сейчас нет... Поддерживается только 1 товар. В дальнейшем планирую сделать поддержку товаров из корзины.
Где можно подписаться на рассылку по новым версиям Ваших разработок?
Только здесь проверять...
Здравствуйте, XDomus.
А сколько денег будет стоить настройка Вашего модуля с привязкой к кнопкам "Оформить заказ" в корзинах (+миникорзина в шапке) для одного конкретного сайта?
С уважением
Настройка / адаптация стоят от 500 руб. Мало вводных данных, надо смотреть Ваш интернет-магазин.
Добрый день, при нажатии кнопки Отправить, после ввода данных, пишет SENDING, ERROR, но заказ виден в панели, сообщение о заказе не появляется. Версия 4.0.4
Как исправить? Спасибо
Слишком мало вводных данных... напишите здесь подробнее - https://xdomus.ru/contact/
Здравствуйте, установил ваш модуль Версия 4.0.3. Установлено Шаблон Modern Aridius.
В карточке товара при нажатии "Отправить" в кнопке появляется надпись ERROR и Валидация номера телефона тоже не работает. Подскажите пожалуйста в чем может быть проблема?
Спасибо.
Прочитайте описание модуля - для шаблонов, отличных от дефолтного требуется адаптация.
Как адаптировать - есть статья на сайте.
Или платно могу я адаптировать.
Добрый день. Поставил модуль, все работает, только при включенной настройке "Валидация обязательных опций", если опция не выбрана, и нажата кнопка купить в 1 клик появляется прелоадер, который не исчезает, пока не кликнешь, или кнопку ентер не нажмешь, все остальное отрабатывает как нужно, ошибок никаких. Не подскажете, куда смотреть ?
уберите тогда прелоадер совсем, сделайте ему display:none
Заказ создается и видим в административной части, но на почту магазина не приходят уведомления о заказе. Как настроить ?
Спасибо.
Проверьте настройки уведомлений.
Ув. разработчик, установил я ваш модуль на Fanes opencart3 , всё классно был очень рад спасибо , Но через 1 день он тупо поломался, при нажатии ничего не происходит, сам ничего не где не менял, возможно вы в курсе что это может быть ?
просто так странно..((
Спасибо !
Как Вы, думаю, сами понимаете, само по себе ничего не ломается. Проверьте что Вы установили после этого.
скажите пожалуйста какие файлы он меняет ? спасибо
множество - product.twig, category.twig и т.д.
тогда скажите пожалуйста как более детально совсем начисто удалить модуль(возможно в ручную) , попробую его заново установить ,спасибо
все файлы модуля содержатся в архиве - их надо удалить из ваших папок.
плюс надо удалить модификатор
Вот я пробежался по всем папкам посмотрев в архиве модуля , после удаления этих файлов я нигде не обнаружил , и удалив даже модификатор в админке и почистив кеш , все равно в следующей установке автоматически настройка модуля сохранилась с прошлого раза, скажите пожалуйста как в ручную можно дочистить все следы этого дополнения , буду благодарен спасибо !
Настройки записываются в базу. Таблица oc_settings
Хотелось бы поменять цвет кнопки купить в 1 клик, меняться и стандартная кнопка (
.btn.boc_order_btn,.btn-block.boc_order_category_btn, {background-color:#456654;}
Здравствуйте. Установил настроил, подключил к своему шаблону. Все работает
КРОМЕ не подхватывает количества товара для покупки?
Куда копать подскажите.
в ocmod файле (который xml) есть такая строка:
data: $('#product input[type=\'text\'], #product input[type=\'hidden\'], #product input[type=\'radio\']:checked, #product input[type=\'checkbox\']:checked, #product select, #product textarea'),
она и подхватывает inputы в карточке товара.
Видимо у Вас вместо #product другой id у div
Здравствуйте еще раз.
На странице товара сделал чтобы подхватывал количество
на странице категорий так как товаров много и соответственно ID блока должно быть уникально
соответственно из блока с моим id ничего не попадает в скрипт.
как быть в таком случае?
Добавить к id каждого товара на странице свой id не проблема, а как передавать этот id в скрипт при клике?
а что со страницы категорий должно попадать, кроме id самого товара?
у меня в OCMOD сделано так: data-product_id=""
Количество товара же
на странице категории как правило нет ввода количества товара.
если же Вам хочется это сделать - для уникальности блока с товаром используйте product_id - он уникален для каждого товара
Так это и понятно а как передать значение в инпуте количества в скрипт?
в какую переменную скрипта передается количество?
quantity конечно же
Добрый день!
Модуль поставил, настроил, везде прописываются все модификаторы из install, посмотрел в кеше сайта. Но на сайте кнопка не выходит. Куда копать, что еще прописывать? Шаблон не дефолтный, basecart
Что можно предпринять если у Вас недефолтный шаблон?
Почитайте OCMOD инструкцию для разработчика. Принцип довольно простой, я уверен что каждый может разобраться.
Ещё вариант - написать мне, используя форму ниже. Обратите внимание: бесплатно я не занимаюсь доработками и настройками. Стоимость работ - от 500 руб.
https://xdomus.ru/opencart/ocmod-instruktsiya-dlya-razrabotchika/
Спасибо за ответ, проблема решилась, были ошибки в других модулях, исправил их и все заработало! Спасибо!
А есть возможность привязать туда поле количества покупаемых товаров? Кажется где-то видел ак это настраивали, не могу найти где.
пока нет, скоро будет