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

admin

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

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

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

  1. Версия 1.0.0

    86 раз скачали

    Модуль обратного звонка + модуль обратной связи. Возможности модуля: вставка модуля обратной связи в схему вашего сайта; указание произвольного заголовка и текста для вашего модуля; возможность включить капчу для через стандартные средства; активация кнопки обратного звонка в шапке сайта (стандартная тема). Все запросы отправленные через данные формы приходят на почту указанную в админ-панели. Установка: перейдите в модули>установка - установите архив для своей версии Opencart; перейдите в модули>модификаторы - обновите модификаторы; перейдите в список модулей, установите, настройте и сохраните модуль; чтобы вставить модуль на сайт, перейдите в дизайн>схемы и вставьте на необходимую страницу. Важная информация: кнопка обратной связи рассчитана на стандартную тему, доработка под вашу тему оплачивается отдельно. Модуль распространяется бесплатно, поддержка не осуществляется.
    Бесплатный
  2. Просмотр файла Уведомления администратора (Telegram, Viber) / Admin Notifications Модуль уведомлений администраторов магазина Opencart (OcStore) о новом: заказе покупателе партнере (убрано в версии для Opencart 3.0, т.к. личный кабинет покупателя и личный кабинет партнера в этой версии Opencart'a были объединены) отзыве возврате Возможности: Гибкая, мультиязычная настройка шаблона уведомления Гибкая настройка отправки уведомлений для каждого администратора - например, если нужно уведомлять только одного администратора об возвратах, установите только у него "галочку" Возможность настройки уведомления для каждого из статусов заказа Возможность установки логирования ошибок запросов (рекомендуется включать только на этапе тестирования) Настройка действия при длинном сообщении (обрезать или разбивать на несколько). Добавлено в связи с ограничением длины символов в одном сообщении. Возможность установки тайм аута соединения (времени в секундах подключения к серверам). Добавлено для предотвращения длительного "зависания" во время оформления заказа, регистрации и тд в случае недоступности серверов месседжеров. Поддержка прокси (Socks 5) для мессенджера Telegram. Подробная инструкция по настройке модуля. Поддержка полей модуля Simple. Возможность отправки уведомлений не только администраторам, но и другим пользователям. Для месседжера Telegram также добавлена возможность отправки уведомлений в группу. Распространяется: "как есть" (as is). Необходимы включённые SSL и ЧПУ! Установка - Вариант 1: Скопируйте содержимое директории upload в корневую директорию сайта. Зайдите в Дополнения - Модули и активируйте его Вариант 2: Установите архив через встроенный Ocmod Зайдите в Дополнения - Модули и активируйте его Настройка Подробная инструкция по настройке в самом модуле. История версий - Обновление от 02.06.2019: Добавлена поддержка прокси (Socks 5) для месседжера Telegram. Добавлена подробная инструкция по настройке модуля. Обновление от 01.09.2019: Добавлена поддержка полей модуля Simple. Добавлена версия для Opencart 3.0. Обновление от 16.01.2020: Исправлена ошибка из-за которой отправлялись уведомления по неотмеченным статусам заказов. Исправлена ошибка из-за которой в некоторых случаях неправильно настраивался бот (не присылал id). Исправлена ошибка из-за которой в некоторых случаях неправильно формировался QR-код. Исправлена ошибка из-за которой в версии для Opencart 3 не удалялись логи. Добавлена возможность отправлять уведомления не только администраторам (например, для месседжера Telegram можно отправлять уведомления в группу и тд) Добавлено в стандартные шаблоны название магазина. Добавлена кнопка "Применить". Добавлены новые инструкции. Небольшие исправления по функционалу. Небольшие исправления по внешнему виду. Добавлена версия для Opencart 1.5 Обновление от 12.09.2020: Добавлены переменные от товарах в уведомлении о новом заказе Исправлена инструкция по наcтройке Viber Исправлен ряд багов Добавил admin Добавлено 13.03.2022 Категория Обратная связь, звонки  
  3. Версия 1.3.2

    78 раз скачали

    Модуль уведомлений администраторов магазина Opencart (OcStore) о новом: заказе покупателе партнере (убрано в версии для Opencart 3.0, т.к. личный кабинет покупателя и личный кабинет партнера в этой версии Opencart'a были объединены) отзыве возврате Возможности: Гибкая, мультиязычная настройка шаблона уведомления Гибкая настройка отправки уведомлений для каждого администратора - например, если нужно уведомлять только одного администратора об возвратах, установите только у него "галочку" Возможность настройки уведомления для каждого из статусов заказа Возможность установки логирования ошибок запросов (рекомендуется включать только на этапе тестирования) Настройка действия при длинном сообщении (обрезать или разбивать на несколько). Добавлено в связи с ограничением длины символов в одном сообщении. Возможность установки тайм аута соединения (времени в секундах подключения к серверам). Добавлено для предотвращения длительного "зависания" во время оформления заказа, регистрации и тд в случае недоступности серверов месседжеров. Поддержка прокси (Socks 5) для мессенджера Telegram. Подробная инструкция по настройке модуля. Поддержка полей модуля Simple. Возможность отправки уведомлений не только администраторам, но и другим пользователям. Для месседжера Telegram также добавлена возможность отправки уведомлений в группу. Распространяется: "как есть" (as is). Необходимы включённые SSL и ЧПУ! Установка - Вариант 1: Скопируйте содержимое директории upload в корневую директорию сайта. Зайдите в Дополнения - Модули и активируйте его Вариант 2: Установите архив через встроенный Ocmod Зайдите в Дополнения - Модули и активируйте его Настройка Подробная инструкция по настройке в самом модуле. История версий - Обновление от 02.06.2019: Добавлена поддержка прокси (Socks 5) для месседжера Telegram. Добавлена подробная инструкция по настройке модуля. Обновление от 01.09.2019: Добавлена поддержка полей модуля Simple. Добавлена версия для Opencart 3.0. Обновление от 16.01.2020: Исправлена ошибка из-за которой отправлялись уведомления по неотмеченным статусам заказов. Исправлена ошибка из-за которой в некоторых случаях неправильно настраивался бот (не присылал id). Исправлена ошибка из-за которой в некоторых случаях неправильно формировался QR-код. Исправлена ошибка из-за которой в версии для Opencart 3 не удалялись логи. Добавлена возможность отправлять уведомления не только администраторам (например, для месседжера Telegram можно отправлять уведомления в группу и тд) Добавлено в стандартные шаблоны название магазина. Добавлена кнопка "Применить". Добавлены новые инструкции. Небольшие исправления по функционалу. Небольшие исправления по внешнему виду. Добавлена версия для Opencart 1.5 Обновление от 12.09.2020: Добавлены переменные от товарах в уведомлении о новом заказе Исправлена инструкция по наcтройке Viber Исправлен ряд багов
    Бесплатный
  4. Часто бывает, что продаваемый товар в интернет магазине не нуждается в отдельной странице. Вот как, например, гвозди. Зачем конкретному типу гвоздю или саморезу, шурупу и т.д. создавать отдельную страницу (карточку товара) если в этом нет необходимости. Гораздо проще выводить все списком или же сеткой на странице категории с возможностью выбора опций и добавления в корзину. С коробки Opencart умеет выводить товары и сеткой и списком, также есть функция прямого добавления в корзину без перехода на страницу товара. Казалось бы, зачем что-то придумывать, если все уже работает, нужно ведь удалить ссылку входа на сам товар и у нас будет все как задумано. Но не совсем так все просто. Дело в том, что если товар имеет обязательные опции, то вместо добавления в корзину вы перейдете на страницу товара где и будет предложено выбрать определенную опцию и только после того товар можно будет купить, что совершенно неудобно. В идеале, если мы продаем гвозди, нам бы выводить все товары в категории списком или сеткой с изображением и дать возможность выбрать нужные опции и отправить товар в корзину. Опции могут быть, как и ширина гвоздя, так и длина, а также и упаковка или количество. Все это есть в стандартном функционале. Итак, задача понятная, сделать вывод опций в списке товаров на странице категории. Выводить будем только в виде select (список), так как чекбоксы, радио и т.д. не логично для наших целей. По этому опциям нужно ставить тип – список. Первым делом нам надо сделать выборку всех опций в контроллере, что бы их передать на шаблон. Для этого открываем catalog/controller/product/category.php находим строку $this->data['products'][] = array( Эта строка заполняет циклом данные о каждом товаре, который будет выведен в категории. Перед ней вставляем $options = array(); foreach ($this->model_catalog_product->getProductOptions($result['product_id']) as $option) { if ($option['type'] == 'select') { $option_value_data = array(); foreach ($option['option_value'] as $option_value) { if (!$option_value['subtract'] || ($option_value['quantity'] > 0)) { if ((($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) && (float)$option_value['price']) { $price = $this->currency->format($this->tax->calculate($option_value['price'], $result['tax_class_id'], $this->config->get('config_tax'))); } else { $price = false; } $option_value_data[] = array( 'product_option_value_id' => $option_value['product_option_value_id'], 'option_value_id' => $option_value['option_value_id'], 'name' => $option_value['name'], 'image' => $this->model_tool_image->resize($option_value['image'], 50, 50), 'price' => $price, 'price_prefix' => $option_value['price_prefix'] ); } } $options[] = array( 'product_option_id' => $option['product_option_id'], 'option_id' => $option['option_id'], 'name' => $option['name'], 'type' => $option['type'], 'option_value' => $option_value_data, 'required' => $option['required'] ); } } После находим строку 'tax' => $tax, После нее вставляем 'options' => $options, Теперь наш массив будет содержать все опции товара. После чего нам надо сделать их вывод и возможность выбора при покупке товара на странице категории. Для этого открываем catalog/view/theme/default/template/product/category.tpl и находим строку <?php foreach ($products as $product) { ?> И в любое место в этом цикле *вставляем вывод опций товара <?php if ($product['options']) { ?> <div class="options opt_<?php echo $product['product_id']; ?>"> <input type="hidden" name="product_id" value="<?php echo $product['product_id']; ?>" /> <?php foreach ($product['options'] as $option) { ?> <div class="option_item"> <?php if ($option['required']) { ?> <span class="required">*</span> <?php } ?> <b><?php echo $option['name']; ?>:</b> <select name="option[<?php echo $option['product_option_id']; ?>]"> <option value="">Выберите</option> <?php foreach ($option['option_value'] as $option_value) { ?> <option value="<?php echo $option_value['product_option_value_id']; ?>"><?php echo $option_value['name']; ?> <?php if ($option_value['price']) { ?> (<?php echo $option_value['price_prefix']; ?><?php echo $option_value['price']; ?>) <?php } ?> </option> <?php } ?> </select> </div> <?php } ?> </div> <?php } ?> После этого у нас появится на странице категории в товарах возможность выбора опций, но для осуществления покупки нам надо заменить обработчик кнопки купить. Это javascript функция. Находим строку <?php echo $footer; ?> Перед ней вставляем функцию <script type="text/javascript"><!-- function addToCartOpt(product_id){ $.ajax({ url: 'index.php?route=checkout/cart/add', type: 'post', data: $('.opt_'+product_id+' input[type=\'hidden\'], .opt_'+product_id+' select'), dataType: 'json', success: function(json) { $('.success, .warning, .attention, information, .error').remove(); if (json['error']) { if (json['error']['option']) { for (i in json['error']['option']) { $('#option-' + i).after('<span class="error">' + json['error']['option'][i] + '</span>'); } } } if (json['success']) { $('#notification').html('<div class="success" style="display: none;">' + json['success'] + '<img src="catalog/view/theme/default/image/close.png" alt="" class="close" /></div>'); $('.success').fadeIn('slow'); $('#cart-total').html(json['total']); $('html, body').animate({ scrollTop: 0 }, 'slow'); } } }); } //--></script> После изменяем строку <input type="button" value="<?php echo $button_cart; ?>" onclick="addToCart('<?php echo $product['product_id']; ?>');" class="button" /> На новую кнопку добавления в корзину <input type="button" value="<?php echo $button_cart; ?>" onclick="addToCartOpt('<?php echo $product['product_id']; ?>');" class="button" /> После этих изменений в списке товаров на странице категории будет доступен выбор опций и непосредственно добавление в корзину покупок. * Примечание к статье. Так как у каждого магазина свои шаблоны, дизайны и стили в статье не затрагивалось место куда (после или перед какой) строкой вставлять код вывода опций, указан только цикл, в который надо вставить код. Пробуйте на своем магазине и вставляйте туда, где это нужно. После, конечно же, надо задать стили отображения для выпадающего списка, согласно дизайну магазина, где также все индивидуально. И еще нюанс. Если на сайте не используется переключение сетка или список удалите функцию в javascript которая находится внизу файла function display(view) т.к. из-за нее показ опций будет недоступен.
  5. Бывают случаи, когда в списке товаров нужно кроме основного изображения вывести и дополнительные. Например, интернет-магазин фейерверков. Бывают случаи, когда в списке товаров нужно кроме основного изображения вывести и дополнительные. Например, интернет-магазин фейерверков. Основное изображение будет упаковка товара, однако покупателю нужно посмотреть как тот или иной салют выглядит в действии. В opencart в списке товаров отображается только основное изображение, дополнительные, где отображены выстрелы в ночном небе, доступны только в карточке товара. Это очень неудобно, т.к. при выборе, что бы посмотреть на работу салюта, нужно зайти в конкретное наименование, а их может быть очень много. Решением в этой ситуации служит вывод дополнительных изображений в категории возле основной картинки. Это позволит покупателю, не заходя в карточку товара, увидеть фото взрыва в ночном небе и сделать быстрый выбор. Для начала добавим функцию добавления дополнительных изображений в массив данных товаров, который формируется в контроллере, открываем файл: /catalog/controller/product/category.php Находим строки: $results = $this->model_catalog_product->getProducts($data); foreach ($results as $result) { После них вставляем: $results_img = $this->model_catalog_product->getProductImages($result['product_id']); $dop_img = array(); foreach ($results_img as $result_img) { if ($result_img['image']) { $image_dop = $this->model_tool_image->resize($result_img['image'], 50, 50); } else { $image_dop = false; } $dop_img[] = $image_dop; } Немного ниже ищем строки: $this->data['products'][] = array( 'product_id' => $result['product_id'], Ниже нее добавляем: 'dop_img' => $dop_img, Сохраняем, теперь в данных которые передаются в наш шаблон есть дополнительные фото. Далее редактируем шаблон, открываем: /catalog/view/theme/default/template/product/category.tpl Находим строки: <?php foreach ($products as $product) { ?> И в любом удобном месте вставляем цикл вывода дополнительных фото: <div class="dop_img"> <?php foreach ($product['dop_img'] as $img) { ?> <img src="<?php echo $img;?>"> <?php } ?> </div> Ну а дальше дело за малым, поставить нужные нам стили, например: .dop_img{ position:absolute; z-index:100; } .dop_img img{ margin-right:2px; border-radius:4px; } Вот и все, дополнительные изображения товаров выведены в категории. С помощью стилей можно сделать эффект увеличения при наведении, например в контроллере где у нас стоит $result_img[‘image’], 50, 50); можно поставить размер изображения 150, 150 А в стилях прописать: .dop_img img{ margin-right:2px; border-radius:4px; width:50px; height:50px; } .dop_img img:hover{ width:150px; height:150px; position:absolute; } С помощью данной доработки мы делаем возможность увеличения дополнительных фотографий при наведении.
  6. В стандартном функционале Opencart после заказа покупателю приходит письмо на почту с данными заказа. С коробки письмо достаточно информативное В стандартном функционале Opencart после заказа покупателю приходит письмо на почту с данными заказа. С коробки письмо достаточно информативное, в нем идет перечень покупаемых товаров (название, к-во, модель, цена), их опции, плата за доставку и т.д. Однако в некоторых случаях мало данных в письме, для тех, кто использует дополнительные поля (sku, location, mpn и т.п.) Для вывода дополнительных данных в письме покупателю, открываем файл модель, с помощью которой и отсылается письмо заказчику catalog/model/checkout/order.php находим строку объявления массива для товаров $template->data['products'] = array(); После или перед ней вставляем $this->load->model('catalog/product'); Для заполнения массива данными о заказанных товарах в opencart используется таблица order_product где у нас есть ограниченное количество полей и соответственно нет тех что нам нужны. Для того что бы получить необходимые данные о товаре нам надо сделать выборку из двух таблиц order_product и product где доступны все поля товара (sku, upc, ean, jan, isbn, mpn, location и т.д.). Поможет нам функция выборки данных о товаре по его product_id. Чуть ниже находим строку $template->data['products'][] = array( Перед! ней добавляем выборку getProduct вставляя код: $product_data = array(); $product_data = $this->model_catalog_product->getProduct($product['product_id']); После этого нам надо добавить нужные поля в массив товаров: 'sku' => $product_data['sku'], или 'location' => $product_data['location'], в зависимости что нам надо, можно и все добавить. Далее для добавления поля в шаблон письма открываем файл: catalog/view/theme/default/template/mail/order.tpl И в нужном месте вставляем вывод нужного поля, например: <?php echo $product['sku']; ?> Обязательно смотрите на верстку, там она табличная по этому создавайте новую ячейку таблицы и вставляйте туда данные. С помощью данной доработки можно сделать вывод не только дополнительных полей, а и описание, фото и все данные, которые есть в базе товаров.
  7. В стандартной реализации Opencart не предусмотрен вывод производителя товара в категории, но в некоторых ситуациях он просто необходим. В стандартной реализации Opencart не предусмотрен вывод производителя товара в категории, но в некоторых ситуациях он просто необходим. Например, интернет магазин продает шины или другие товары, которые многие отличают по бренду. И согласитесь, визуальное восприятие логотипа производителя в списке товаров помогает потенциальному покупателю найти то, что он искал. Вывод товара в стандартном (default) шаблоне category.tpl построен как списком, так и сеткой. Переключаются эти режимы ссылкой в начале страницы, после переключения данные заносятся в куки (cookie) и при следующем посещении магазина или перехода в другие категории выбор запоминается до их очистки или переключения режима. В таком случае вывод товаров происходит естественным путем на страницу и после этого javascript перестраивает элементы согласно выбору пользователя. Для добавления дополнительного поля (производителя, артикул, mpn и др.) надо внести изменения как в разметку, так и в javascript код внизу страницы. Для добавления данных о производителе и его логотип в массив товаров открываем контроллер по адресу catalog/controller/product/category.php и и после строки в начале файла: $this->load->model('catalog/category'); добавляем загрузку модели производителя строкой: $this->load->model('catalog/manufacturer'); Далее ищем код формирования массива $this->data['products'][] = array( и перед ним вставляем $manufacturer_info = $this->model_catalog_manufacturer->getManufacturer($result['manufacturer_id']); if ($result['image']) { $logo_image = $this->model_tool_image->resize($manufacturer_info['image'], 100, 60); } else { $logo_image = false; } Обратите внимание на числа 100 и 60 – это параметры изображения, где 100 – длина, 60 – высота, их можно менять на любой другой размер. Далее чуть ниже находим 'name' => $result['name'], После нее вставляем 'logo_title' => $manufacturer_info['name'], 'logo_image' => $logo_image, Теперь наш массив, передаваемый на шаблон, включает имя производителя и его логотип. Для вывода логотипа производителя в список и сетку вывода товаров в категории открываем файл шаблона catalog/view/theme/default/template/product/category.tpl и находим блок (div) с классом product-list в котором выводятся данные о товарах, а потом с этого блока «парсятся» для перестройки список-сетка. Далее в нужном месте для вывода логотипа бренда вставляем <div class="logo"><img src="<?php echo $product['logo_image']; ?>" alt="<?php echo $product['logo_title']; ?>" title="<?php echo $product['logo_title']; ?>"></div> После этого «естественный» вывод в шаблон у нас уже готов. Для добавления в сетку или список нам нужно отредактировать javascript функцию, которая формирует верстку для заданного вида. Для этого внизу страницы находим строку function display(view) { и в нужном месте до строки }else{ вставляем отображение логотипа var logo = $(element).find('.logo').html(); if (logo != null) { html += '<div class="logo">' + logo + '</div>'; } можно например вставить после строки: html += '<div class="name">' + $(element).find('.name').html() + '</div>';
  8. Opencart есть возможность закачки файлов через админку. Однако сделано это очень неудобно и дает возможность скачивать файл только с личного кабинета покупателя В Opencart есть возможность закачки файлов через админку. Однако сделано это очень неудобно и дает возможность скачивать файл только с личного кабинета покупателя, после совершения покупки. Но во многих случаях нам надо прикрепить инструкцию или любой другой файл к товару. Стандартными возможностями сделать это не предоставляется возможным, либо только вручную ссылку прописывать, что не правильно. Для добавления файла к товару нам надо создать возможность его закачки в форме редактирования товара. Но для сохранения этих данных требуется дополнительное поле в базе данных. Создавать его я не вижу смысла т.к. в опенкарте есть много полей, которые думаю 90% не используют вовсе. Выберем переменную jan. Для этого открываем admin/view/template/catalog/product_form.tpl и в любое удобное место (смотрите по верстке) вставляем форму загрузки файла. <tr> <td>Файл:</td> <td><input type="text" name="jan" value="<?php echo $jan; ?>" /> <a id="button-upload-jan" class="button">Обзор</a></td> </tr> Для работы которой нам понадобится javascript код, который вставляем перед <?php echo $footer; ?> <script type="text/javascript" src="view/javascript/jquery/ajaxupload.js"></script> <script type="text/javascript"><!-- new AjaxUpload('#button-upload-jan', { action: 'index.php?route=catalog/download/upload_jan&token=<?php echo $token; ?>', name: 'file', autoSubmit: true, responseType: 'json', onSubmit: function(file, extension) { $('#button-upload-jan').after('<img src="view/image/loading.gif" class="loading" style="padding-left: 5px;" />'); $('#button-upload-jan').attr('disabled', true); }, onComplete: function(file, json) { $('#button-upload').attr('disabled', false); if (json['success']) { alert(json['success']); $('input[name="jan"]').attr('value', json['jan']); } if (json['error']) { alert(json['error']); } $('.loading').remove(); } }); //--></script> Для загрузки файла на сервер нам надо обработчик, для этого открываем файл admin/controller/catalog/download.php и перед строкой public function index() { Вставляем: public function transform($string){ $arr = array( 'А' => 'A' , 'Б' => 'B' , 'В' => 'V' , 'Г' => 'G', 'Д' => 'D' , 'Е' => 'E' , 'Ё' => 'JO' , 'Ж' => 'ZH', 'З' => 'Z' , 'И' => 'I' , 'Й' => 'JJ' , 'К' => 'K', 'Л' => 'L' , 'М' => 'M' , 'Н' => 'N' , 'О' => 'O', 'П' => 'P' , 'Р' => 'R' , 'С' => 'S' , 'Т' => 'T', 'У' => 'U' , 'Ф' => 'F' , 'Х' => 'KH' , 'Ц' => 'C', 'Ч' => 'CH', 'Ш' => 'SH', 'Щ' => 'SHH', 'Ъ' => '"', 'Ы' => 'Y' , 'Ь' => '', 'Э' => 'EH' , 'Ю' => 'JU', 'Я' => 'JA', 'а' => 'a' , 'б' => 'b' , 'в' => 'v' , 'г' => 'g', 'д' => 'd', 'е' => 'e' , 'ё' => 'jo' , 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'jj', 'к' => 'k' , 'л' => 'l' , 'м' => 'm', 'н' => 'n', 'о' => 'o' , 'п' => 'p' , 'р' => 'r' , 'с' => 's', 'т' => 't', 'у' => 'u' , 'ф' => 'f' , 'х' => 'kh', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'shh', 'ъ' => '"' , 'ы' => 'y', 'ь' => '_', 'э' => 'eh', 'ю' => 'ju' , 'я' => 'ja', ' ' => '_'); $key = array_keys($arr); $val = array_values($arr); $translate = str_replace($key, $val, $string); return $translate; } public function upload_jan() { $json = array(); if (!empty($this->request->files['file']['name'])){ $filename = $this->transform($this->request->files['file']['name']); if ((utf8_strlen($filename) < 3) || (utf8_strlen($filename) > 1000)) { $json['error'] = $this->language->get('error_filename'); } if ($this->request->files['file']['error'] != UPLOAD_ERR_OK) { $json['error'] = $this->language->get('error_upload_' . $this->request->files['file']['error']); } } else { $json['error'] = $this->language->get('error_upload'); } if (!isset($json['error'])) { move_uploaded_file($this->request->files['file']['tmp_name'], DIR_DOWNLOAD . $filename); $json['jan'] = $filename; $json['success'] = "Файл загружен успешно!"; } $this->response->setOutput(json_encode($json)); } Этот код загружает файл на сервер, помещает его в папку download и преобразует имя файла в транслит, при этом заменяя пробелы и другие спецсимволы на нормальные разделители слов. Например, у нас был файл «Инструкция к велосипеду.docx» на сервер оно загрузится как «instrukciya_k_velosipedu.docx» что более правильно. Для вывода его в карточке товара нам надо открыть файл: catalog/controller/product/product.php и перед строкой: $this->data['options'] = array(); вставить $this->data['file'] = "/download/".$product_info['jan']; После этого открываем файл шаблон catalog/view/theme/default/template/product/product.tpl и в любое удобное место (смотрите по шаблону и верстке) вставляете ссылку на закачку файла: <?php if($file){ ?><a href="<?php echo $file; ?>">Скачать инструкцию</a><?php } ?> После таких изменений у нас к каждому товару можно добавлять файл на закачку посетителем при просмотре карточки товара. Маленькое замечание. Увеличьте поле jan в базе данных до 1000 символов.
  9. В CMS Opencart очень много есть преимуществ перед аналогами. Однако эта система имеет и свои недостатки. Самым серьезным из которых, как я считаю, являются – дубли страниц. В CMS Opencart очень много есть преимуществ перед аналогами. Это простота кода, множество шаблонов, модулей, великолепное сообщество, где с вероятностью до 80% (мое мнение) можно найти нужную информацию или доработку. Однако эта система имеет и свои недостатки. Самым серьезным из которых, как я считаю, являются – дубли страниц. Почему он самый страшный – да потому что из-за повторяющегося контента на сайте поисковые системы, мягко говоря, не в восторге. Индексировать ваш сайт они будут, но на каких местах в выдаче вы будете — это уже вопрос. Что такое дубли страниц? Это одинаковый контент на сайте, который доступен по разным адресам. Например, карточка товара «Ноутбук Asus» доступна по адресу сайт/ноутбуки/для работы/Ноутбук-Asus. Но в случае, если вы настроите модуль рекомендуемые, новинки или другой подобный модуль, который есть с коробки в Opencart, вы получите целую дюжину дублей на сайте. Уверяю, что в выдаче вы просядете, не факт опять же, но вероятность огромная. Любой из модулей вывода товаров генерирует неправильную “Прямую” ссылку вида сайт/Ноутбук-Asus производя при этом разные адреса для одной и той же страницы. Еще мне не понятно, зачем делать ссылку в хлебных крошках на главную страницу вида сайт/index.php?route=common/home, если намного проще ставить тот же слеш «/» и получилась бы та же ссылка без лишних параметров, которые совершенно не нужны. Та же проблема есть при переходе на главную страницу кликая на логотип. Итак, подытожим и опишем список всех дублей в Opencart: Доступность одного товара по разным адресам. (модули последние, рекомендуемые и т.д.) Ссылки на главную в виде сайт/index.php?route=common/homе Доступность главной страницы сайта по адресам — http://сайт — http://сайт/ — http://сайт/index.php — http://сайт/index.php?route=common/homе Ссылки при пейджинге страницы (как следствие одинаковые мета теги и описание категории, чего лучше не допускать) Другие (исследую) Как же избавиться от неправильных ссылок, которые плодят дубли на сайте? Самый простой вариант, но не совсем правильный, это поставить в админке в настройках «ЧПУ товаров с категориями» в положение нет. В таком случае в адресах страниц у нас не будет иерархии вложенности. Такой вариант еще подходит для магазинов, которым специально нужны короткие ссылки на товар, без соблюдения категорий. Но по правилам хорошего тона для поисковых систем, как и для людей, удобнее будет использовать URL с соблюдением вложенности (иерархии). Для удаления разных адресов на один и тот же товар нам нужно внести поправки в модулях и местах, которые генерируют «прямые» ссылки. Из модулей будем редактировать: Хиты продаж, Рeкомендуемые, Последние и Aкции. Все эти модули есть в стандартной комплектации Opencart и OcStore. Для полноценного избавления нам надо будет отредактировать еще места неправильных ссылок: страница производителя, блок рекомендуемых в описании товара, страница акций (product/special), страница с результатами поска, страница сравнения товаров. В выше перечисленных модулях не предусмотрена ссылка с учетом категории, в котором находится товар, нам же надо её сделать, да и еще с соблюденной иерархией категорий. В моем методе можно получить ссылки с уровнем вложенности до 5 — чего для 95% магазинов хватит. Для определения категории товара нам надо добавить функцию в catalog/model/catalog/category.php Перед public function getCategoryLayoutId($category_id) { Добавляем public function getProductPath($product_id) { $category_id = $this->db->query("SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "'"); if(isset($category_id->rows[0]['category_id']) && ($category_id->rows[0]['category_id'] != 0)){ $parent_id = $this->db->query("SELECT parent_id FROM " . DB_PREFIX . "category WHERE category_id = '" . (int)$category_id->rows[0]['category_id'] . "'"); if(isset($parent_id->rows[0]['parent_id']) && ($parent_id->rows[0]['parent_id'] != 0)){ $category = $parent_id->rows[0]['parent_id'] . "_" . $category_id->rows[0]['category_id']; $path_id_2 = $this->db->query("SELECT parent_id FROM " . DB_PREFIX . "category WHERE category_id = '" . $parent_id->rows[0]['parent_id'] . "'"); if(isset($path_id_2->rows[0]['parent_id']) && ($path_id_2->rows[0]['parent_id'] != 0)){ $category = $path_id_2->rows[0]['parent_id'] . "_" . $parent_id->rows[0]['parent_id'] . "_" . $category_id->rows[0]['category_id']; $path_id_3 = $this->db->query("SELECT parent_id FROM " . DB_PREFIX . "category WHERE category_id = '" . (int)$path_id_2->rows[0]['parent_id'] . "'"); if(isset($path_id_3->rows[0]['parent_id']) && ($path_id_3->rows[0]['parent_id'] != 0)){ $category = $path_id_3->rows[0]['parent_id'] . "_" . $path_id_2->rows[0]['parent_id'] . "_" . $parent_id->rows[0]['parent_id'] . "_" . $category_id->rows[0]['category_id']; $path_id_4 = $this->db->query("SELECT parent_id FROM " . DB_PREFIX . "category WHERE category_id = '" . (int)$path_id_3->rows[0]['parent_id'] . "'"); if(isset($path_id_4->rows[0]['parent_id']) && ($path_id_4->rows[0]['parent_id'] != 0)){ $category = $path_id_4->rows[0]['parent_id'] . "_" . $path_id_3->rows[0]['parent_id'] . "_" . $path_id_2->rows[0]['parent_id'] . "_" . $parent_id->rows[0]['parent_id'] . "_" . $category_id->rows[0]['category_id']; } } } }else{ $category = $category_id->rows[0]['category_id']; } }else{ $category = false; } return $category; } Далее переходим в контроллер нужного нам модуля и делаем изменения в URL с учетом категории товара. Итак по модулям: Хиты продаж Открываем контроллер (catalog/controller/module/bestseller.php) В начало функции подключаем модель: $this->load->model('catalog/category'); Перед if ($result['image']) { Вставляем $product_path = $this->model_catalog_category->getProductPath($result['product_id']); if($product_path){ $href = $this->url->link('product/product', 'path=' . $product_path . '&product_id=' . $result['product_id']); }else{ $href = $this->url->link('product/product', 'product_id=' . $result['product_id']); } И строку 'href' => $this->url->link('product/product', 'product_id=' . $result['product_id']) Заменяем на: 'href' => $href Pекомендуемые Открываем контроллер (catalog/controller/module/featured.php) В начало функции подключаем модель: $this->load->model('catalog/category'); Перед if ($product_info['image']) { Вставляем $product_path = $this->model_catalog_category->getProductPath($product_id); if($product_path){ $href = $this->url->link('product/product', 'path=' . $product_path . '&product_id=' . $product_info['product_id']); }else{ $href = $this->url->link('product/product', 'product_id=' . $product_info['product_id']); } И строку 'href' => $this->url->link('product/product', 'product_id=' . $product_info['product_id']) Заменяем на: 'href' => $href Последние товары Открываем контроллер (catalog/controller/module/latest.php) В начало функции подключаем модель: $this->load->model('catalog/category'); Перед if ($result['image']) { Вставляем $product_path = $this->model_catalog_category->getProductPath($result['product_id']); if($product_path){ $href = $this->url->link('product/product', 'path=' . $product_path . '&product_id=' . $result['product_id']); }else{ $href = $this->url->link('product/product', 'product_id=' . $result['product_id']); } И строку 'href' => $this->url->link('product/product', 'product_id=' . $result['product_id']) Заменяем на: 'href' => $href Aкции Открываем контроллер (catalog/controller/module/special.php) В начало функции подключаем модель: $this->load->model('catalog/category'); Перед if ($result['image']) { Вставляем $product_path = $this->model_catalog_category->getProductPath($result['product_id']); if($product_path){ $href = $this->url->link('product/product', 'path=' . $product_path . '&product_id=' . $result['product_id']); }else{ $href = $this->url->link('product/product', 'product_id=' . $result['product_id']); } И строку 'href' => $this->url->link('product/product', 'product_id=' . $result['product_id']) Заменяем на: 'href' => $href Стандартные модули в Opencart мы избавили от возможности генерировать дубли страниц в магазине. Далее переходим на отдельные места, где неправильные ссылки. Страница производителя Открываем контроллер (catalog/controller/product/manufacturer.php) В начало функции подключаем модель: $this->load->model('catalog/category'); Перед $this->data['categories'][$key]['manufacturer'][] = array( Вставляем $product_path = $this->model_catalog_category->getProductPath($result['product_id']); if($product_path){ $href = $this->url->link('product/product', 'path=' . $product_path . '&product_id=' . $result['product_id']); }else{ $href = $this->url->link('product/product', 'product_id=' . $result['product_id']); } И строку 'href' => $this->url->link('product/manufacturer/info', 'manufacturer_id=' . $result['manufacturer_id']) Заменяем на: 'href' => $href Блок рекомендуемых на странице товара Открываем контроллер (catalog/controller/product/product.php) Перед if ($result['image']) { Вставляем $product_path = $this->model_catalog_category->getProductPath($result['product_id']); if($product_path){ $href = $this->url->link('product/product', 'path=' . $product_path . '&product_id=' . $result['product_id']); }else{ $href = $this->url->link('product/product', 'product_id=' . $result['product_id']); } И строку 'href' => $this->url->link('product/product', 'product_id=' . $result['product_id']) Заменяем на: 'href' => $href Страница акций(product/special) Открываем контроллер (catalog/controller/product/special.php) В начало функции подключаем модель: $this->load->model('catalog/category'); Перед if ($result['image']) { Вставляем $product_path = $this->model_catalog_category->getProductPath($result['product_id']); if($product_path){ $href = $this->url->link('product/product', 'path=' . $product_path . '&product_id=' . $result['product_id']); }else{ $href = $this->url->link('product/product', 'product_id=' . $result['product_id']); } И строку 'href' => $this->url->link('product/product', 'product_id=' . $result['product_id']) Заменяем на: 'href' => $href Страница результатов поиска Открываем контроллер (catalog/controller/product/search.php) В начало функции подключаем модель: $this->load->model('catalog/category'); Перед if ($result['image']) { Вставляем $product_path = $this->model_catalog_category->getProductPath($result['product_id']); if($product_path){ $href = $this->url->link('product/product', 'path=' . $product_path . '&product_id=' . $result['product_id']); }else{ $href = $this->url->link('product/product', 'product_id=' . $result['product_id']); } И строку 'href' => $this->url->link('product/product', 'product_id=' . $result['product_id']) Заменяем на: 'href' => $href Страница сравнения товаров Открываем контроллер (catalog/controller/product/compare.php) В начало функции подключаем модель: $this->load->model('catalog/category'); Перед if ($product_info['image']) { Вставляем $product_path = $this->model_catalog_category->getProductPath($product_info['product_id']); if($product_path){ $href = $this->url->link('product/product', 'path=' . $product_path . '&product_id=' . $product_info['product_id']); }else{ $href = $this->url->link('product/product', 'product_id=' . $product_info['product_id']); } И строку 'href' => $this->url->link('product/product', 'product_id=' . $product_info['product_id']) Заменяем на: 'href' => $href
  10. В одном из проектов интернет-магазина керамики заказчик захотел видеть в функционале магазина «Вывод коллекций плитки определенного производителя». В одном из проектов интернет-магазина керамики заказчик захотел видеть в функционале магазина «Вывод коллекций плитки определенного производителя». Сами «коллекции» это не что иное, как категории, а товары это уже сама плитка. Решением было сделать дополнительный вывод категорий производителя. Однако у нас в магазине не было связки категории и производители, а делать её в админке вручную, при этом создавая дополнительные поля в базе данных, я считаю нецелесообразным. Да и при каждом изменении, удалении или дополнении товаров, категорий каждый раз все связки категорий и производителей надо делать вручную, что согласитесь и неудобно и можно во всем запутаться. Для вывода категорий конкретного производителя мы будем использовать связь товар с производителем, который есть в стандартном исполнении магазина. Для этого выберем сначала все товары производителя, а потом циклом, используя связь товар – категории, сделаем выборку уникальных значений всех категорий, так как в одной может быть много товаров. Этими манипуляциями мы получили все id категорий в которых есть товары определенного производителя. Остается теперь сделать выборку данных о категориях. Для этого можно использовать стандартные методы. После получения массива с данными, выводим его на странице в opencart. Реализацию данного функционала разделим на три этапа: 1. Открываем файл модели, и добавляем функцию для выборки категорий товара (всех тех категорий в которых присутствует товар) по адресу: /catalog/model/catalog/category.php Находим строку: public function getCategoryFilters($category_id) Перед! этой строкой вставляем нашу функцию: public function getProductCategories($product_id) { $query = $this->db->query("SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "'"); return $query->rows; } 2. Вставляем в контроллер код, который получая массив из id продуктов данного производителя делает по циклу, перебирая все id, выборку категорий каждого товара и добавляет уникальные значения id категорий в массив всех категорий в которых есть товар этого производителя. Далее мы циклом делаем выборку всех данных категории и записываем нужные (изображение, ссылка, имя) данные в массив категорий. Для добавления этого кода переходим по адресу: /catalog/controller/product/manufacturer.php Находим строку: $manufacturer_info = $this->model_catalog_manufacturer->getManufacturer($manufacturer_id); Перед! этой строкой вставляем наш код:: $this->load->model('catalog/category'); $categories = array(); $products_ids = $this->model_catalog_product->getProducts(array('filter_manufacturer_id' => $manufacturer_id)); foreach ($products_ids as $id) { $manufacturer_products[] = array('product_id' => $id['product_id']); $product_categories = $this->model_catalog_category->getProductCategories($id['product_id']); foreach ($product_categories as $product_category){ if (!in_array($product_category['category_id'], $categories)) { $categories[] = $product_category['category_id']; } } } $this->data['manufacturer_categories'] = array(); foreach ($categories as $value) { $categories_data = $this->model_catalog_category->getCategory($value); if ($categories_data['image']) { $image = $this->model_tool_image->resize($categories_data['image'], $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height')); } else { $image = false; } $this->data['manufacturer_categories'][] = array( 'category_id' => $categories_data['category_id'], 'name' => $categories_data['name'], 'thumb' => $image, 'href' => $this->url->link('product/category', '&path=' . $categories_data['category_id']) ); } 3. После добавления всего программного кода, нам необходимо сделать вывод категорий производителя на страницу информации о производителе и его товарах. Для этого открываем файл шаблона по адресу: /catalog/view/theme/default/template/product/manufacturer_info.tpl Находим строку: <?php if ($products) { ?> Перед! этой строкой вставляем код вывода всех категорий производителя: <?php if ($manufacturer_categories) { ?> <div class="category-list"> <?php foreach ($manufacturer_categories as $category) { ?> <div> <?php if ($category['thumb']) { ?> <a href="<?php echo $category['href']; ?>"> <img src="<?php echo $category['thumb']; ?>"> </a> <?php } ?> </div> <a href="<?php echo $category['href']; ?>"> <?php echo $category['name']; ?> </a> <?php } ?> </div> <?php } ?> После несложных манипуляций с кодом, мы получаем категории производителя, которые формируеются автоматически. ———- UPD ———- По просьбам людей, которые прочитали эту статью — напишу еще небольшое дополнение. При переходе в одну из категорий выводятся все товары, независимо от производителя. Как мне пишут, что в некоторых магазинах это не логично и требуется, что бы выводились товары, производителя из которого мы перешли. Для наглядности приведу пример. Мы открыли страницу производителя Apple. С помощью этой доработки, у нас, помимо товаров, вывелись еще и категории, в которых есть товары этого бренда. Категории будут: Телефоны, Планшеты, Ноутбуки. При переходе в Телефоны у нас будет стандартный вывод всех телефонов, и Apple и Samsung и других производителей. Так вот, требуется сделать, при заходе в категории Apple, вывод только продуктов этого производителя. Для этого нам надо как-то передать на категорию параметр фильтрации по производителю. Будем использовать старый добрый, может не такой эстетичный, но рабочий, прием с GET переменной. Для формирования ссылки на категории с параметром фильтрации нам надо открыть контроллер производителя catalog/controller/product/manufacturer.php и перед: $this->data['manufacturer_categories'] = array(); Добавить: $this->data['manufacturer_id'] = $manufacturer_id; После этого переходим в файл шаблона catalog/view/theme/default/template/product/manufacturer_info.tpl и ищем цикл вывода категорий производителя: <?php foreach ($manufacturer_categories as $category) { ?> Все ссылки вида: <a href="<?php echo $category['href'];"> Делаем такими: <a href="<?php echo $category['href']; ?>?m=<?php echo $manufacturer_id; ?>"> То есть мы добавляем параметр GET к ссылке. Этот метод будет работать, если у вас включено ЧПУ, если нет, то знак ? надо поменять на знак &. После таких изменений у нас переходя в категорию бренда, будет передаваться данные для фильтрации по производителю. Но что бы стандартный вывод товаров в категории понял этот параметр, нам надо открыть контроллер категории catalog/controller/category.php и найти строку: 'filter_category_id' => $category_id, После нее вставляем: 'filter_manufacturer_id' => isset($this->request->get['m'])?$this->request->get['m']:false, После этих изменений ссылки у нас будут в конце с параметром производителя вида site.com/category/?m=11, что не совсем красиво, но оно не мешает и прекрасно выполняет поставленную функцию.
  11. В Opencart есть страница всех производителей. В стандартном функционале и шаблоне посетителю сайта доступно только название. Мы же будем выводить логотипы В Opencart есть страница всех производителей, где есть их перечень. В стандартном функционале и шаблоне посетителю сайта доступный поиск по первой букве и названия производителей. Однако, как известно визуально информация ищется быстрее и проще. А наша цель как раз и состоит в том, что бы сделать использование нашего магазина максимально простым и понятным. Для модернизации страницы мы сделаем вывод логотипов производителей. Первым шагом будет добавление в контроллер формирования изображений. Для этого открываем файл: /catalog/controller/product/manufacturer.php Находим строки: $results = $this->model_catalog_manufacturer->getManufacturers(); foreach ($results as $result) { После них вставляем: if ($result['image']) { $image = $this->model_tool_image->resize($result['image'], $this->config->get('config_image_category_width'), $this->config->get('config_image_category_height')); } else { $image = false; } Немного ниже ищем строки: $this->data['categories'][$key]['manufacturer'][] = array( Ниже нее добавляем: 'thumb' => $image, Сохраняем, теперь в данных которые передаются в наш шаблон есть изображения производителей. Далее редактируем шаблон, открываем: /catalog/view/theme/default/template/product/manufacturer_list.tpl Находим строки: <li><a href="<?php echo $category['manufacturer'][$i]['href']; ?>"><?php echo $category['manufacturer'][$i]['name']; ?></a></li> Заменяем эту сроку на строку где уже есть вывод логотипов: <li><a href="<?php echo $category['manufacturer'][$i]['href']; ?>"><img src="<?php echo $category['manufacturer'][$i]['thumb']; ?>" title="<?php echo $category['manufacturer'][$i]['name']; ?>" alt="<?php echo $category['manufacturer'][$i]['name']; ?>"><br><?php echo $category['manufacturer'][$i]['name']; ?></a></li> Все готово! Теперь на странице вывода производителей будут выводится еще и логотипы. В данном случае все сделано на стандартном шаблоне, но перенести код на другой и стилизировать отображение не составит труда. Пример можно посмотреть на демо станице.
  12. Доработка сортировка рекомендованных товаров по категориям В Opencart есть очень полезная функция рекомендованных товаров. Однако в стандартном исполнении очень не хватает сортировки по категориям. Согласитесь, что к ноутбуку могут быть множество аксессуаров, наушники, мышки, сумки и тому подобное. Рекомендованных товаров может быть большое количество, и если пользователю нужны только мышки, при стандартном исполнении, ему нужно все просматривать, что согласитесь неудобно. В данной доработке мы сделаем вывод рекомендованных товаров по категориям. С помощью дополнительных скриптов, например скрывающегося и раскрывающегося блока div можно показать только названия категорий, а содержимое, то есть все товары скрыть и при нажатии нужной категории покупатель увидит все рекомендованные товары, которые ему интересные. Для реализации задуманного нам надо будет изменить три файла и соответственно разделим все на три этапа. 1. Для начала добавим функцию выборки всех категорий в которых находится данный товар. Для этого открываем файл: /catalog/model/catalog/product.php Находим строку: public function getProductRelated($product_id) { Перед ней вставляем: public function getProductCategory($product_id) { $product_data = array(); $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_to_category p2c LEFT JOIN " . DB_PREFIX . "product p ON (p2c.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p2c.product_id = '" . (int)$product_id . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'"); foreach ($query->rows as $result) { $product_data[$result['category_id']] = $this->model_catalog_category->getCategory($result['category_id']); } return $product_data; } Сохраняем, теперь у нас есть массив с id категорий товара. 2. Далее добавим необходимый функционал в контроллер, для этого открываем: /catalog/controller/product/product.php Находим строки: $this->data['products'] = array(); После неё вставляем: $this->data['categories'] = array(); $category_names = array(); Далее находим строку $this->data['products'][] = array( Перед ней вставляем: $category_data = $this->model_catalog_product->getProductCategory($result['product_id']); foreach($category_data as $id){ $category_name = $id['name']; $category_category_id = $id['category_id']; $category_sort_order = $id['sort_order']; } Далее находим строку: 'name' => $result['name'], После нее вставляем: 'category_name' => $category_name, 'category_id' => $category_category_id, 'category_sort' => $category_sort_order, Далее находим строку: 'href' => $this->url->link('product/product', 'product_id=' . $result['product_id']) После нее вставляем: if(!in_array($category_name, $category_names)){ $category_names[] = $category_name; } $this->data['products_cat'] = $category_names; Далее находим строку: $this->data['tags'] = array(); Перед ней вставляем: foreach ($this->data['products_cat'] as $name) { $products = array(); foreach ($this->data['products'] as $result) { if($name == $result['category_name']){ $products[] = array( 'product_id' => $result['product_id'], 'thumb' => $result['thumb'], 'name' => $result['name'], 'price' => $result['price'], 'special' => $result['special'], 'rating' => $result['rating'], 'reviews' => $result['reviews'], 'href' => $result['href'] ); } } $this->data['categories'][] = array( 'name' => $name, 'products' => $products ); } Сохраняем, теперь у нас есть массив с категориями у которого есть массив с товарами этих категорий. Осталось дело за малым, отредактировать вывод рекомендованных товаров. 3. Для этого открываем файл шаблона: /catalog/view/theme/default/template/product/product.tpl Находим строку: <?php if ($products) { ?> Заменяем её на: <?php if ($categories) { ?> Далее находим строку: <?php foreach ($products as $product) { ?> Заменяем её на строки: <?php foreach ($categories as $category) { ?> <h2><?php echo $category['name']; ?></h2> <?php foreach ($category['products'] as $product) { ?> Далее находим строку: <a class="button" onclick="addToCart('<?php echo $product['product_id']; ?>');"?><?php echo $button_cart; ?> После неё добавляем: <?php } ?> Все готово! После внесения изменений все рекомендованные товары сортируются по категориям.
  13. Как же бывает часто при разработке интернет-магазина на базе opencart надо для некой категории или для определенного товара делать вывод по другому шаблону или же для определенных позиций выводить специфические данные. Как же бывает часто при разработке интернет-магазина на базе opencart надо для некой категории или для определенного товара делать вывод по другому шаблону или же для определенных позиций выводить специфические данные. Как правило, многие программисты делают условия для вывода другого дизайна, зная id категории или товара, например: <?php if($product_id == 563){ ?> Расположение: <?php echo $location; ?><br> Код производителя: <?php echo $sku; ?> <?php } ?> Этот подход хорош тем, что его сделать не сложно, быстро и удобно. Однако, в ситуациях когда для каждого товара надо сделать вывод разных данных этот метод превратит код шаблона product.tpl или category.tpl в множество условий и увеличению кода. В дальнейшем поддержка и изменения будут очень проблематичными из-за плохой читаемости кода и его размеров. Однако, учитывая особенность структуры opencart создать для каждого товара свой шаблон не составит труда. Для этого нам надо изменить в контроллере вывод шаблона и присвоить в админке какой то переменной имя этого шаблона. Для начала сделаем поле для ввода имени используемого шаблона страницы в админке. Для этого я рекомендую использовать любую ненужную вам переменную, например mpn, эта переменная появилась в версии 1.5.5.1 и на практике лишь единицы её используют. Если вы в ней не сохраняете никаких данных то смело можно использовать под наши цели. mpn в opencart имеет ограничение в 64 символa на уровне базы данных, но для названия шаблона страницы хватит. Для того, что бы её задействовать в магазине достаточно просто изменить языковый файл и переименовать «mpn» в «Имя шаблона» в файле /admin/language/russian/catalog/product.php Далее в админке пишем название, например template_for_notebook, в директории /catalog/view/theme/default/template/product копируем файл product.tpl и назначаем ему имя которое соответствует введенному только уже с расширение .tpl в нашем случае это template_for_notebook.tpl. Для того что бы все это заработало нам необходимо просто заменить пару строчек в файле /catalog/controller/product/product.php. Находим: if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/product/product.tpl')) { $this->template = $this->config->get('config_template') . '/template/product/product.tpl'; } else { $this->template = 'default/template/product/product.tpl'; } Заменяем на код if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/product/'.$product_info['mpn'].'.tpl')) { $this->template = $this->config->get('config_template') . '/template/product/'.$product_info['mpn'].'.tpl'; } else { if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/product/product.tpl')) { $this->template = $this->config->get('config_template') . '/template/product/product.tpl'; } else { $this->template = 'default/template/product/product.tpl'; } } После этих манипуляций можно смело редактировать файл /catalog/view/theme/default/template/product/template_for_notebook.tpl т.к. он будет отвечать лишь за отображения товара в котором мы прописали этот шаблон.
  14. В Opencart второй версии (2.х) в настройках магазина появилася вкладка FTP. Она нужна для сохранения настроек ftp доступа к серверу и дает возможность установить модуль (дополнение) прямо из админки. Казалось бы где-же та ложка дёгтя и есть ли она вообще? В Opencart второй версии (2.х) в настройках магазина появилася вкладка FTP. Она нужна для сохранения настроек ftp доступа к серверу и дает возможность установить модуль (дополнение) прямо из админки. Это очень удобно т. к. для того что бы поставить модуль надо зайти в Дополнения — Установка дополнений и нажать кнопку Загрузить. После этого достаточно перейти в Менеджер дополнений и очистить кеш модификаторов. На этом все, никаких подключений на сервер и копирований файлов. Все понятно Почему настраивать FTP не наш путь? Казалось бы где-же та ложка дёгтя и есть ли она вообще? Есть и очень большая. Дело в том что не все пользователи знают вообще что такое FTP и где брать эти чудные параметры (сервер, порт, логин и т. д.). А те кто знают, зачастую упускают настройку FTP каталог и пополнения просто устанавливаются не туда что приводит к недопониманиям и ошибкам в работе магазина и беспорядку на сервере. Также остро стоит дело за безопасностью магазина который в админке хранит FTP настройки со всеми данными. Дело в том что магазин банально могут взломать и увидеть все эти параметры. А дальше без препятствий зайти на сервер и сделать с сайтом все что угодно. Все так плохо? Нет! Конечно же альтернатива всегда есть. Некий добрый человек выпустил маленький, бесплатный но очень полезный мод под названием localcopy. В чем его особенность? Однажды установив к себе в магазин это дополнение, вы можете выключить вообще FTP и никогда его не трогать. Модули без фтп устанавливаются также в пару кликов! Вы получаете возможность быстрой установки при этом сохраняя магазин в безопасности. Скачать этот чудный мод. Пользуйтесь quickfix2.2.01d757df2e4.zip
  15. CMS Opencart позволяет создать интернет магазин без больших финансовых вливаний и с достаточно хорошим функционалом. Но если вы заказали/разработали сайт на опенкарте перед запуском необходимо будет сделать его аудит. Пару рекомендаций, которые позволят сайту лучше себя чувствовать. По технической тематике На сайте должна быть иконка favicon — она отображается в Яндекс поиске. Должна обязательно быть карта сайта. Она есть из коробки в движке - Модули - Каналы продвижения - Google sitemap. Проверьте правильный ли у вас файл robots.txt в нем надо указать что запрещено к индексации и директивы host, sitemap Не должно быть дублей главной страницы. Сайт должен работать либо с www либо без. Главная должна открываться только по ссылке https://site.com, такие варианты как: "https://www.site.com”, “https://www.site.com/”, "https://www.site.com/index.php”, "https://www.site.com/index.php?route=common/home” должны 301 редиректом отправлять на один адрес главной страницы. На главной ссылку с логотипа надо убрать, на других должна вести на главную. Главная страница должна содержать обязательно тег H1 и текст описания магазина, можно например внизу сайта. Мета теги на главной также должны присутствовать. Все ссылки должны быть ЧПУ. Товаров, Категорий и всех системных Все внешние ссылки закрыты от индексации Поиск товара должен быт на видном месте и работать с автоподолнением, то есть живой - как в поисковых системах Если есть возможность создавайте посадочные страницы под низкочастотные запросы — это очень полезная практика. Страницы сортировок, лимитов и другие не нужные должны быть закрыты от индексации. Страницы пагинации должны содержать тег prev и next что бы явно указать цепочку поисковым роботам. Все ненужные ссылки такие как ссылка со сравнение товаров, вход в кабинет и т. п. должны скрываться от индексации. Страницы категорий, товаров и другие не должны содержать дубли. Это очень важно. Для Opencart рекомендую ставить систему формирования ссылок SEO PRO. Стандартное формирование ЧПУ порождает много дублей. В настройках магазина включите сжатие на уровень 5 Магазин должен давать правильные ответы. Где нужны 301 редиректы — 301, где 200 — там и 200. А где нет страницы — обязательно 404 что бы роботы удалили из поиска. В файле htaccess либо на хостинге включите кеширование статических данных в браузере пользователя. В моем хостинге такое можно настроить поставив пару галочек в панели управления хостингом. На важных страницах сайта должны быть кнопки поделиться в соц сетях, они часто дают неплохой трафик из соц сетей На сайте должны быть счетчики Яндекс метрики и Google analytics – по ним поисковый робот также анализирует поведерческий фактор на сайте, а он очень важный для оценки вашего магазина. Магазин должен иметь микроразметку для лучшего понимания поисковыми роботами и отображения красивого сниппета в поисковой выдаче. Понятно, что современный сайт должен быть адаптивный — отображаться на всех устройствах корректно и без горизонтальной прокрутки. Сайт не должен содержать ошибок в коде. Проверить можно через валидатор W3C Все картинки должны иметь атрибут alt На странацах должен быть только один тег H1 Скорость генерации страниц (ответ сервера) должна быть чем меньше — тем лучше. Если сайт подтормаживает, надо оптимизировать код и запросы в базу данных. После оптимизации будет легче как вашему сайту, так и серверу. Есть отличный модуль кеширования который можно поставить после оптимизации. Скорость загрузки должна быть в зеленой зоне, этого достичь очень сложно, а иногда невозможно, в рамках проекта или шаблона. Но оценка должна быть максимально возможной. Рекомендуется подтягивать сайт уже после доработки всего функционала. Проверить можно в google page speed По юзабилити Все что важно — должно бросаться в глаза. Это как номера с адресом компании, так и цена в каталоге. Не надо скрывать или делать незаметными то что действительно важно. Для проверки этого пункта надо зайти в сайт и представить себя покупателем — купили бы вы что-то у себя? Все элементы должны иметь отступ, нельзя делать обтекание элементов без отступа или прислонять блоки без разграничения. Меню должно быть расширенное, что бы покупатель заходит на конечную страницу всего одним кликом. В целом не надо делать сложную навигацию что бы не меню не было возможности отобразить. Все должно быть просто Карточка товара должна содержать информацию о преимуществах магазина, доставке и оплате. В магазине всегда должны быть какие-то акции или промо материалы, страницы и т. п. Это все маркетинг. Если магазин будет из СССР без хоть какого-то стикера Акция или Скидка покупателю будет просто неинтересно т. к. все мы любим скидки и немного сэкономить. Описания, фото и другой материал относящийся к товару должен быть качественным. Встраницы 404 надо оформлять в стиле сайта и с возможностью перехода дальше. Например покупатель зашел на несуществующую а ему предложат зайти в другие разделы. Такой ход явно задержит его на сайте Если все это будет сделано в вашем магазине - он будет на голову выше тех кто этого еще не сделал. Так что делайте ваши сайты лучше и качественней. Не забывайте делиться мнениями в комментариях.
  16. С версии Opencart 2.x при редактировании заказа часто можно увидеть досадную ошибку которая стопорит обработку заказов - всплывающее окно браузера error - undefined. Баг этот появляется из-за перевода сайта на https. Когда вы переводите свой магазин на защищенный протокол ssl первым делом правятся конфигурационные файлы config.php и admin/config.php. В них есть переменные HTTP_... и HTTPS_... в каждую из них и пишем версию сайта защищенную и обычную. А из-за того что там разные адреса http и https - Opencart ловит баг и не дает редактировать наши заказы. Как убрать ошибку error undefined Устранить проблему очень просто - достаточно в папке admin в файле config.php прописать адрес. с https для всех версий сайта и ошибка уйдет. Я не думаю что вы часто переключаете магазин с https на обычный протокол тем более для админки, так что это полностью рабочий метод. Что если этот метод не помогает? Заходим в файл admin/controller/sale/order.php Находим строку $data['store_url'] = $order_info['store_url']; и заменяем на $data['store_url'] = substr($order_info['store_url'], 1 + strpos($order_info['store_url'], ":")); После чего ошибки не должно возникать
  17. С коробки сортировка на странице акции по цене работает не правильно. Исправляем баг Opencart Недавно столкнулся с тем что мне надо было сделать сортировку по цене от меньшего к большему на странице Акции (product/special). Вся проблема заключается в том что такая сортировка предусмотрена в Opencart на странице акций, но она неправильно работает. Вообще, что бы задать сортировку на странице категории где есть перечень товаров достаточно указать ее вверху файла а именно задать строку $sort = 'p.price'; и немного ниже указать ASC или DESC, например $order = 'ASC'; В таком случае у нас товары в категориях буду сортироваться по цене от меньшей и большей. Но на странице акций этот трюк не подойдет. Почему так? Дело в том что на этой странице все товары идут акционные и цена их берется из таблицы product_special где цена обозначается как ps.price. Но все равно когда мы поставили эти значения у нас нет сортировки по цене. Проблема в том что mysql там сортирует как текстовое значение а не как числовое. Для того что бы работало нам надо просто добавить в сортировку +0. Таким образом мы переведем в числовой формат и сортировка будет натуральной. До изменений сортирует так: 1000, 11, 147 и т.п. После правок сортировать будет как надо: 11, 147, 1000 Итак, приступим. Открываем файл catalog/model/catalog/product.php и находим метод getProductSpecials где строку: $sql .= " ORDER BY " . $data['sort']; Заменяем на: if ($data['sort'] == 'ps.price') { $sql .= " ORDER BY (" . $data['sort'] . "+0)"; }else{ $sql .= " ORDER BY " . $data['sort']; } чистим модификаторы и наслаждаемся результатами
  18. Сортировка товаров в Opencart по названию в списке никак не хотело выводить в нужном порядке. Пришлось искать обходной путь Как-то у меня появилось задание - починить сортировку по алфавиту, то есть по названию товара. К моему большому удивлению в списке товаров сортировка не работала, было все в разброс. Код стоял стандартный Opencart где в методе выборки товаров четко задана сортировка $sql .= " ORDER BY LCASE(" . $data['sort'] . «)"; но это не срабатывало. Подозрение пало на старую версию mysql на сервере, в которой есть такие проблемы. Решается это достаточно просто. Открываем файл catalog/model/catalog/product.php находим строку $sql .= " ORDER BY LCASE(" . $data['sort'] . ")"; И меняем на $sql .= " ORDER BY BINARY(lower(" . $data['sort'] . "))"; Таким образом у нас выровняется сортировка по алфавиту. Но метод обходной и я рекомендую просто обновить mysql на сервере.
  19. Для сортировки элементов в списке можно использовать javascript библиотеку jquery.ui. Для её работы необходимо подключить скрипт. Открываем файл admin/view/template/common/header.tpl находим строку подключения jquery, например <script type="text/javascript" src="view/javascript/jquery/jquery-2.1.1.min.js"></script> и сразу после нее вставляем строку подключения jquery.ui <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script> После этого открываем файл шаблона модуля рекомендуемые по адресу admin/view/template/module/featured.tpl где находим строки <script type="text/javascript"><!-- после них вставляем $(document).ready(function(){ sortable_product(); }); function sortable_product(){ $('#featured-product').sortable({ cursor: 'move' }); $('#featured-product').disableSelection(); } И в Ajax запросе там где success и select в конец добавляем вызов функции sortable_product(); Таким образом мы добавили сортировку рекомендуемых товаров простым перемещением курсора мышки Такую сортировку можно применить по аналогии в любых списках - что дает нам еще больше удобства в админке.
  20. Делюсь скриптом простого удаления всех ненужных фото удаленных товаров Когда в Opencart удаляется товар, фото физически остается на сервере а удаляется лишь в базе сам товар и привязка к файлу. Чем это плохо? Первое - это накопление ненужных файлов. Как следствие, для магазина требуется еще больше памяти на сервере, а это дополнительные затраты. Второе - при наличии большого количества файлов сайт может подтормаживать. По-этому хочу поделится с вами скриптом, который сможет удалить все неиспользуемые фото товара. Скрипт достаточно простой и по желанию можно доработать под свои потребности. Сразу хочу сказать, что фото должны быть в отдельной папке от всех остальных изображений, баннеров, картинок шаблона и т.п. То есть фото полностью отделено от магазина. Код скрипта можно вставить например в admin/controller/common/header.php в функцию index echo "<pre>"; $net = 0; $find_files = $this->scan_Dir(DIR_IMAGE . "data"); // здесь указываем директория где есть только фото товаров if($find_files){ foreach($find_files as $file){ $image = explode("www/image/", $file); $query = $this->db->query("SELECT product_id FROM oc_product WHERE image = '".$image[1]."'"); //главное фото if(!$query->rows){ $query_dop = $this->db->query("SELECT * FROM oc_product_image WHERE image = '".$image[1]."'"); //доп фото if(!$query_dop->rows){ //echo $file . "<br>"; //можно раскомментировать строку - отображение файла который удаляется unlink($file); $net++; } } } } echo "Всего фото: " . count($find_files) . "<br>"; echo "Удалено: " . $net . "<br>"; echo "</pre>"; И перед функцией index вставляем функцию сканирования папки: public function scan_Dir($dir) { $dir = str_replace("//", "/", $dir); $arrfiles = array(); if (is_dir($dir)) { if ($handle = opendir($dir)) { chdir($dir); while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { if (is_dir($file)) { $arr = $this->scan_Dir($file); foreach ($arr as $value) { $arrfiles[] = $dir."/".$value; } } else { $arrfiles[] = $dir."/".$file; } } } chdir("../"); } closedir($handle); } return $arrfiles; } После сохранения - заходим в админку и смотрим на статистику сколько есть файлов и сколько удалено лишних. В примере поставлен стандартный префикс oc_ для таблиц в Opencart, если у вас другой (смотрите конфиг) поменяйте. Вообще что бы не копились фото при удалении товара а сразу удалялись рекомендую использовать бесплатный модуль. delete_images.ocmod.zip
  21. Дорабатываем поиск что бы искал не только товары, но и категории Приветствую друзья! Сегодня я хочу поделиться решением которое позволит выполнять поиск не только по товарам а и по категориям. Зачем это нужно Во-первых, идет более понятная выдача, многие покупатели просто не хотят искать в категориях ту что надо, особенно если их много. Они просто вбивают в поиск название того что ищут. Например, это может быть запрос Велосипед или Мотоцикл. Во-вторых, в магазинах часто идет название категории а в ней идут модели товаров, часто без названия что это именно. Тот же пример на велосипедах. Есть категория Велосипеды в ней идут товары в названия которых есть только бренд и модель. В таком случае в стандартном поиске ничего не будет найдено из-за того что нет вхождений поискового запроса в названии товара. Совсем другое дело когда мы добавим поиск по категориям, и тогда при поиске у нас будет выведена категория Велосипеды, перейдя в которую покупатель найдет то, что он искал. Как это сделать Для начала нам надо в модель добавить метод выборки категорий по исковому запросу. Для этого открываем файл catalog/model/catalog/category.php и добавляем эту функцию: public function getCategoriesLive($search) { $category_data = array(); $sql = "SELECT * FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE cd.name LIKE '%" . $search . "%' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND c.status = '1' ORDER BY c.sort_order, LCASE(cd.name)"; $query = $this->db->query($sql); foreach ($query->rows as $result) { $category_data[$result['category_id']] = $this->getCategory($result['category_id']); } return $category_data; } После этого надо перейти в контроллер и добавить код для формирования массива найденных категорий. Открываем файл catalog/controller/product/search.php и перед строкой $data['products'] = array(); Добавить строки: $data['cats'] = array(); $categories = $this->model_catalog_category->getCategoriesLive($search); foreach($categories as $category){ $data['cats'][] = array( 'product_id' => $category['category_id'], 'name' => html_entity_decode($category['name'], ENT_QUOTES, 'UTF-8'), 'url' => $this->url->link('product/category', 'path=' . $category['category_id']) ); } После чего переходим в шаблон и добавим вывод найденных категорий. Для этого открываем файл catalog/view/theme/ТЕМА/template/product/search.tpl где в нужном месте добавляем вывод категорий строками: <?php if ($cats) { ?> <h2>Найденные категории</h2> <ul> <?php foreach($cats as $cat) { ?> <li><a href="<?php echo $cat['url']; ?>"><?php echo $cat['name']; ?></a></li> <?php } ?> </ul> <?php } ?> Этим кодом мы заставляем поиск искать и по категориям. На этом конечно не ограничивается, это как заготовка, которую можно расширять по своему усмотрению. Понятно, по аналогии можно можно сделать и в быстром поиске, да и везде где есть поиск.
  22. Сортировка товаров в корзине по порядку добавления В Opencart с 2.x сортировка товаров в корзине не соответствует порядку их добавления. Например мы добавили домофон, кабель к нему и монитор. Так вот в корзине может быть нарушен порядок, то есть сначала будет идти кабель, потом монитор а уже после них первый добавленный домофон. Согласитесь, это не совсем логично. Виной всему будет выборка из базы данных в таблице cart. Дело в том что при запросе в базу нет условия сортировки и данные идут как им захочется. Что бы структурировать их необходимо в файле system/library/cart/cart.php строку $cart_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "cart WHERE api_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND session_id = '" . $this->db->escape($this->session->getId()) . "' ORDER BY date_added ASC"); Таким образом в конец запроса мы добавили условия сортировки - сортировать по дате добавления по возрастания. После чего в корзине будут идти товары в той последовательности в которой их добавили туда.
  23. Делаем краткие ЧПУ адреса с полноценные хлебными крошками Из коробки OcStore создает ЧПУ с вложенностью, например: Страница категории: сайт/категория/подкатегория/...и т.д. Страница товара: сайт/категория/подкатегория/товар В SEOPRO есть настройка, которая позволяет делать ЧПУ товара прямым без подкатегорий - сайт/товар Но для категорий нет такой настройки и проходится делать доработку что бы ссылка на категория была сайт/конечная-категория без вложенности промежуточных категорий. Как это сделать что бы хлебные крошки были полные а ссылка короткая? Первое, переходим в catalog/controller/common/seopro.php (catalog/controller/startup/seopro.php) и строки foreach ($categories as $category) { $queries[] = 'category_id=' . $category; } надо заменить на $queries[] = 'category_id=' . end($categories); После чего у нас ЧПУ станет коротким, в котором будет только последняя категория. Однако, при таком подходе поломаются хлебные крошки, в которых пропадет полный путь к категории. Для того что бы сделать полные хлебные крошки, нам надо позаимствовать один метод из seopro. Для этого открываем файл - контроллер категории catalog/caontroller/product/category.php где вставляем метод формирования правильного пути к категории: private function getPathByCategory($category_id) { $category_id = (int)$category_id; if ($category_id < 1) return false; static $path = null; if (!isset($path)) { $path = $this->cache->get('category.seopath'); if (!isset($path)) $path = array(); } if (!isset($path[$category_id])) { $max_level = 10; $sql = "SELECT CONCAT_WS('_'"; for ($i = $max_level-1; $i >= 0; --$i) { $sql .= ",t$i.category_id"; } $sql .= ") AS path FROM " . DB_PREFIX . "category t0"; for ($i = 1; $i < $max_level; ++$i) { $sql .= " LEFT JOIN " . DB_PREFIX . "category t$i ON (t$i.category_id = t" . ($i-1) . ".parent_id)"; } $sql .= " WHERE t0.category_id = '" . $category_id . "'"; $query = $this->db->query($sql); $path[$category_id] = $query->num_rows ? $query->row['path'] : false; $this->cache->set('category.seopath', $path); } return $path[$category_id]; } После чего находим в этом же файле строку $parts = explode('_', (string)$this->request->get['path']); И заменяем на $parts = explode('_', $this->getPathByCategory($this->request->get['path'])); Таким образом у нас ссылка будет только с последней категорией а хлебные крошки полные.
  24. Периодически проскакивают номера заказов и теряются заказы - узнаем причину и как это поправить. Очень часто ко мне обращаются мои клиенты с просьбой разобраться почему у них пропадают заказы. То есть клиенты звонят и говорят что заказ сделали но никто не перезванивает. И в админке номера заказов сбиваются. К примеру заказы были 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.
  25. Как при зажатии кнопки +/- делать ускоренное увеличение/уменьшение количества товара Как понять что кнопки мыши зажата и выполнять какое-то действие при длительном нажатии. Часто делаю калькуляторы, где есть расчеты по количеству квадратных метров, количество упаковок, добавляю +/- в товаре и другие доработки. Недавно обратился постоянный заказик с просьбой сделать ускоренное действие по зажатии кнопки мышки на + или -. У него я ранее делал кнопки + и - при нажатии на которые увеличивается или уменьшается количество товара с шагом 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%, клиент доволен. А кому надо можете использовать этот код у себя в проектах
×
×
  • Создать...