Перейти к содержанию

admin

Администратор
  • Постов

    994
  • Зарегистрирован

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

  1. В 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. Это небольшое дополнение в код защитит вас от дублей категории.
  2. Для того что бы вывести кастомную информацию не надо много кода. Достаточно применить правильный подход и пару строк кода. Читаем в статье. Приветствую тебя юный разработчик! Очень часто в заданиях или целых проектах у меня бывают похожие пункты. Очень популярный это вывод информационного блока в карточке товара, а то и не одного. Конечно, можно сделать в стиле хард кодинг - это прописать текст в нужном блоке прямо в шаблоне интернет магазина. Но это не наши методы. При таком подходе для изменения информации надо залезать в код. Ну очень жестко. Тем более ни о какой мультиязычности не может быть и речи. Ладно не буду описывать неправильное. Гораздо лучше акцентировать внимание как сделать правильно. Делаем функционал Для того что бы вывести информацию нам надо ее создать и где-то редактировать. Я сторонник того что бы как можно меньше делать какой-то кастом а использовать по максимуму стандартные возможности движка. Для создания информационного блока воспользуемся Каталог - Статьи и просто создаем статью. Хорошо то, что у нас есть возможность не только задать информацию в визуальном редакторе а также есть масса других полей который также можно использовать в наших целях. И заметьте, пока что ни одного файла не изменено. После этого открываем контроллер товара 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; ?> Редактировать ее можно как и обычную статью через админку. С минимальными изменениями мы сделали отличный кастомный функционал.
  3. Зачем это нужно и как выглядит Это нужно что бы в определенном блоке вывести все заголовки описания и при клике на любой зоголовок идет пролистывание к нему в описании. Также при скролле справа надо было сделать плавающий блок с заголовками что бы читая описание можно было переходить по нему с помощью удобного меню. Так как описаний в магазине 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> Таким образом у нас есть функционал для автоматического отделения заголовков и создания якорей. Кстати якори очень полезная штука для СЕО
  4. Во втором 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 все это нормально отрабатывал.
  5. Часто бывает что цена идет за кв.м., а в упаковке, например ламината, находится более одного квадратного метра. В таком случае наш магазин должен автоматически все считать. Часто бывает, особенно в строительных магазинах, что цена идет за квадратный метр, а в упаковке, например ламината, находится более одного квадратного метра. Покупатель будет заказывать определенное количество упаковок, а 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 после всех изменений в коде магазина надо зайти в Модули — Модификаторы и нажать на кнопку Очистить и Обновить справа вверху.
  6. На данный момент форум пуст, но в течени времени он будет активно наполнятся нужной, полезной и в силу нынешних обстоятельств зачастую недоступен широкому кругу пользователей. Будем стараться по максимуму и в течении короткого времени ликвидировать этот проблему.
  7. В силу сложившихся обстоятельств многим из нас был закрыт доступ на opencartforum.com, в связи с чем открывается данный форум для русскоязычного сегмента пользователей , разработчиков и всех желающих освоить данный движок, либо заказать разработку своего ресурса и пр. Все мы мирные граждане разных стран и объединяет нас работа с CMS Opencart и ни как иначе. Мы против конфликтов по национальному признаку, по месту жительства и расовой принадлежности. Будем так же рады видеть на нашем ресурсе и жителей Украины, у нас нет злости или предвзятости. Мы - аполитичны. Если Вы согласны не нарушать элементарные нормы поведения и этики в общении с жителями других государств, мы с удовольствием примем Вас в наш круг единомышленников. Всем мира, здоровья и терпения.
×
×
  • Создать...