Перейти к содержанию
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.

admin

Администратор
  • Зарегистрирован

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

  1. Периодически проскакивают номера заказов и теряются заказы - узнаем причину и как это поправить. Очень часто ко мне обращаются мои клиенты с просьбой разобраться почему у них пропадают заказы. То есть клиенты звонят и говорят что заказ сделали но никто не перезванивает. И в админке номера заказов сбиваются. К примеру заказы были 13 434, 13 435 и следующий будет 13 437 то есть 13 436 пропал. Такая ситуация случается часто, причина этому - не назначение статуса заказа. Вылечить проблему можно следующим образом: Заходим в файл admin/model/sale/order.php Строку $sql .= " WHERE o.order_status_id > '0'"; Заменяем на: $sql .= " WHERE o.total"; Таким образом мы делаем выборку заказов в магазине без учета статуса и все заказы у нас не пропадают а высвечиваются в заказах. Еще хочу заметить что в редактируемом файле таких строк 2 - все заменяем и будет все работать, но есть нюанс во второй замене нет приставки o.
  2. Как при зажатии кнопки +/- делать ускоренное увеличение/уменьшение количества товара Как понять что кнопки мыши зажата и выполнять какое-то действие при длительном нажатии. Часто делаю калькуляторы, где есть расчеты по количеству квадратных метров, количество упаковок, добавляю +/- в товаре и другие доработки. Недавно обратился постоянный заказик с просьбой сделать ускоренное действие по зажатии кнопки мышки на + или -. У него я ранее делал кнопки + и - при нажатии на которые увеличивается или уменьшается количество товара с шагом 0.1. Небольшая пред история Заказчик сообщил что смотрит в яндекс вибвизоре и клиенты на его сайте что бы выбрать количество 6 кликают 60 раз по кнопке плюс))! (Шаг то 0.1). Он предложил сделать как в пульте от телевизора - когда зажимаешь кнопку идет быстрое изменение количества. Итак, сказано, сделано. Для этого достаточно было написать небольшой код: //быстрое зажатие $('.tab_box .calc_input span').mousedown(function(){ //нажатие кнопки мышки this_class = $(this).attr('class'); //берем класс кнопки (что бы понять + это или -) click_interval = false; click_timer = setTimeout(function(){ //запускаем таймаут что бы понять что кнопка зажата более чем на 300мс click_interval = setInterval(function(){ //запускаем действие через интервал 30мс $('.tab_box .calc_input span.' + this_class).trigger('click'); //само действие - клик по кнопке + или - }, 30); }, 300); }); $('.tab_box .calc_input span').mouseup(function(){ //когда отпускаем кнопку мышки все ресетим clearTimeout(click_timer); //убираем таймаут clearInterval(click_interval); //убираем интервал }); $('.tab_box .calc_input span').mouseleave(function(){ //когда покидаем мышкой кнопку (фикс когда зажатой кнопкой покинем + или -) clearTimeout(click_timer); clearInterval(click_interval); }); //быстрое зажатие Таким образом при зажатии кнопки более чем на 300мс идут имитации быстрых кликов с интервалом 30мс на которых уже есть события + и -. Задача выполнена на 100%, клиент доволен. А кому надо можете использовать этот код у себя в проектах
  3. В Opencart есть один небольшой но досадный баг. При пагинации есть ссылка на первую страницу с параметром page=1 и при переходе открывается дубль категории. Исправляем это В пагинации Opencart зарыто очень много багов. Например при перелистывании категории кнопками 1.2.3... у нас создаются дубли страниц, которые можно решить с помощью внедрения тегов prev и next. Но самый жесткий это дубль категории из-за ссылки https://site.com/category/?page=1. Эта ссылка формируется в пагинации для страницы 1. Хотя должна там быть без page=1. Как решить проблему с page=1 Отчасти можно поправить пагинацию (system/library/pagination) что бы не формировалась сама ссылка. Но почему отчасти? Потому что все равно при переходе на страницу https://site.com/category/?page=1 робот увидит дубль. Надо с page=1 делать 301 редирект на страницу без page. Много кто скажет а как же роботы найдут страницу с параметром page если ее не формировать. Да, по логике не должны, но как показывает практика роботы все это видят. Для того что бы решить проблему надо в контроллер категории после пагинации добавить код: //301 from page=1 if(isset($this->request->get['page']) && $this->request->get['page'] == 1){ header('Location: ' . $this->url->link('product/category', 'path=' . $category_info['category_id'], true), true, 301); exit(); } //301 from page=1 Так, если система увидит что page=1 автоматически сделает редирект на страницу без параметра page. Это небольшое дополнение в код защитит вас от дублей категории.
  4. Для того что бы вывести кастомную информацию не надо много кода. Достаточно применить правильный подход и пару строк кода. Читаем в статье. Приветствую тебя юный разработчик! Очень часто в заданиях или целых проектах у меня бывают похожие пункты. Очень популярный это вывод информационного блока в карточке товара, а то и не одного. Конечно, можно сделать в стиле хард кодинг - это прописать текст в нужном блоке прямо в шаблоне интернет магазина. Но это не наши методы. При таком подходе для изменения информации надо залезать в код. Ну очень жестко. Тем более ни о какой мультиязычности не может быть и речи. Ладно не буду описывать неправильное. Гораздо лучше акцентировать внимание как сделать правильно. Делаем функционал Для того что бы вывести информацию нам надо ее создать и где-то редактировать. Я сторонник того что бы как можно меньше делать какой-то кастом а использовать по максимуму стандартные возможности движка. Для создания информационного блока воспользуемся Каталог - Статьи и просто создаем статью. Хорошо то, что у нас есть возможность не только задать информацию в визуальном редакторе а также есть масса других полей который также можно использовать в наших целях. И заметьте, пока что ни одного файла не изменено. После этого открываем контроллер товара catalog/controller/product/product.php и вставляем строки: $this->load->model('catalog/information'); $information_info = $this->model_catalog_information->getInformation(777); $data['custom_info'] = html_entity_decode($information_info['description'], ENT_QUOTES, 'UTF-8'); где 777 - это id статьи. После этого у нас в шаблон товара уже передается переменная custom_info где и будет выводится на нужном языке информация в карточке товара. Для вывода достаточно вывести в любом нужном месте в карточке товара кодом: <?php echo $custom_info; ?> Редактировать ее можно как и обычную статью через админку. С минимальными изменениями мы сделали отличный кастомный функционал.
  5. Зачем это нужно и как выглядит Это нужно что бы в определенном блоке вывести все заголовки описания и при клике на любой зоголовок идет пролистывание к нему в описании. Также при скролле справа надо было сделать плавающий блок с заголовками что бы читая описание можно было переходить по нему с помощью удобного меню. Так как описаний в магазине 80 000 было принято решение сделать все автоматически. Для этого надо обработать описание товара. А где это сделать как не в контроллере. Но для "считывания" описания нам поможет библиотека phpQuery. Для подключения библиотеки для начала скачиваем ее и открываем файл catalog/controller/product/product.php и после <?php вставляем строку для подключения библиотеки require_once(DIR_SYSTEM . 'library/phpQuery-onefile.php'); После можем в любом удобном месте функции index вставить код который "выдергивает" все заголовки из описания и создает блок с заголовками $description = $data['description']; $tags = array(); $doc = phpQuery::newDocumentHTML($description); phpQuery::selectDocument($doc); foreach(pq(':header') as $index_h => $h){ $tags[] = html_entity_decode("<a class='mh-" . $h->nodeName . "' data-name='hname-" . $index_h . "' href='". $this->url->link('product/product', $url . '&product_id=' . $product_id) . "#hname-" . $index_h . "'>" . $h->nodeValue . "</a>",ENT_QUOTES,'UTF-8'); $data['description'] = str_replace($h->nodeValue . "</" . $h->nodeName. ">", '<a name="hname-' . $index_h . '"></a>' . $h->nodeValue. "</" . $h->nodeName. ">", $data['description']); } $data['description_tags'] = $tags; Далее нам надо в любом удобном месте вывести это в шаблоне товара <?php foreach($description_tags as $desc_tag){ ?> <li> <?php echo $desc_tag; ?> </li> <?php } ?> И конечно же добавим стилей и скриптов что бы все это украсить и оживить Стили .show-description-nav{padding: 10px 10px 7px 10px;background: #fff;border: 1px solid #ddd;box-shadow: 0 0 10px #999;} .fixed_menu_right{display:none;position: fixed;z-index:9999999;left:50%;top:30%;margin-left:360px;} .fixed_menu_right:hover .description-navigation-scrolling{display:block;} .show-description-nav .fa{font-size:25px;} .description-navigation-scrolling{position: absolute;display: none;background:#fff;width:410px;top:-20px;left:-60px;border: 1px solid #ddd;box-shadow: 0 0 10px #999;padding:10px 10px 10px 5px;} .description-navigation ul{padding-left:0;} .description-navigation li{list-style-type: none;margin-bottom:5px;} .description-navigation li a{font-size:13px;text-decoration:none;border-bottom:1px dashed #333;} .description-navigation li a:hover{border-bottom:1px dashed #fff;} .mh-h1{margin-left:0px;font-size:20px!important;margin-bottom:20px;} .mh-h2{margin-left:10px;font-size:16px!important;margin-bottom:10px;} .mh-h3{margin-left:20px;font-size:14px!important;} .mh-h4{margin-left:30px;font-size:13px!important;} .mh-h5{margin-left:40px;font-size:12px!important;} .mh-h6{margin-left:50px;font-size:11px!important;} Скрипты $(document).ready(function(){ $(".description-navigation a, .description-navigation-scrolling a").click(function(e) { e.preventDefault(); scrollTo = $(this).data("name"); $([document.documentElement, document.body]).animate({ scrollTop: $("a[name = '" + scrollTo + "']").offset().top }, 700); }); $(document).scroll(function(){ if($(window).scrollTop() < 500 && $(window).width() > 768){ $('.fixed_menu_right').fadeOut(200); }else{ $('.fixed_menu_right').fadeIn(200); } }); }); И чуть не забыл еще если хотите вывести плавающий фикс блок с заголовками то сделать это можно например так <div class="fixed_menu_right"> <button class="show-description-nav"><i class="fa fa-bars" aria-hidden="true"></i></button> <div class="description-navigation-scrolling"> <ul> <?php foreach($description_tags as $desc_tag){ ?> <li> <?php echo $desc_tag; ?> </li> <?php } ?> </ul> </div> </div> Таким образом у нас есть функционал для автоматического отделения заголовков и создания якорей. Кстати якори очень полезная штука для СЕО
  6. Во втором Opencart замечен странный баг который вместо копирования товара в списке его удаляет. Что бы исправить необходимо открыть файл admin/view/template/catalog/product_list.tpl <button type="submit" form="form-product" href="<?php echo $copy; ?>" data-toggle="tooltip" title="<?php echo $button_copy; ?>" class="btn btn-default"><i class="fa fa-copy"></i></button> или (в зависимости от версии Opencart) <button type="submit" form="form-product" formaction="<?php echo $copy; ?>" data-toggle="tooltip" title="<?php echo $button_copy; ?>" class="btn btn-default"><i class="fa fa-copy"></i></button> Заменяем на строку <button type="button" data-toggle="tooltip" title="<?php echo $button_copy; ?>" class="btn btn-default" onclick="$('#form-product').attr('action', '<?php echo $copy; ?>').submit()"><i class="fa fa-copy"></i></button> Таким образом мы поменяли систему отправки формы что бы браузера google chrome все это нормально отрабатывал.
  7. Часто бывает что цена идет за кв.м., а в упаковке, например ламината, находится более одного квадратного метра. В таком случае наш магазин должен автоматически все считать. Часто бывает, особенно в строительных магазинах, что цена идет за квадратный метр, а в упаковке, например ламината, находится более одного квадратного метра. Покупатель будет заказывать определенное количество упаковок, а Opencart должен автоматически подсчитывать сколько это в квадратных метрах. Например, нам надо купить ламинат на комнату 20 кв.м. Первое что бы делаем это находим интернет магазин, выбираем товар и ставим в количество упаковок. Но без автоматического подсчета неудобно совершать покупки. Из-за этого надо вручную считать сколько заказывать. В этой доработке мы сделаем автоматический подсчет упаковок товара. План работ Добавление в админку поле ввода количества квадратных метров в упаковке. (Например 1,56 кв.м. в пачке ламината) Добавляем в карточке товара + и - для увеличения или уменьшения количества упаковок в кв.м. Добавляем код для правильного отображения в категории.. Добавляем в админку поле ввода. Открываем файл admin/catalog/view/template/catalog/product_form.tpl ищем строки: <div class="form-group"> <label class="col-sm-2 control-label" for="input-price"><?php echo $entry_price; ?></label> <div class="col-sm-10"> <input type="text" name="price" value="<?php echo $price; ?>" placeholder="<?php echo $entry_price; ?>" id="input-price" class="form-control" /> </div> </div> после них вставляем: <div class="form-group"> <label class="col-sm-2 control-label" for="input-mpn">Количество м<sup>2</sup> в упаковке</label> <div class="col-sm-10"> <input type="text" name="mpn" value="<?php echo $mpn; ?>" id="input-mpn" class="form-control" /> </div> </div> Эти строки удаляем: <div class="form-group"> <label class="col-sm-2 control-label" for="input-mpn"><span data-toggle="tooltip" title="<?php echo $help_mpn; ?>"><?php echo $entry_mpn; ?></span></label> <div class="col-sm-10"> <input type="text" name="mpn" value="<?php echo $mpn; ?>" placeholder="<?php echo $entry_mpn; ?>" id="input-mpn" class="form-control" /> </div> </div> Этим кодом мы добавили поле ввода количества м2 для товара в админке, путем удаления ненужного mpn и присвоения этой переменной нашему полю. Также добавим поле для ввода количества штук в упаковке (для информации покупателю). Для этого после строк выше добавляем: <div class="form-group"> <label class="col-sm-2 control-label" for="input-isbn"><span data-toggle="tooltip" >Количество шт. в упаковке</span></label> <div class="col-sm-10"> <input type="text" name="isbn" value="<?php echo $isbn; ?>" placeholder="<?php echo $entry_isbn; ?>" id="input-isbn" class="form-control" /> </div> </div> И удаляем код для ввода isbn, который практически никому не нужен: <div class="form-group"> <label class="col-sm-2 control-label" for="input-isbn"><span data-toggle="tooltip" title="<?php echo $help_isbn; ?>"><?php echo $entry_isbn; ?></span></label> <div class="col-sm-10"> <input type="text" name="isbn" value="<?php echo $isbn; ?>" placeholder="<?php echo $entry_isbn; ?>" id="input-isbn" class="form-control" /> </div> </div> Далее открываем файл admin/model/catalog/product.php Ищем в документе отрезок кода: price = '" . (float)$data['price'] . "', И меняем его на: price = '" . (float)$data['price'] * ($data['mpn']?$data['mpn']:1) . "', Этим мы добавили калькуляцию цены в зависимости от количества квадратов в упаковке. Если количество квадратов не заполнено, цена будет оригинальная. Далее открываем файл admin/controller/catalog/product.php Находим строки: if (isset($this->request->post['price'])) { $data['price'] = $this->request->post['price']; } elseif (!empty($product_info)) { $data['price'] = $product_info['price']; } else { $data['price'] = ''; } Меняем их на: if (isset($this->request->post['price'])) { $data['price'] = $this->request->post['price']/($this->request->post['mpn']?$this->request->post['mpn']:1); } elseif (!empty($product_info)) { $data['price'] = $product_info['price'] / ($product_info['mpn']?$product_info['mpn']:1); } else { $data['price'] = ''; } Этим мы добавили отображения цены в поле цена за один квадратный метр. По админке все готово. При добавлении цены с количеством квадратов в упаковке идет автоматический подсчет и в базу пишется цена за упаковку то есть фактическая за конкретный товар. Далее будем редактировать фронт магазина для правильного отображения цены и количества кв. м. в заказе. Добавляем в карточку товара + и - Для этого открываем файл catalog/controller/product/product.php Находим строки: if (($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) { $data['price'] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax'))); } else { $data['price'] = false; } Меняем их на: if (($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) { $data['price'] = $this->currency->format($this->tax->calculate($product_info['price'] / ($product_info['mpn']?$product_info['mpn']:1), $product_info['tax_class_id'], $this->config->get('config_tax'))); } else { $data['price'] = false; } Этим действием мы выводим цену за квадратный метр. Далее, после этих строк вставляем $data['in_box'] = $product_info['mpn']; $data['count_in_box'] = $product_info['isbn']; Этой переменной мы передаем количество квадратных метров в упаковке (in_box) и количество штук в упаковке (count_in_box) Далее открываем файл catalog/view/theme/default/template/product/product.tpl И добавляем плюс и минус возле поля количество, где мы будем выводить его в квадратных метрах. Также добавим скрытое поле quantity (которое учитывается при добавлении) для реального количества упаковок. В этом файле ищем код: <input type="text" name="quantity" value="<?php echo $minimum; ?>" size="2" id="input-quantity" class="form-control" /> Меняем его на: <div class="col-sm-12 form-group"> <div class="col-sm-3"> <span data-type="q_minus" class="control-in-de btn btn-primary btn-block">-</span> </div> <div class="col-sm-6"> <input type="text" name="quantity_in_box" value="<?php echo $minimum * ($in_box?$in_box:1); ?> кв.м. (<?php echo $minimum; ?> уп.)" size="2" id="input-quantity" class="form-control" /> <input type="hidden" name="quantity" value="<?php echo $minimum; ?>" /> </div> <div class="col-sm-3"> <span data-type="q_plus" class="control-in-de btn btn-primary btn-block">+</span> </div> </div> Этим кодом мы добавили +/- и правильное отображение количества квадратных метров и упаковок. Отображение кнопок можно менять под свою тему или на свое усмотрение как будет удобно. В этом же файле находим: <?php echo $footer; ?> И перед этой строкой вставляем скрипты для оживления кнопок + и - <script> $('.control-in-de').click(function(){ if($(this).data('type') == 'q_minus'){ if($('input[name="quantity"]').val() > '<?php echo $minimum; ?>'){ $('input[name="quantity"]').val(parseInt($('input[name="quantity"]').val())-1); } }else{ $('input[name="quantity"]').val(parseInt($('input[name="quantity"]').val())+1); } in_box = parseInt($('input[name="quantity"]').val())*<?php echo $in_box; ?>; $('input[name="quantity_in_box"]').val(in_box.toFixed(2) + ' кв.м. (' + $('input[name="quantity"]').val() + ' уп.)'); }); </script> После этого у нас все хорошо отображается и в корзину добавляется в упаковках. Возле вывода цены, можно писать что это за 1 кв.м. Для вывода информации о количестве штук в упаковке добавьте в этом файле в удобном месте вывод Количество в упаковке <?php echo $count_in_box; ?> шт. Правильное отображение цены за квадратный метр в категории После всех изменений нам надо вывести цену за кв.м. в категории, для этого открываем файл catalog/controller/product/category.php И находим строку: $price = $this->currency->format($this->tax->calculate($result['price'], $result['tax_class_id'], $this->config->get('config_tax'))); Меняем ее на: $price = $this->currency->format($this->tax->calculate($result['price'] / ($result['mpn']?$result['mpn']:1), $result['tax_class_id'], $this->config->get('config_tax'))); По аналогии делаем вывод цены за кв.м. В других модулях, такие как новинки, скидки, хиты продаж и т. д. P.S. В Opencart 2 после всех изменений в коде магазина надо зайти в Модули — Модификаторы и нажать на кнопку Очистить и Обновить справа вверху.
  8. В силу сложившихся обстоятельств многим из нас был закрыт доступ на opencartforum.com, в связи с чем открывается данный форум для русскоязычного сегмента пользователей , разработчиков и всех желающих освоить данный движок, либо заказать разработку своего ресурса и пр. Все мы мирные граждане разных стран и объединяет нас работа с CMS Opencart и ни как иначе. Мы против конфликтов по национальному признаку, по месту жительства и расовой принадлежности. Будем так же рады видеть на нашем ресурсе и жителей Украины, у нас нет злости или предвзятости. Мы - аполитичны. Если Вы согласны не нарушать элементарные нормы поведения и этики в общении с жителями других государств, мы с удовольствием примем Вас в наш круг единомышленников. Всем мира, здоровья и терпения.

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.