Перейти к содержанию
View in the app

A better way to browse. Learn more.

Русскоязычное сообщество Opencart

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Pascha

Разработчик
  • Зарегистрирован

  • Посещение

Весь контент Pascha

  1. значит интегрируйте код из мода напрямую в файлы Вашего шаблона...скорее всего мод не делает необходимых изменений в силу разницы искомых строк и их отсутствия в Вашем шаблоне
  2. Это расширение добавляет изображения продуктов в электронное письмо с подтверждением заказа. tik-product-photos-in-order-email-1-4.zip
  3. при размещении заказа владелец магазина получает то же электронное письмо, что и покупатель. opencart-copy-customer-order-confirmation-for-owner-master.zip tik-Copy-customer-order-confirmation-for-owner-1-2.zip tik-Copy-customer-order-confirmation-for-owner-1-0.zip
    Цель данного дополнения - привлечение внимания покупателей графиком изменения цены с течением времени. По типу "успей купить, пока подешевело" Формируется из настроек в карточке товара (если поля не заполнены - модуль не отображается) Все данные настраиваются по желанию. График рисуется автоматически согласно указанным ценам. Используются свои таблицы в БД. Устанавливается из админки посредством ocmod. Заполняемые поля поддерживают как цифровые значения, так и текстовые ( к примеру для указания не года, а месяца) . Возможно использовать и то и другое ( к примеру используется сначала год (число), а потом месяца (текст)) Дополнительно: 1. При наведении на период (год/месяц - отображается стоимость товара в данный период) 2. При наведении на "точку" на графике отображается временной период и стоимость) Особенности: Не рекомендуется использовать одновременно более 6-ти значений для более корректного отображения. Язык: Русский Спасибо за идею в создании дополнения Петра Ширшова. DEMO
    1,500.00 RUB
  4. Просмотр файла График изменения цены товара / Product price change schedule Цель данного дополнения - привлечение внимания покупателей графиком изменения цены с течением времени. По типу "успей купить, пока подешевело" Формируется из настроек в карточке товара (если поля не заполнены - модуль не отображается) Все данные настраиваются по желанию. График рисуется автоматически согласно указанным ценам. Используются свои таблицы в БД. Устанавливается из админки посредством ocmod. Дополнительно: 1. При наведении на период (год/месяц - отображается стоимость товара в данный период) 2. При наведении на "точку" на графике отображается временной период и стоимость) Особенности: Не рекомендуется использовать одновременно более 6-ти значений для более корректного отображения. Язык: Русский Спасибо за идею в создании дополнения Петра Ширшова. DEMO Добавил Pascha Добавлено 12.11.2022 Категория Цены, скидки, акции, подарки  
  5. Криптовалюты все больше и больше входят в нашу жизнь. И если еще пару лет назад многие воспринимали их как «пустышку», то сегодня уже начинают понимать перспективу. Многие магазины начинают принимать в качестве оплаты за свои услуги криптовалюту, в частности bitcoin. Я сегодня не буду рассматривать как добавить BTC в качестве валюты и как получать их курсы в автоматическом режиме. Сегодня речь пойдет как вывести рядом с основной ценой в категориях и в карточке товара цену в биткоинах. Доработки будем делать в контроллерах, добавив новую переменную. Для получения курса будем использовать сервис bitpay.com, в частности его API. Я не буду детально разбирать сам скрипт. Он ниже $url = "https://bitpay.com/api/rates"; $json = json_decode(file_get_contents($url)); $dollar = $btc = 0; foreach($json as $obj){ if ($obj->code=='USD') { $kursbtc = (1/$obj->rate)*$result['price']; $kursbtc = number_format($kursbtc, 8, ".", ""); } } Идем в /catalog/product/category.php и после строки $price = $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']); вставляем код, который я дал выше. Для цены со скидкой код будет чуть другим $url = "https://bitpay.com/api/rates"; $json = json_decode(file_get_contents($url)); $dollar = $btc = 0; foreach($json as $obj){ if ($obj->code=='USD') { $kursbtc_spec = (1/$obj->rate)*$result['special']; $kursbtc_spec = number_format($kursbtc_spec, 8, ".", ""); } } Далее после 'price' => $price, 'special' => $special, Добавляем 'kursbtc' => $kursbtc, 'kursbtc_spec' => $kursbtc_spec, По аналогии доработки делаются и для модулей Последние, Новинки, Рекомендуемые, Акционные В темплейте этих модулей в необходимом месте добавляем код вывода цены в bitcoin <?php echo $product['kursbtc']; ?> <?php echo $product['kursbtc_spec']; ?> Как вывести цену товара в BTC в карточке товара Теперь переходим к варточке товара. Опять идем в контроллер по адресу /catalog/product/product.php и после $data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']); добавляем код $url = "https://bitpay.com/api/rates"; $json = json_decode(file_get_contents($url)); $dollar = $btc = 0; foreach($json as $obj){ if ($obj->code=='USD') { $data['kursbtc'] = (1/$obj->rate)*$result['special']; $data['kursbtc'] = number_format($data['kursbtc'], 8, ".", ""); } } И так же по аналогии делаем доработку для товаров со скидкой $url = "https://bitpay.com/api/rates"; $json = json_decode(file_get_contents($url)); $dollar = $btc = 0; foreach($json as $obj){ if ($obj->code=='USD') { $data['kursbtc_spec'] = (1/$obj->rate)*$result['special']; $data['kursbtc_spec'] = number_format($data['kursbtc_spec'], 8, ".", ""); } } Теперь идем в темплейт карточки товара и в нужном месте выводим стоимость в биткоинах <?php echo $kursbtc; ?> <?php echo $kursbtc_spec; ?> Не забываем после всех этих изменений обновить или почистить кеш модификаторов. Если Все было сделано верно, то результат должен быть примерно такой:
  6. Предположим, вы продаете в своем интернет магазине какой то штучный товар, который покупается исключительно в единичном экземпляре. В таком случае для увеличения вероятности покупки, желательно снизить количество действий, которые надо выполнить пользователя для перехода на страницу оформления заказа. В идеале, сразу после добавления товара в корзину, отправлять покупателя на оформление. Сегодня я разберу два варианта, как это можно сделать: исправим существующую кнопку добавления в корзину и добавим отдельно кнопку для быстрой покупки (Важно! Для товаров, у которых есть опции, данное решение в текущем виде не подойдет, так как перед этим необходимо вывести выбор опций в товары в категориях) Переход на страницу оформления заказа по нажатию на стандартную кнопку «Купить» Изменения будут вноситься в файле common.js (рассматривается на примере стандартного шаблона) для категорий, модулей, поиска и т.д. и в темплейте карточки товара (непосредственно для товара) Открываем файл /catalog/view/javascript/common.js Находим примерно на строке 140 функцию добавления в корзину 'add': function(product_id, quantity) { Здесь необходимо заменить поведение при нажатии на кнопку, а именно строчку $('html, body').animate({ scrollTop: 0 }, 'slow'); меняем на window.location.href = '/index.php?route=checkout/checkout'; Если у Вас установлен модуль упрощенного оформления заказа Simple, то код будет немного отличаться window.location.href = '/index.php?route=checkout/simplecheckout'; Сохраняем и обновляем кеш модификаторов. Теперь на страницах категорий, поиска, производителей и модулей при добавлении товара в корзину будет автоматический редирект на страницу оформления заказа. Чтобы это работало и в карточке товара, открываем темплейт по адресу /catalog/view/theme/default/template/product/product.tpl И примерно на 459 строке $('html, body').animate({ scrollTop: 0 }, 'slow'); меняем на window.location.href = '/index.php?route=checkout/checkout'; Если у Вас установлен модуль упрощенного оформления заказа Simple, то код будет немного отличаться window.location.href = '/index.php?route=checkout/simplecheckout'; Так же не забываем обновлять модификаторы. Добавляем новую кнопку перехода на страницу оформления заказа при покупке Здесь помимо изменений в файле скриптов, будут вноситься изменения и в темплейты Прежде всего добавим новую функцию в /catalog/view/javascript/common.js А именно после функции 'add': function(product_id, quantity) { после 176 строки добавляем 'addnew': function(product_id, quantity) { $.ajax({ url: 'index.php?route=checkout/cart/add', type: 'post', data: 'product_id=' + product_id + '&quantity=' + (typeof(quantity) != 'undefined' ? quantity : 1), dataType: 'json', beforeSend: function() { $('#cart > button').button('loading'); }, complete: function() { $('#cart > button').button('reset'); }, success: function(json) { $('.alert, .text-danger').remove(); if (json['redirect']) { location = json['redirect']; } if (json['success']) { $('#content').parent().before('<div class="alert alert-success"><i class="fa fa-check-circle"></i> ' + json['success'] + ' <button type="button" class="close" data-dismiss="alert">&times;</button></div>'); // Need to set timeout otherwise it wont update the total setTimeout(function () { $('#cart > button').html('<span id="cart-total">' + json['total'] + '</span>'); }, 100); window.location.href = '/index.php?route=checkout/checkout'; $('#cart > ul').load('index.php?route=common/cart/info ul li'); } }, error: function(xhr, ajaxOptions, thrownError) { alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); } }); }, На сколько можете видеть, мы добавили полную копию функции с незначительными изменениями. Далее идем в темплейты категорий, страницы поиска и т.д. и там добавляем новую кнопку. Рассмотрим на примере категорий /catalog/view/theme/default/template/product/category.tpl Находим примерно на строке 131 код <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" onclick="cart.addnew('<?php echo $product['product_id']; ?>', '<?php echo $product['minimum']; ?>');"><i class="fa fa-plane"></i> <span class="hidden-xs hidden-sm hidden-md"><?php echo $button_cart; ?></span></button> Сохраняем, обновляем модификаторы и проверяем. Если все сделали верно, то должно работать. Для модулей и других страниц дейтвия идентичны. Для карточки товара в /catalog/view/theme/default/template/product/product.tpl также добавляем новую функцию на строке 470 после стандартной функции добавления в корзину <script type="text/javascript"><!-- $('#button-cartnew').on('click', function() { $.ajax({ url: 'index.php?route=checkout/cart/add', type: 'post', data: $('#product input[type=\'text\'], #product input[type=\'hidden\'], #product input[type=\'radio\']:checked, #product input[type=\'checkbox\']:checked, #product select, #product textarea'), dataType: 'json', beforeSend: function() { $('#button-cart').button('loading'); }, complete: function() { $('#button-cart').button('reset'); }, success: function(json) { $('.alert, .text-danger').remove(); $('.form-group').removeClass('has-error'); if (json['error']) { if (json['error']['option']) { for (i in json['error']['option']) { var element = $('#input-option' + i.replace('_', '-')); if (element.parent().hasClass('input-group')) { element.parent().after('<div class="text-danger">' + json['error']['option'][i] + '</div>'); } else { element.after('<div class="text-danger">' + json['error']['option'][i] + '</div>'); } } } if (json['error']['recurring']) { $('select[name=\'recurring_id\']').after('<div class="text-danger">' + json['error']['recurring'] + '</div>'); } // Highlight any found errors $('.text-danger').parent().addClass('has-error'); } if (json['success']) { $('.breadcrumb').after('<div class="alert alert-success">' + json['success'] + '<button type="button" class="close" data-dismiss="alert">&times;</button></div>'); $('#cart > button').html('<span id="cart-total"><i class="fa fa-shopping-cart"></i> ' + json['total'] + '</span>'); window.location.href = '/index.php?route=checkout/checkout'; $('#cart > ul').load('index.php?route=common/cart/info ul li'); } }, error: function(xhr, ajaxOptions, thrownError) { alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); } }); }); //--></script> Ну и после этого добавляем новую кнопку. Примерно на строке 296 после или перед <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> Добавляем новую кнопку <button type="button" id="button-cartnew" data-loading-text="<?php echo $text_loading; ?>" class="btn btn-primary btn-lg btn-block"><i class="fa fa-plane"></i></button> Так же сохраняем, обновляем модификаторы и радуемся результату.
  7. Не редко в интернет магазине бывает такая ситуация, когда указать актуальную цену невозможно. Например, товар идет только под заказ или цена на товар меняется довольно часто. У таких товаров цену обычно ставят нулевой и указывают что товар может быть только под заказ. Для клиента цена в ниже нуля выглядит не особо красиво и в ряде случаев может привести к тому, что потенциальный клиент просто уйдет от Вас. Лучшим решением данной проблемы будет вывод «заглушки», т.е. какой то надписи, например «Уточняйте цену». В идеале конечно делать интерактивное окно запроса уточнения цены, однако это не тема сегодняшней статьи. Изменения необходимо будет делать в языковых файлах, контроллерах и темплейтах модулей, категорий, странице поиска, странице производителя, списке акционных товаров и непосредственно в карточке товара. Я рассмотрю на примере категорий и карточки товара. Остальные страницы делаются по аналогии с категориями. Заменяем нулевую цену в категориях опенкарт на «Уточнить цену» Прежде всего открываем контроллер категорий. В нем добавим языковую переменную, так как в случае мультиязычного магазина прописывать текст в темплейте не верно. catalog/controller/product/category.php после $data['text_limit'] = $this->language->get('text_limit'); Добавим $data['text_nullpprice'] = $this->language->get('text_nullpprice'); Тут же добавим новую переменную, чтобы определять «чистую» цену. Находим $price = $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']); И под ней добавляем $pricenull = $result['price']; Далее ищем 'price' => $price, и сразу за нм добавляем 'pricenull' => $pricenull, Теперь добавим переменную в языковой файлах catalog/language/ru-ru/product/category.php $_['text_limit'] = 'Показывать:'; Добавляем $_['text_nullpprice'] = 'Уточняйте цену'; Если в вашем магазине несколько языков, сделайте изменения в каждом из них с соответствующим переводом После переходим непосредственно к темплейту категорий по адресу catalog/view/theme/default/template/product/category.tpl(category.twig) Находим примерно на 108 строке конструкцию <?php if (!$product['special']) { ?> <?php echo $product['price']; ?> <?php } else { ?> и меняем ее на <?php if (!$product['special']) { ?> <?php if (product['pricenull'] > '0') { ?> <?php echo product['price']; ?> <?php } else { ?> <?php echo $text_nullpprice; ?> <?php } ?> <?php } else { ?> Для версии опенкарт 3.х Находим первое вхождение {{ product.price }} И меняем на {% if (product.pricenull > '0') %} {{ product.price }} {% else %} {{ product.text_nullpprice }} {% endif %} Заметьте, изменения делаем только для основной цены, так как нулевая цена не предусматривает скидок, это логично. Сохраняем, обновляем модификаторы и если все сделано верно, то у товаров с нулевой ценой будет выведен текст, который Вы указали в языковом файле. Для модулей и типовых страниц, таких как поиск, производители порядок действий будет идентичным. Заменяем нулевую цену в карточке опенкарт на «Уточнить цену» Как и в случае с категориями, переходим в контроллер catalog/controller/product/product.php и добавляем языковую переменную. После $data['text_loading'] = $this->language->get('text_loading'); Добавляем $data['text_nullpprice'] = $this->language->get('text_nullpprice'); Тут же находим $data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']); И снизу добавляем $data['pricenull'] = $product_info['price']; Далее ищем $price = $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']); И так же снизу добавляем $pricenull = $product_info['price']; И дальше ищем 'price' => $price, и ниже добавляем 'pricenull' => $pricenull, С контроллером закончили. Теперь необходимо ее прописать в языковом файле товара по адресу catalog/language/ru-ru/product/product.php После $_['text_year'] = 'год'; Добавляем $_['text_nullpprice'] = 'Уточняйте цену'; Для других языков делаем то же самое. Далее можно переходить к темплейту карточки товара catalog/view/theme/default/template/product/product.tpl(product.twig) Здесь изменения будем делать как для самого товара, так и для рекомендуемых товаров. Находим <?php if (!$special) { ?> <li> <h2><?php echo $price; ?></h2> </li> <?php } else { ?> И меняем на <?php if (!$special) { ?> <li> <h2><?php if (pricenull > '0') { ?><?php echo $price; ?><?php } else { ?><?php echo $text_nullpprice; ?><?php } ?></h2> </li> <?php } else { ?> Для версии 3.х Находим {% if not special %} <li> <h2>{{ price }}</h2> </li> {% else %} Меняем на {% if not special %} <li> <h2>{% if (pricenull > '0') %}{{ price }}{% else %}{{ text_nullpprice }}{% endif %} </h2> </li> {% else %} Теперь добавим доработку для рекомендуемых. Находим <?php if (!$product['special']) { ?> <?php echo $product['price']; ?> <?php } else { ?> И меняем на <?php if (!$product['special']) { ?> <?php if (product['pricenull'] > '0') { ?> <?php echo product['price']; ?> <?php } else { ?> <?php echo $text_nullpprice; ?> <?php } ?> <?php } else { ?> Для версии опенкарт 3.х Находим первое вхождение {{ product.price }} И меняем на {% if (product.pricenull > '0') %} {{ product.price }} {% else %} {{ product.text_nullpprice }} {% endif %} Сохраняем, обновляем модификаторы и проверяем результат. Если все сделано верно, вместо нулевой цены будет написано «Уточняйте цены».
  8. Думаю все в курсе, что в опенкарт можно задавать скидочные цены. При чем их можно задавать для разных групп покупателей. Обычно скидочная цена задается в зависимости от количества товара. Выводятся эти цены обычно под основной ценой в виде таблицы А знали ли вы, что если скидка задается при покупке от одной единицы покупки, то именно скидочная цена будет отображена вместо основной цены? Сегодня сделаем реализацию вывода розничной и оптовой цены для магазина, который помимо розничной торговли, занимается оптовой. Т.е. на сайте есть группа покупателей Оптовики. Все дело в том, что если для оптовых покупателей указать скидочную цену от 1 единицы товара, то будет выводиться только скидочная цена, и оптовик не будет видеть сколько он экономит, по сравнению с розничным покупателем. Сложного ничего нет и работа займет не больше пяти минут. Доработка делается только для карточки товара. Если Вам необходимо сделать подобную реализацию для категорий, страницы поиска, модулей, то делается это по аналогии. Прежде всего переходим в модель товара /catalog/model/catalog/product.php Примерно на 33 строке после 'price' => ($query->row['discount'] ? $query->row['discount'] : $query->row['price']), Добавляем 'standart_price' => $query->row['price'], Сохраняем и переходим к контроллеру по адресу /catalog/controller/product/product.php и после строки $data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax'))); нам необходимо добавить основную цену. Назовем ее standart_price. Вывод стандартной цены будет выглядеть так $data['standart_price'] = $this->currency->format($this->tax->calculate($product_info['standart_price'], $product_info['tax_class_id'], $this->config->get('config_tax'))); Однако это не все. Так как шаблон карточки товара для всех групп пользователей один, то необходимо задать условие, при котором мы будем или не будем отдавать стандартную цену. Так как если этого не сделать, то в карточке товара для оптового покупателя все будет работать правильно, а вот для розничного будет выводиться две одинаковые цены на с разным названием) В итоге добавляемая конструкция будет выглядеть так if ($product_info['standart_price']==$product_info['price']) { $data['standart_price'] = false; } else { $data['standart_price'] = $this->currency->format($this->tax->calculate($product_info['standart_price'], $product_info['tax_class_id'], $this->config->get('config_tax'))); } Сохраняем и переходим к визуальной части, а именно к изменению шаблона карточки товара по адресу /catalog/view/theme/default/template/product/product.tpl Перед <?php if ($tax) { ?> Добавляем <?php if ($standart_price) { ?> <li> <h2>Розничная цена: <?php echo $standart_price; ?></h2> </li> <?php } ?> Такая конструкция верна для магазина с одним языком. Если же у Вас мультиязычный магазин, тогда вместо «Розничная цена:» необходимо добавить языковую переменную, прописать ее в контроллере, а в языковых файлах прописать значение. Сохраняем все изменения, обновляем модификаторы и если все сделано верно, то Вы должны увидеть что то такое
  9. Модификаторы в OpenCart - это разновидность модулей, позволяющих вносить изменения в функционал или внешний вид, при этом не затрагивая оригинальные файлы. Таким образом обеспечивается неизменность файлов самого opencart-а, но при этом мы можем менять или добавлять функционал. В этой статье я расскажу как создать свой модификатор для OpenCart и какие есть возможности у модификаторов. Изначально, история появления модификаторов началась с vQmod в версии 1.5 opencart-а, а затем его усовершенствовали и преобразовали в OCMOD, который стал постоянным стандартным функционалом OpenCart-а начиная с 2.1 версии. Итак, попробую дать определение понятию модификатор в OpenCart. Модификатор в OpenCart - это модуль представляющий собой XML-файл, содержащий набор инструкций о том в каких оригинальных файлах OpenCart-а, в каких местах, какой код нужно заменить, добавить или удалить. OpenCart при выполнении инструкций xml-файла создает копии исходных файлов в специальную директорию (кэш модификаторов) и вносит изменения в этих копиях. В результате, при работе сайта используются измененные файлы, а не оригиналы. Модификатор OCMOD может быть как самостоятельным модулем, изменяющим или дополняющим стандартный функционал, так и входить в состав полноценного модуля с дополнительными php, twig и другими файлами. О написании полного модуля читайте в предыдущей статье. Имена файлов и директории Имя файла модификатора - должно быть задано в соответствии с шаблоном <имя_файла>.ocmod.xml , где вместо <имя_файла> вы пишите свое название. Таким образом имя файла всегда должно заканчиваться ".ocmod.xml", иначе система не "увидит" модификатор и проигнорирует его. Исключение: когда предполагается использовать модификатор в составе полного модуля в виде архива - в этом случае имя файла-модификатора в архиве должно быть install.xml. Расположение файла модификатора - папка system в корне сайта. Файл-модификатор так же можно загрузить в базу данных на постоянное размещение с помощью загрузки расширений. Тем не менее, во время разработки удобнее записать файл в system и редактировать его там, проверяя какой получается результат, а когда разработка завершена, модификатор загружают как модуль в базу данных. Расположение кэша модификаторов - папка /storage/modification с такой же структурой, как корень сайта. Т.е. если вы сделали модификатор для файла /admin/controller/catalog/product.php то его измененная копия будет находится в /storage/modification/admin/controller/catalog/product.php. В нем вы и увидите те изменения которые производит ваш модификатор. Расположение логов - папка /storage/logs В ней есть 2 основных лог-фала: ocmod.log - который показывает как обрабатывались файлы-модификаторы, в какой последовательности и как выполнялись инструкции и лог-файл error.log - который содержит ошибки, произошедшие при преобразовании. Обновление кэша модификаторов Для того, чтобы система увидела файлы-модификаторы и выполнила их инструкции, необходимо нажать кнопку "Обновить" на странице модификаторы. Бывают ситуации, когда кэш обновили, а изменений на сайте так и не увидели. Обычно это связано с тем, что на сайте используются дополнительные модули кэширования или ускорители загрузки и т.п., в которых вероятно, тоже необходимо сделать обновление кэша. Синтаксис модификатора OCMOD Файл модификатора OCMOD должен содержать общую описательную часть и инструкции по изменению файлов. Начну разбор синтаксиса с простого примера, который добавляет слово "Test" в шапке администраторского раздела: <?xml version="1.0" encoding="utf-8"?> <modification> <name>Test</name> <!-- Название модификатора --> <code>Test</code> <!-- Уникальный код модификатора --> <version>1.0</version> <!-- Версия --> <author>Test</author> <!-- Автор --> <link>http://www.test.ru</link> <!-- Сайт разработчика --> <file path="admin/view/template/common/header.twig"> <!-- Какой файл будет модифицироваться --> <operation> <search> <!-- Найти код в файле --> <![CDATA[ <div class="container-fluid"> ]]> </search> <add position="after"> <!-- Добавление модификации (после найденного кода) --> <![CDATA[ <p>Тест</p> ]]> </add> </operation> </file> </modification> Итак, данный пример модификатора меняет файл header.twig. Он находит строчку <div class="container-fluid"> и после нее добавляет <p>Тест</p> В одном xml-файле может быть любое количество секций <file> и соответственно, мы можем менять множество файлов одним модификатором. Разберем каждый тег модификатора и его возможности поподробнее. File Указывает в каком файле или файлах нужно внести изменения. Обязательный атрибут path содержит путь до изменяемого файла. Может указывать на один файл или на несколько. Для указания нескольких файлов используется символ "|". Например, внести изменения в action.php и в loader.php <file path="system/engine/action.php|system/engine/loader.php"> Для сокращения кода можно использовать фигурные скобки, которые позволяют указать несколько значений через запятую: <file path="system/engine/{action,loader}.php"> Так же можно использовать символы "*" и "?", чтобы указать путь по "маске". Часто бывает полезно для модификации файлов-шаблонов. <file path="catalog/view/theme/*/template/product/product.twig"> Т.к. мы не знаем заранее, какие именно темы установлены в OpenCart, мы указали "*" после "theme" и тогда будут модифицироваться все product.twig во всех темах. Operation Указывает начало секции производимой модификации. Внутри File секций <operation> может быть несколько. Т.е мы можем делать сразу несколько изменений в одном файле. Тег Operation может иметь необязательный атрибут error, который может принимать значения: skip - в случае ошибки пропустить текущую секцию <operation> и перейти к следующей <operation> log (по-умолчанию) - в случае ошибки пропустить всю секцию <file> и перейти к следующему <file> abort - в случае ошибки прервать все модификации в xml-файле Например, найти в файле header.twig текст "navbar-rightnav" и если его нет, тогда пропустить и перейти к следующей операции и найти "navbar-right": <file path="admin/view/template/common/header.twig"> <operation error="skip"> <search><![CDATA[ navbar-rightnav ]]></search> <add position="after"><![CDATA[ <li>Test1</li> ]]></add> </operation> <operation error="skip"> <search><![CDATA[ navbar-right ]]></search> <add position="after"><![CDATA[ <li>Test2</li> ]]></add> </operation> </file> Если не указывать атрибут error="skip", тогда на первом поиске текста "navbar-rightnav" вся секция <file> была бы прервана и проигнорирована. Search Указывает какой текст необходимо найти в текущей операции. Есть несколько правил использования тега: Тег Search может быть использован только 1 раз внутри секции Operation. Поиск можно делать только 1 строки целиком или части строки (нельзя искать несколько строк одновременно). Искомый текст необходимо размещать между <![CDATA[ и ]]>. Пробелы и переносы строки до искомого текста и после искомого текста игнорируются (поэтому искомый текст можно написать или сразу после CDATA или с новой строки после CDATA, как больше нравится), если только не указан атрибут trim="false" (описание ниже). Изменения выполняются над всеми найденными в файле строками (или частями строк), если только не указан атрибут index (описание ниже). Специальные теги <![CDATA[ и ]]> - используются в xml-файлах для указания любых символьных данных, что означает, что между ними может находиться какой угодно текст, содержащий скобки, значи больше, меньше и другие, в т.ч. и php-код, html-код и т.д. Для более точного определения места внесения изменений в теге Search могут использоваться атрибуты: index - указывает в каком по-порядку найденном тексте сделать изменения. Т.е. если в файле искомый текст встречается несколько раз, тогда index позволяет указать номер найденного по порядку текста (0 - первый найденный текст, 1 - второй и т.д.) Можно так же указать несколько номеров через запятую. trim - указывает игнорировать (true) или нет (false) пробелы и переносы строк до и после искомого текста. regex - если установлено значении true, значит искомый текст представляет собой регулярное выражение для поиска. Пример: добавить пункт меню "ТЕСТ". <file path="admin/controller/common/column_left.php"> <operation> <search index="0" trim="true"><![CDATA[ $data['menus'][] = array( ]]></search> <add position="before"><![CDATA[ $data['menus'][] = array( 'id' => 'menu-test', 'icon' => 'fa-play', 'name' => 'TEST', 'href' => '#' ); ]]></add> </operation> </file> В данном примере находим первое "$data['menus'][] = array(" и перед ним добавляем свой код. Add Тег содержит текст, который будет добавлен до/после найденного или на который будет заменен найденный текст. Так же как и тег Search, должен содержать <![CDATA[ и ]]> между которыми пишется текст кода, который будет добавляться/заменяться. В теге Add могут использоваться атрибуты: position - может принимать значения: replace (по умолчанию) - замена найденного текста before - добавить текст перед найденным текстом after - добавить текст после найденного текста offset - означает смещение относительно найденного текста на указанное количество строк. Если position="before", тогда смещение будет вверх от найденного текста, если position="after" или position="replace", тогда смещение будет вниз от найденного текста. trim - указывает игнорировать (true) или нет (false) пробелы и переносы строк до и после искомого текста. Пример: Добавить слово "Test" в админ-панели в списке товаров. <file path="admin/view/template/catalog/product_list.twig"> <operation> <search index="1" trim="true"><![CDATA[ panel-body ]]></search> <add position="after" offset="1" trim="true"><![CDATA[ <p>Test</p> ]]></add> </operation> </file> Находим 2-й по порядку текст "panel-body" (первый - это фильтр справа от товаров, а второй - сам список товаров) и затем добавляем код "<p>Test</p>" на одну строку ниже найденного текста. Обратите внимание: position="before" и position="after" добавляют код не в середину строки, где было найдено "panel-body", а в следующую (или предыдущую) строку. Если нужно сделать добавление в середине строки, следует использовать position="replace" и повторив тот же самый найденный текст мы добавляем свой. Пример: Добавить текст перед версией opencart-а в футере <file path="admin/view/template/common/footer.twig"> <operation> <search><![CDATA[ {{ text_version }} ]]></search> <add position="replace" trim="true"><![CDATA[ <p>Test</p>{{ text_version }} ]]></add> </operation> </file> Создав модификатор OCMOD в OpenCart-е можно изменить практически всю систему, расширить ее возможности, при этом исходные файлы не будут затронуты и вы можете всё вернуть в первоначальный вид, просто убрав файл-модификатор (или отключив его, если он был загружен в базу данных).
  10. Стандартное исполнение интернет-магазина на движке OpenCart позволяет выполнить покупателю и продавцу выполнить элементарные вещи, это найти интересующий товар в каталоге, положить его в корзину, и оформить заказ. Иногда этого бывает вполне достаточно для функционирование простого магазина на OpentCart. Однако рано или поздно те или иные доработки интернет-магазина приведут к тому, что возникнет необходимость оперировать дополнительными данными в системе. Как мы знаем в администраторской части по умолчанию предусмотрено множество полей с различными данными, однако не все из них показываются в публичной части сайта, далее речь пойдет о данных в карточки товара. В этом посту рассмотрим простой пример, как можно вывести артикул в OpenCart на карточке товара. Артикул товара вы можете заметить в администраторской части, на форме редактирования товара. В публичной части его нет, да и не всегда он бывает нужен. Однако, когда возникнет потребность в его использовании, у вас есть возможность вывести его. Итак, если вы немного знакомы с тем как работает движок, у вас уже есть представление о контроллере, и виде. Данная концепция разделения кода и отображения (MVC) в целом используется в подавляющем большинстве движков, по этой причине если вам уже приходилось сталкиваться с подобным, вам будет проще. Первым делом, нужно добавить данные в контроллере, чтобы в последующем ими можно было воспользоваться в «виде» страницы. Откройте файл контроллера: catalog/controller/product/product.php Далее следует найти строку вида: $data['model'] = $product_info['model']; Добавьте перед этой строкой или после строку: $data['sku'] = $product_info['sku']; Передавая в массив данные с ключом sku в шаблоне отображения страницы, мы теперь получим переменную $sku, в которой собственно и будет находиться значение артикула. Таким образом, при надобности можно производить какие-либо манипуляции с данными, мы же просто выведем значение этой переменной в шаблоне активной темы. Откройте шаблон отображения страницы товара: catalog/view/theme/mytheme/template/product/product.tpl Далее найдите следующую строку кода: <li><?php echo $text_model; ?> <?php echo $model; ?></li> Добавляем вывод значения переменной $sku: <?php if($sku): ?> <li>Артикул: <?=$sku;?></li> <?php endif; ?> В примере мы название параметра «Артикул» прямо в самом шаблоне. Хорошим тоном является выводить данные значения в языковые файлы. Это избавить вас от лишней волокиты при переключении языков на сайте. Добавить значение в языковой файл не составляет большого труда, давайте это сделаем. Первым делом следует добавить значение в языковой файл, который располагается по следующему пути: catalog/language/язык_сайта Добавляем в начале или в конце строку: $_['text_sku'] = 'Vendor Code:'; // для анг. языка $_['text_sku'] = 'Артикул:'; // для русского языка Далее, как и говорилось ранее, чтобы воспользоваться значениями в самом шаблоне отображения, в контроллере следует добавить данные в массив: $data['text_sku'] = $this->language->get('text_sku'); Имя параметра будет взято в соответствии с текущим языком сайта. В свою очередь в шаблоне отображения следует вписать переменную $text_sku таким образом: <li><?= $text_sku; ?> <?=$sku;?></li> После сохранения изменений самое время проверить результаты правок. Если всё было верно, то в качестве значения в переменной $text_sku будет передано название параметра SKU на языке сайта, а в переменной $sku будет передано значение самого артикула.
  11. При проектировании сайтов довольно часто приходится использовать некоторые функции, которые могут вызываться из разных частей сайтов. Не редко такие функции так же могут переносится между проектами, с их модификацией либо без них. В связи с этим удобном способом их можно выносить в отдельный файл, после чего подключать данный файл в нужных участках веб-приложения. Здесь мы рассмотрим похожую ситуацию, где требуется разместить некие функции в OpentCart так, чтобы они были доступны во всём проекте. Для этого можно воспользоваться возможностью создания хелпера (helper), который собственно прекрасно справляется с этой задачей. Термин хелпер может быть вам знаком, т.к. часто используется в различных фреймворках. В OpenCart helper-ы размещаются в директории /system/helper. Для этого вам нужно создать файл, который в последующем вы будете подключать в скриптах. Добавим некую функцию для примера это будет функция token, которая будет генерировать некий случайные наборы символов. <?php function token($length = 32) { // Create token to login with $string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $token = ''; for ($i = 0; $i < $length; $i++) { $token .= $string[mt_rand(0, strlen($string) - 1)]; } return $token; } Далее есть два способа включения хелпера в проект. Первый подразумевает постоянное включение хелпера при загрузке приложения. Второй можно включать в отдельных участках кода, что в свою очередь более предпочтительно в вопросе производительности приложения, если хелпер содержит значительное количество кода. Подгружаем хелпер для всего проекта OpenCart Чтобы подгрузить хелпер для всего проекта, можно подключить файл непосредственно в загрузчике /system/startup добавив строку: require_once(DIR_SYSTEM . 'library/myhelper.php'); Файл myhelper.php в этом случае это ваш хелпер, который размещен в директории /library. После этого можно обращаться к функциям и классам, которые находятся в этом файле. Включение хелпера в отдельных скриптах OpenCart Если хелпер содержит значимый в вопросах производительности код, и не на всех частях сайта используется, то рекомендуется подключать хелпер используя встроенный загрузчик OpenCart. В этом случае ваш хелпер следует разместить в директории /system/helper. В коде подключение хелпера будет выполняться таким образом: $this->load->helper('helper_name'); В качестве значения helper_name следует указать имя файла без расширения php, т.к. сам движок будет дописывать этот суффикс при загрузке. Обращение к функции следует выполнять напрямую, без использования переменной экземпляра класса $this. $this->load->helper('myhelper'); token(); В результате выполнения данного кода, будет подключен файл хелпера, который находится в файле /system/helper/myhelper.php, где объявлена функция token(), после чего будет произведено обращение к этой функции.
  12. Перед тем как приступить к самому примеру, давайте разберемся что представляет из себя опция товара в системе OpenCart 2.x. Каждый товар в интернет магазине может иметь набор определённых свойств и характеристик. Ярким примером такой разновидности может быть цвет, размер, и другие параметры, которые так же могут характеризовать какую-либо разновидность товара. В каталоге, таким образом, отображается карточка товара, с возможностью выбора параметров для покупателя. В корзину товар попадает именно в таком виде, каким его выбрал пользователь. По умолчанию в стандартных шаблонах карточка товара этот функционал уже содержит, и производить манипуляции с кодом добавления товара в корзину как правило не возникает. Но как только вы отходите от стандартного функционала шаблонов, возникает необходимость находить решения различного рода задач. Итак, товар в корзину добавляется через ajax посредством функции cart.add. Если посмотреть на код ajax-запроса, то мы можем заметить участок кода похожий на этот: $.ajax({ url: 'index.php?route=checkout/cart/add', type: 'post', data: 'product_id=' + product_id + '&quantity=' + (typeof(quantity) != 'undefined' ? quantity : 1), ... В параметре data как раз и передаются все основные данные о товаре для POST-запроса. Всё что следует сделать для передачи опции товара, немного видоизменить передачу параметров, создав отдельный объект JS. var productData = { 'product_id' : PRODUCT_IDS.CARD, 'quantity': 1, 'option': { '229': "Some option value" } }; Как вы можете заметить в параметре запроса появилось значение option. Передавая это значение, в корзину попадает указанный товар, с обозначенной опцией. В остальном передача данных происходит аналогичным образом. $.ajax({ url: 'index.php?route=checkout/cart/add', type: 'post', data: $.param(productData), dataType: 'json', success: function (json) { }, error: function (xhr, ajaxOptions, thrownError) { } }); На стороне сервера в php-скрипте параметр option по умолчанию обрабатывается такой строкой: if (isset($this->request->post['option'])) { $option = array_filter($this->request->post['option']); } else { $option = array(); } Изменять на стороне php-скрипта в этом случае ничего не нужно, код показан для информации. Администраторы сайта добавляют товары, а также опции товаров и их ценовое значение. После того как покупатель кладёт товар в корзину, цена так же будет пересчитываться в зависимости от выбранной им опции. Ценовая сетка так же предварительно проставляется при добавлении значений опций. Т.е. каждое значение опции может определять ценообразование товара.
  13. OpenCart как одна из популярных систем управления интернет-магазинами содержит в базовом наборе функционал налогообложения товаров. В большей части данный функционал широко используется европе и западных странах, где принято указывать так же налог на приобретаемый товар. Давайте рассмотрим возможность использования данного функционала в вашем интернет-магазине. Всё что будет рассказываться далее, реализовано в базовом шаблоне OpenCart, мы поговорим о том, как это работает и как это настраивается. Итак, цены у товаров в каталоге могут отображаться вместе с налогами и отдельно от налогов. Эта опция может использоваться, когда есть необходимость показывать налог для покупателей отдельно от стоимости товара. Отключение показа цен с налогами Отключается эта опция в настройках магазина, параметр «Display prices with tax». Admin > System > Settings > Store > Options Админ > Система > Настройки > Магазин > Настройки Геозоны для налогов Налоговые ставки в OpenCart могут разделяться по геозонам. Это применяется для магазинов, где есть необходимость разделения налогов в зависимости от локации покупателя. Если нет необходимости делить по геозонам, то вам достаточно создать одну запись которая послужит общей для всех налоговых ставок. Admin -> System -> Localization -> Geozones Админ -> Система -> Локализация -> Геозоны Добавление ставки налога Теперь можно добавить налоговую ставку, с указанием типа наложения налога, к примеру, самое популярное — в виде процентов. В свою очередь налоговая ставка привязывается к геозоне, поле Geo Zone. Admin > System > Localisation > Taxes Админ > Система > Локализация > Налоги Добавление класса налога Далее следует создать класс налогов. Налоговый класс подразумевает привязку налоговых ставок к местоположениям указываемым покупателем. В данном случае это Shipping Address – адрес доставки. Админ > Система > Локализация > Налоги Admin > System > Localization > Taxes Указываем класс налога в товаре После того как налоги настроены, в самом товаре так же следует указать класс налога, который будет применяться при покупке товара пользователем. Catalog > Products > [Product] > Data Каталог > Товары > [Товар] > Данные Как правило, создаются один или несколько классов налога, которые в последующем указываются во всех товарах в пределах каталога. С первого взгляда, механизм работы налогообложения товара может показаться сложным, но стоит один раз понять, как это работает, то всё это довольно просто.
  14. Практически на каждом сайте так или иначе может использоваться код написанный на JavaScript. Задачи, выполняемые кодом, написанным на JavaScript абсолютно разные. В первую очередь это конечно связано с работой интерфейса сайта. Если один и тот же код используется на разных страницах, то его как правило выводят в отдельный файл. Преимуществ отдельного подключения скриптов достаточно. Разделение верстки и самого кода так же позволяет удобно работать с данными, динамически подключая их на нужных страницах сайта. В данном посту мы поговорим о том, как можно подключить свои скрипты в системе OpenCart. Как и в большинстве движков, в OpenCart заложено разделение исполняемого кода от самого шаблона отображения. Шаблоны сайта лежат в отдельной отведенной для этого директории. И вопрос стоит в том, каким же образом можно подключать свои скрипты в этих шаблонах. Подключение скриптов непосредственно в шаблоне OpenCart Пожалуй, первое и самое элементарное это подключение скриптов непосредственно в самих файлах шаблона. Шаблон заголовка страницы мы можем найти по пути: /catalog/view/theme/default/template/common/header.tpl Мы можем прописать подключение без использования дополнительных обращений к программной части на сервере. Прописав в заголовке страницы код подключения скрипта JavaScript всё будет работать обычным образом: Стоит сказать, что это один из простых вариантов подключения. Скрипт в этом случае будет подключаться на всех страницах где показывается данный шаблон. Однако потребность в подключения скриптов на каждой страницы может быть не везде. Динамическое подключение скриптов в OpenCart Довольно часто требуется подключать скрипты в отдельных случаях, вместо того чтобы показывать их на всех страницах. Особенно если скрипты довольно увесистые, и могут занимать некоторое время при загрузке страницы. Конечно же для этих случаев в OpenCart предусмотрена возможность динамического подключения скриптов к шаблонам сайта. Подключать их можно непосредственно в самих контроллерах нужного класса. Чтобы сделать аналогичное подключение, описанное выше, только через контролёр, необходимо в файле: /catalog/controller/common/header.php Прописать запись вида: $this->document->addScript('catalog/view/javascript/bootstrap/js/bootstrap.min.js '); Таким образом, чтобы подключить в нужных разделах сайта отдельные скрипты, мы можем делать это посредством записи в классах котроллера отдельных разделов. Выводятся данные в шаблоне посредством такого кода в заголовке: <?php foreach ($scripts as $script) { ?> <script src="/<?php echo $script; ?>" type="text/javascript"></script> <?php } ?> Динамическое подключение скриптов в произвольных блоках шаблона Подключение скриптов иногда требуется выполнять к примеру, не в самом заголовке странице, а в нижней части сайта. Особенно это часто рекомендуют делать различные сервисы по оптимизации скорости загрузки страниц сайта. По этой причине возникает необходимость подключения скриптов в «подвале» сайта. Этот момент разработчики OpenCart тоже учли, и возможность такого подключения своих скриптов так же присутствует. Функцию подключения скриптов в OpenCart выполняет библиотека Document, которая располагается тут: /system/library/document.phpsystem/library/document.php Изучив код библиотеки можно заметить, что у метода addScript так же может быть использован второй аргумент — position. В качестве значения по умолчанию для этого аргумента присвоено – header. Вы, наверное, уже догадались, этот параметр может определять назначение подключаемого файла для конкретных участков разметки. И для того чтобы подключить наш файл JavaScript в footer, достаточно при подключении добавить второй параметр: $this->document->addScript('catalog/view/javascript/bootstrap/js/bootstrap.min.js','footer'); Для вывода в контроллере footer-а должен присутствовать код получения скриптов в таком виде: $data['scripts'] = $this->document->getScripts('footer'); Данные шаблону с контролёра передаются в виде массива. И уже в шаблоне данными массив прописывает строки подключения скриптов посредством цикла foreach. Как подключить CSS-файл в OpenCart? Как мы знаем для работы сайтов также используются CSS-файлы стилей. По аналогии со скриптами, подключать файлы стилей мы можем на отдельных страницах сайта. Про то как прописать непосредственно в шаблоне статическую запись мы пропустим. Давайте лучше подключим CSS-файл правильным образом, и позже я поясню почему. Чтобы подключить CSS-файл, в классе контроллера прописать код такого вида: $this->document->addStyle('catalog/view/javascript/slick/slick.css'); Вместо addScript мы указываем addStyle, это означает что выводиться они так же будет в шаблоне, посредством такого кода: <?php foreach ($styles as $style) { ?> <link href="/<?php echo $style['href']; ?>" type="text/css" rel="<?php echo $style['rel']; ?>" media="<?php echo $style['media']; ?>" /> <?php } ?> Подключать файлы стилей рекомендуется именно посредством использования функционала библиотеки Document. Это связано с тем, что перед тем как отдаваться в браузер сам OpenCart так же может выполнять оптимизацию и сжатие файлов. К тому же, если проект довольно масштабный, код стилевого оформления может занимать значительные размеры. Разделяя страницы по разным типам, достаточно будет подключать нужный стиль, для нужной страницы. Такой метод положительно влияет на скорости отрисовки страницы в браузере.
  15. Подавляющее большинство интернет-магазинов так или иначе оперируют данными количества товара на сайте. Учёт остатков товара позволяет контролировать физическое наличие товара, и в случае необходимости обрабатывать заказы в нужном порядке. В системе OpenCart уже с коробки заложен механизм учёта остатков. Вы можете отслеживать изменение количества остатков товара в каталоге, и при необходимости ограничивать возможность заказа товаров, которых уже нет. Это бывает особенно важно, когда учёт количества доступных товаров ведётся непосредственно на сайте. Однако бывают ситуации, когда учёт остатков не имеет большой значимости для ведения интернет-магазина. К примеру, если в вашем каталоге могут быть товары в электронном виде, услуги, либо просто товары, заказывать которые могут покупатели в неограниченном количестве. По умолчанию, при заказе в каталоге на OpenCart ведется вычитание остатков товара. При достижении лимита остатка, пользователь не сможет выполнять заказы, а администратор сайта будет видеть товары с недостающим количеством. Отключить учёт остатка товаров при оформлении заказа можно в администраторской части сайта. Таким образом, покупатель сможет заказывать неограниченное количество товаров на сайте. Что касается администраторской части сайта, то учёт количества товаров так же будет вестись. При достижении количества товаров равным меньше единицы, учёт будет вестись уже в минусовую сторону. На работу интернет магазина в этом случае это никак не будет влиять, и будет носить чисто информационный характер. Вы можете отключить показ остатков товара на сайте. Это позволит пользователям интернет-магазина заказывать товары при нулевом остатке. Отключается контроль остатков в настройках интернет магазина. Для этого вам следует перейти в раздел: Для англоязычной версии System > Settings > { edit — править нужный} > вкладка «Option» > Пункт «Stock» Для версии на русском Система > Настройки > { править нужный } > вкладка «Опции» > Пункт «Склад» В моём примере используется версия OpenCart 2.3 на английском языке, поэтому немного поясню. Тут есть три ключевых параметра «Display Stock» – определяет, будут ли показываться остатки товаров в карточке товара. Второй параметр «Show Out Of Stock Warning» — параметр который указывает на то, что будет ли показываться уведомление в корзине, если количество товаров недостаточно для заказа. Третий параметр «Stock Checkout» — по сути основной параметр, который и определяет будет ли учитываться остаток при заказе или нет. Если будет учитываться остаток, то заказ товаров недостающий по остатку будет невозможен. Собственно, это всё что касается остатков товара на складах.
  16. Практический каждый более или менее наполненный товарами интернет-магазин использует некоторые критерии сортировки товаров на сайте. В одном интернет магазине это может быть показ по дате добавления, в другом же это сортировка по популярности того или иного продукта. Сортировка товаров в интернет магазине позволяет выставлять элементы в нужном порядке. Это позволяет существенно оптимизировать реализацию товаров на витрине и конечно же вопрос релевантности никто ещё не отменял. Понятие релевантности в сети интернет сегодня уже используется довольно широко, начиная от поисковых систем, заканчивая сайтом с новостной лентой. И это хорошо работает, когда популярные записи всегда стремятся в топ, а менее просматриваемые уходят в низ по списку. Однако в одних случаях это работает в автоматическом режиме, в других выставляется вручную. В обеих случаях есть свои преимущества и недостатки. В данной заметке мы поговорим про сортировку товаров в OpenCart. Поле «Порядок сортировки» в OpenCart В движке OpenCart как и во многих других движках существует поле, обозначаемое как «Порядок сортировки» товара. При редактировании карточки товара, мы можем видеть такое поле (у меня версия OpenCart 2.3 на анг. языке): Как уже ясно из самого названия, оно используется для выставления значения позиции в каталоге для конкретного товара. Таким образом, в каталоге товары могут быть выстроены в нужном порядке вручную. При сортировке товаров по этому полю, выборка элементов происходит посредством указанной в запросе ORDER BY sort_order. Запрос в базу как правило производится из самого модуля. Сортировку товаров в OpenCart по умолчанию мы можем выставлять различным образом, и далее речь пойдёт об этом. Как поменять сортировку товаров в OpenCart по умолчанию Существуют множество полей, по которым мы может выполнять сортировку товаров в каталоге. Некоторые системы позволяют настраивать подобные вещи непосредственно в администраторской части сайта. В OpenCart это делается программно, т.к. всё же нет постоянной необходимости менять поле, по которому будут сортироваться товары в каталоге. Как уже говорилось выше, запрос в базу данных выполняется из самого модуля. Однако порядок выборки товаров мы может задавать через контроллер. По этой причине нет необходимости лезть в код модуля, куда целесообразнее это сделать через контроллер. Контроллер, который участвует в выводе товаров категории в OpenCart располагается по такому пути: /catalog/controller/product/category.php Открыв данный файл, следует найти запись такого вида: if (isset($this->request->get['sort'])) { $sort = $this->request->get['sort']; } else { $sort = 'p.sort_order'; } В общем запись которая находится в условии else обозначает значение по умолчанию. Таким образом, переменная $sort определяет имя поля по умолчанию, которое будет использовано для сортировки товаров. Поменяв имя поля на другое, мы можем изменить поле, по которому будет сортироваться товары в категории. Существуют некоторое множество полей, по которому мы можем сортировать товары в каталоге. Далее поговорим об этих полях. Поля доступные для сортировки в OpenCart Есть несколько ключевых полей в базе данных, по которым целесообразно выполнять сортировку товаров: ‘pd.name’, — Наименование товара; ‘p.model’, — Поле, обозначающеии модель товара; ‘p.quantity‘, — Поле, обозначающее остаток товара на сайте; ‘p.price’, — Поле с ценой товара; ‘rating’, — Поле с рейтингом товара; ‘p.sort_order’, — Отдельное поле для ручной сортировки; ‘p.date_added’ — Поле с датой добавления товара; Для примера, если мы хотим поменять сортировку товаров в каталоге по дате добавления, нам следует в переменной $sort выставить значение p.date_added. Кроме того, существуют так же возможность указания направления сортировки (ASC или DESC). Для этого используется переменная $order, которая может содержать два значения: ASC – сортировка по возрастанию; DESC – порядок сортировки по убыванию. В большинстве случаем, изменения этих двух параметров бывает достаточно. После внесения изменений в скрипт не забывает почистить кэш, перед тем как проверить работу скрипта.
  17. OpenCart является одним из популярных движков на которых можно за короткое время развернуть полноценный интернет магазин. Современный интернет-магазин сложно представить без функции отправки почтовых сообщений. Почтовые сообщения позволяют получать различные уведомления как владельцам сайта, так и покупателям. В свою очередь побуждая их к проявлению нужной активности и не только. В данном посту мы рассмотрим пример отправки почтовых сообщений через свои скрипты. В системе OpenCart существует базовый набор самых необходимых почтовых уведомлений. Эти почтовые уведомления как правило прописаны в самих модулях. В некоторых ситуациях бывает необходимо сделать самостоятельную отправку письма. Рассмотрим простой пример, как можно отправить своё почтовое сообщение на какой-либо адрес в OpenCart 2.3. Параметры подключения к почтовому серверу Разделить процесс отправки для наглядности можно на два этапа. Первый – мы задаем основные настройки подключения к самому серверу почты. // создаём объект класса Mail $mail = new Mail(); // почтовый протокол $mail->protocol = $this->config->get('config_mail_protocol'); // доп параметр $mail->parameter = $this->config->get('config_mail_parameter'); // хост почтового сервера $mail->smtp_hostname = $this->config->get('config_mail_smtp_hostname'); // аккаунт на почте $mail->smtp_username = $this->config->get('config_mail_smtp_username'); // пароль на почте $mail->smtp_password = html_entity_decode($this->config->get('config_mail_smtp_password'), ENT_QUOTES, 'UTF-8'); // порт $mail->smtp_port = $this->config->get('config_mail_smtp_port'); // лимиты времени отправки $mail->smtp_timeout = $this->config->get('config_mail_smtp_timeout'); Настройка полей письма Практически все параметры типичны для всех почтовых серверов. Если вам приходилось до этого настраивать почту, то думаю с ними вам будет и так всё понятно. Кроме того, большинство параметров берутся из настроек самого сайта и менять в этом случае нет необходимости. Второй этап – формирования самого почтового сообщения: // Email-адрес получателя письма $mail->setTo($order_info['email']); // email-отправителя $mail->setFrom($this->config->get('config_email')); // имя отправителя $mail->setSender(html_entity_decode($order_info['store_name'], ENT_QUOTES, 'UTF-8')); // тема письма $mail->setSubject(html_entity_decode($subject, ENT_QUOTES, 'UTF-8')); // почтовый шаблон (подключается вид mail/order) $mail->setHtml($this->load->view('mail/order', $data)); // текст сообщения $mail->setText($text); // отправка $mail->send(); Как можно заметить из кода, большинство параметров достаются из самих настроек сайта, посредством метода $this->config->get(). В большинстве случаев менять параметры подключения в данном коде не нужно. Т.к. если они прописаны в настройках сайта, они так же будут использованы и в этом коде. Получается вам предстоит лишь настроить лишь поля, которые заданы на втором этапе (указать получателя, тему, и само сообщение). После того как все параметры заданы, инициализация отправки происходит посредством использования метода send(). Данный метод выполнит попытку подключения к почтовому серверу, после чего отправит само письмо. Таким образом вы можете отправлять произвольные письма из кода контроллеров и модулей. Если письма не уходят, то стоит обратить внимание на почтовые настройки самого сайта. Убедиться в том, что почта настроена верно, и другие стандартные письма отправляются исправно. Довольно часто бывает так что требуется обратиться в самому хостеру, чтобы они вам помогли с настройками почтового сервера, со своей стороны. Это делается в том случае, когда почта вся настроена, но письма все-равно не уходят по причине политики безопасности сервера.
  18. В базовом наборе в системе OpenCart есть некоторый набор статусов заказа. В зависимости от конкретного этапа выполнения заказа, он может принимать один из этих статусов. Просмотреть и настроить статусы заказов вы можете в администраторской части сайта. Просмотреть статусы заказов можно по такому пути: System > Localisation > Order Statuses Система > Локализация > Статусы заказа В моём примере используется OpenCart версии 2.3, в других версиях пути могут отличаться, поэтому это стоит так же учитывать. У самих товаров статусы так же выставляются в администраторской части сайта, при просмотре и редактировании полей заказа. Не всегда бывает удобно менять статусы заказов в ручном режиме. Часто бывает необходимость смены статуса заказа программно, по какому-либо событию. В данной заметке мы рассмотрим простой пример смены статуса заказа из контроллера. class ControllerCheckoutPayengine extends Controller { public function index() { // подключаем модель checkout/order $this->load->model('checkout/order'); // меняем статус заказа на Processing (т.е. статус с ID == 2) $this->model_checkout_order->addOrderHistory($order_id, 2); } } Название метода, и самого класса контролера в вашем случае может отличаться, всё что нужно знать для смены статуса, это ID заказа, а также ID нужного статуса. Предварительно следует подключить класс модели checkout/order, после чего посредством метода класса addOrderHistory() задать новый статус заказа. Метод addOrderHistory() в нашем примере принимает два основных параметра $order_id – номер заказа и $order_status_id – ID статуса заказа. Скрипт класса расположен по такому пути: \catalog\model\checkout\order.php Рассмотрев содержимое файла, можно заметить, что есть дополнительные параметры при обращении к методу addOrderHistory(). Полный список аргументов выглядит таким образом: addOrderHistory($order_id, $order_status_id, $comment = '', $notify = false, $override = false) Значение этих параметров: $oder_id – ID заказа; $order_status_id – ID статуса заказа; $comment – текст почтового сообщения; $notify – по умолчанию false, позволяет отправлять пользователю уведомления о смене статуса; $override – по ум. false, флаг защиты от переопределения статуса (насколько я правильно понял). Таким образом используя данный метод в контролерах и моделях можно задавать нужные статусы для заказов. Довольно часто это бывает необходимо при реализации интеграции с платёжными системами. В тот момент, когда клиент производит оплату заказа онлайн, и сервис возвращает данные об успешной транзакции. Кстати в сети была найдена интересная особенность доработки параметра $comment метода addOrderHistory(). По умолчанию данные из этой переменной принимаются и отправляются в виде plain-text. Если мы захотим отправить письмо в виде HTML текст, то соответственно письмо уйдет как листинг HTML. Однако преобразовав спец символы в HTML-сущности, мы можем реализовать отправку письма в виде HTML. Для этого достаточно в самом начале метода добавить строку: $comment = html_entity_decode($comment); После этого в самом письме мы можем наблюдать отображение письма в HTML. Этот момент не совсем относится к теме данного поста, но всё же я решил его затронуть, т.к. речь идет об использовании параметров метода addOrderHistory().
  19. При работе с CMS OpenCart владелец сайта рано или поздно сталкивается с необходимостью установки модуля на сайт. Модули позволяют дополнять и расширять функционал сайта, и возможности их довольно обширны. В данном посту мы поговорим о том, как можно установить модуль на OpenCart версии 2.x. Установить модуль в OpenCart можно двумя распространёнными способами, посредством загрузчика в администраторской части сайта, и вручную, посредством файлового менеджера. Два этих метода мы рассмотрим далее. Установка модуля OpenCart через админку Данный способ является более предпочтительным, т.к. более вероятно, что при установке вы не допустите ошибок, т.к. манипуляции с файлами происходят автоматически. Для загрузки модуля посредством администраторской части перейдите в раздел: Дополнения > Установка дополнений Обратите внимание на то, что в разных версиях перевода системы название раздела может быть другим, к примеру «Расширения» или «Модули». Далее следует выбрать файл модуля. Выберите архив с модулем, и нажмите на кнопку «загрузить». Модуль может быть собран в zip-архиве, либо идти одним xml-файлом. Модуль в zip-архиве Модуль в zip-архиве должен быть с именем название_модуля.ocmod.zip. Если вы отроете либо распакуете архив, то в нём в первую очередь вы должны заметить папку upload. Данная папка является обязательной. В этой папке находятся файлы по директориям, которые должны будут перенесены при установке на проект. Кроме того, в корне архива могут быть файлы модификаций: install.xml – файл, в котором содержаться данные для модификации ocmod; install.php – файл, который запуститься в процессе установки; install.sql – файл, для миграции базы данных, как правило может быть использован для создания таблиц, и данных в базе. Данные файлы приведены к сведению, и не являются обязательными, по этой причине некоторых из них, а может и всех в архиве может и не быть. Всё зависит от того, требуется ли выполнять какие-либо модификации через эти файлы при установке модуля или нет. После установки модуля так же следует перейти в раздел «Модификации», и в правом верхнем углу нажать на кнопку «Обновить модификации». После этого модуль можно считать установленным, естественно если в процессе ошибок не возникало. Модуль в XML-файле Модуль так же может поставляться в одном XML-файле, который может содержать данные для модификации, и иметь название имя_модуля.ocmod.xml. Устанавливается он так же через админ-часть, и после его установки следует перейти в раздел модификации и выполнить команду «Обновить модификации». Стоит заметить, что при установке модуля довольно часто может возникать ошибка с подключением к FTP. В этом случае рекомендуется установить localcopy.ocmod.xml, который должен установиться без возникновения ошибок. После этого следует выполнить обновление модификаций, и устанавливать новые модули. Модуль localcopy.ocmod.xml является модификацией, который исправляет ошибку «FTP должен быть включён в настройках», и позволяет правильно ставить модули. Скачать его вы можете в сети. Установка модулей OpenCart вручную Этот способ подходит для модулей, которые содержат лишь папку upload, и основная задача — это просто перенести файлы на сервер посредством файлового менеджера. Файловая структура в папке upload наследуется от корня сайта, поэтому при копировании с заменой все папки на сервере остаются на месте, и лишь загружаются файлы модулей. С файлами модификации если они присутствуют придётся немного разобраться, т.к. там указываются изменения, которые нужно внести в существующие файлы проекта. Если у вас нет ни малейшего навыка программирования, то лезть править исполняемые файлы проекта я не рекомендую. После копирования файлов, в администраторской части следует активировать модуль, и настроить его в случае необходимости. localcopy.ocmod.xml
  20. OpenCart как и многие другие CMS умеет кэшировать данные сайта. Механизмы кэширования позволяют оптимизировать производительность системы в целом, и ускорить процесс обработки запросов посетителей сайта. В данном посту мы поговорим про кэширование в OpenCart 2.x. В OpenCart существует целое множество различных механизмов кэширования. Про различные типы кэша мы поговорим далее. Как сбросить системный кэш в OpenCart Системный кэш в большей степени используется для хранения результатов запроса в базу данных. Разработчики могут использовать системный кэш для хранения данных, которые меняются очень редко. К примеру, данные о языке сайта, списки локаций, товаров, и др., всё зависит от того как реализует это разработчик. Данные кэша хранятся в файлах, в папке относительно корня сайта: system/cache Для сброса системного кэша достаточно очистить содержимое папки. Как сбросить кэш изображений в OpenCart Для ускорения работы сайта в OpenCart так же выполняется кэширование изображений товаров и дополнений. Иногда может возникнуть ситуация, что проект может занимать внушительные объёмы памяти на диске. Для исправления ситуации может потребоваться сбросить кэш изображений на сайте. Хранятся кэшированные изображения относительно корня сайта в папке: /image/cache Для сброса кэша изображений достаточно очистить содержимое этой папки. Как сбросить кэш vQmod vQmod – одно из самых популярных расширений OpenCart, с помощью которого можно вносить изменения в файлы проекта, не редактируя напрямую файлы ядра. Эта система перезаписи, основная идея в том, что при необходимости внесений изменений в файлы ядра, нет необходимости правки самих исходных файлов. Вместо этого создаются отдельные xml-файлы, которые содержат данные для модификации исходных файлов. Таким образом, исходные файлы остаются неизменными, а сама модификация происходит на лету, при запросе страниц сайтов. Модифицированный файл после этого размещается в отдельную папку, после этого при повторном запросе будет вызван именно файл модификации. При внесении изменений в исходные файлы, может возникнуть необходимость обновления файлов модификации, чтобы изменения вступили в силу. Решается этот вопрос отчисткой папки с файлами, где хранятся модификаторы. Делается это следующим образом, в папке /vqmod относительно корня сайта следует удалить mods.cache файл, так же после этого следует очистить содержимое каталога /cache. После очистки папки vQmod создаст новую копию файлов, уже с обновлёнными данными. Как сбросить кэш OCMod Данное решение идёт уже встроенным в систему OpenCart, начиная со 2-версии. По сути своей работы он довольно похож на тот же vQmod, однако есть свои особенности. Основное отличие его в том, что данные о модификациях OCmod хранит в базе данных. Однако кэш модификации хранится в файлах, что так же подтверждает схожесть с vQmod. Сбросить кэш OCMod можно путём отчистки содержимого папки, которая расположена относительно корня сайта: /system/modification В более поздних версиях OpenCart для удобства сброса кэша OCMod в администраторской части сайта появилась кнопка «Очистить», расположена она в разделе: Дополнения > Модификации По нажатию кнопки очистки модификации, файлы будут создаваться по новой, уже с обновлёнными данными. Модули для очистки кэша в OpenCart Как вы поняли различных механизмов кэширования достаточно в системе. Управлять всеми ими было бы удобно централизовано. Т.к. возиться с каждым модулем по отдельности как никак отнимает некоторое время. Для этих целей удобно обзавестись решением, которое позволит автоматизировать процесс очистки кэша для всех типов. Один из популярных таких модулей это ACCleaner (Auto Cache Cleaner), у которого название говорит само за себя. Данный модуль полностью автоматизирует процесс сброса файлов кэша, посредством администраторской части сайта. Работать с файлами кэша особенно часто придётся на этапе разработки сайта. Связано это с тем, что данные проекта интенсивно меняются, и необходимо постоянно выполнять процедуру сброса кэша.
  21. https://weblenti.com/en/service/converter/phptotwig
  22. Банальная ситуация с необходимостью восстановления пароля администратора довольно популярна. О том, как это случается, мы говорить не будем, а рассмотрим ситуацию, когда нет возможности доступа в админ часть для смены пароля. В данном примере мы рассматриваем восстановление пароля посредством утилиты phpMyAdmin. А это значит, что у вас должен быть доступ к самой базе данных, например, посредством панели управления сайтом. Если у вас локальный сервер, то здесь уже гораздо проще. Приступим к сбросу пароля пользователя OpenCart. 1. Перейдите в phpMyAdmin; 2. Откройте базу данных сайта; 3. В списке таблиц БД необходимо найти таблицу oc_user; 4. Находим пользователя в списке, можно по полю username (логин); 5. Открываем нужную запись, нажав на ссылку «изменить»; 6. На форме редактирования в списке выбора функции выбираем «MD5», и вводим сам пароль; 7. Сохраняем запись, пробуем авторизоваться в админке. Подобным образом можно сменить пароль для любого пользователя в OpenCart.
  23. После установки SSL-ключа на сайте, возникает необходимость перенаправления URL-адреса с http на https. Как правило, на самом хостинге довольно часто встречается функционал, который позволяет выполнить редирект за защищённый протокол. Однако в случае с OpenCart, в настройках так же придётся выполнить кое-какие манипуляции. Далее мы поговорим о переводе сайта OpenCart 2.x на работу по https протоколу. Первый шаг — это правка конфигурационных файлов сайта. Файл /config.php присутствует в OpenCart в двух папках. Первый в корне сайта, второй в папке /admin. Таким образом, править будет необходимо два файла: /config.php /admin/config.php В том, что находится в корне сайта, исправляем значение константы HTTPS_SERVER. Указываем протокол https вместо http: // HTTPS define('HTTPS_SERVER', 'https://yoursite.loc/'); Подобно этому, вносим правки в конфигурационный файл /admin/config.php: // HTTPS define('HTTPS_SERVER', 'https://yoursite.loc/admin/'); define('HTTPS_CATALOG', 'https://yoursite.loc/'); Сохраняем изменения в файлах. После этого, в администраторской части сайта так же следует включить использование SSL. Для этого переходим в раздел настроек сервера: Система > Настройки > Сервер В зависимости от того как переведена ваша версия OpenCart названия кнопок могут быть немного другими. В этом моменте вам придётся интуитивно перейти в указанный раздел. Далее находим параметры безопасности, и активируем использование SSL: После того как вы изменили настройки, в правом верхнем углу находится кнопка для сохранения изменений. После этих операций, ваш OpenCart считается настроенным для работы по https протоколу. Если у нас нет возможности сделать перенаправление с http на https в панели управления хостингом, то реализовать это можно так же посредством файла .htaccess. Для того чтобы сайт всегда открывался через https прописываем в файле .htaccess следующую запись: RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] Затем, при обращении на URL-адрес сайта с использованием протокола http, сервер будет перенаправлять тот же адрес, изменив при этом протокол с http на https. На этом моменте и остановимся, это то, что и требовалось получить.
  24. Множество популярных фреймворков используют шаблон проектирования MVC, и OpenCart не стал исключением. Концепция MVC широко используется в современном веб-программировании, и популярность её в первую очередь в том, что этот шаблон проектирования прост для понимания, и решает довольно распространённые проблемы с разработкой архитектуры проекта. Для тех, кто не знает, MVC представляет из себя архитектуру вида Модель—Представление—Контроллёр. В модели содержатся все основные данные приложения, касательно запросов к базе данных, основной логики, и методов работы. Контролёры в свою очередь являются промежуточным звеном между моделью и представлением, и осуществляют выполнение программы обращаясь к модели и передавая результат в представление. Представление в свою очередь является шаблоном разметки страницы, куда поступают уже готовые данные для вывода на странице. В OpenCart мы можем обращаться к различным моделям, предварительно подгрузив их в контроллере. Загрузка модели в контроллере Существует правило обращения к моделям. Все модели публичной части сайта на OpenCart располагаются в папке /catalog/model. $this->load->model('catalog/information'); Так к примеру, загружая модель, мы подключаем файл information.php из директории /catalog/model/catalog. Модель представляет из себя класс PHP, который именуется особым образом, и может содержать некий набор методов. Мы можем обращаться к этим методам из контролёра, таким образом: $prodList = $this->model_catalog_information->getProdList(); Таким образом, в переменную $prodList попадает массив данных, с которым мы может работать в пределах скрипта контролёра. Передача данных в представление Передать данные представлению мы можем посредством $this->data, предварительно задав название ключа для объекта. $this->data['production'] = $this->model_catalog_information->getProdList(); В представлении эти данные будут доступны в переменной $production. Представление как правило уже содержит разметку HTML, где остаётся сделать вывод данных из переменной. Стоит обратить внимание на то, что посредством объекта $this->data передаются все переменные в файл представления. На практике количество переменных в представлении может быть целое множество.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.