-
Публікації
117 -
З нами
-
Відвідування
Тип публікації
Профілі
Форум
Маркетплейс
Статті
FAQ
Наші новини
Магазин
Блоги
module__dplus_manager
Усі публікації користувача Blackseabreathe
-
Как?
- 1 відповідь
-
- ошибка 404
- корзина
-
(і ще %d)
Теги:
-
Судя по ф-ии в checkout/cart.php public function edit() { $this->load->language('checkout/cart'); $json = array(); // Update if (!empty($this->request->post['quantity'])) { foreach ($this->request->post['quantity'] as $key => $value) { $this->cart->update($key, $value); } $this->session->data['success'] = $this->language->get('text_remove'); unset($this->session->data['shipping_method']); unset($this->session->data['shipping_methods']); unset($this->session->data['payment_method']); unset($this->session->data['payment_methods']); unset($this->session->data['reward']); $this->response->redirect($this->url->link('checkout/cart')); } $this->response->addHeader('Content-Type: application/json'); $this->response->setOutput(json_encode($json)); } $this->response->addHeader('Content-Type: application/json'); $this->response->setOutput(json_encode($json)); Возвращаться должен json
-
По вашему примеру сделал так: data: 'quantity['+cart_id+']=' + (typeof(val) != 'undefined' ? val : 1), заместо "key" сделал cart_id так как это одно и тоже, переменная cart_id передается из checkout/cart.php ну и заместо (typeof(quantity) != 'undefined' ? quantity : 1), - (typeof(val) != 'undefined' ? val : 1), - то есть значение, которое ввел пользователь Теперь все работает, информация в БД обновляется, но все же получаю ошибку SyntaxError: JSON Parse error: Unrecognized token '<' parsererror То есть передается не json, наверное? Как можно проверить что передается?
-
Opencart 3.0.3.3 Пытаюсь сделать обновление кол-ва товара на странице корзина через Ajax. В интернете куча информации по теме, но каждая из них оказалась не результативная. У каждого товара в корзине есть поле quantity У меня оно выглядит так <input type="text" name="quantity[{{ product.cart_id }}]" value="{{ product.quantity }}" size="1" min="1" class="tac ch_quantity" oninput="updateCart('{{ product.quantity }}', '{{ product.cart_id }}', $(this).val());" /> Все из коробки, за исключением size="1" и oninput="updateCart('{{ product.quantity }}', '{{ product.cart_id }}', $(this).val());" То есть при изменении поля кол-ва я передаю в ф-ию updateCart кол-во, cart_id и введенное значение юзером Далее скрипт function updateCart(quantity, cart_id, val) { setTimeout(function(){ // ждем 100 миллисекунд //alert('quantity = '+ quantity +', cart_id = ' + cart_id + ', val = ' + val); if (quantity != 0 && quantity != 'undefined') { // если кол-во не равно 0, то делаем ajax запрос $.ajax({ url: 'index.php?route=checkout/cart/edit', // на этот урл type: 'post', //пост //data: 'cart_id['+cart_id+']='+val, //пробовал сначала этот вариант data data: 'key=' + cart_id + '&quantity=' + (typeof(val) != 'undefined' ? val : 1), // потом этот как из коробки в common.js dataType: 'json', //json success: function(json) { //да, тут кастомизированная корзина, тоесть все тоже самое что из коробки только заместо ul, li, table сделал div-"ы" (суть не меняется от этого) $('#cart .ch_allProductsWrapper').load('index.php?route=common/cart/info .ch_allProductsWrapper .ch_products'); // обновляем корзину в шапке if($('#checkout-cart').length>0){ $('#checkout-cart .ch_allProductsWrapper').load('index.php?route=common/cart/info .ch_allProductsWrapper .ch_products'); // обновляем на странице корзина } }, error: function(xhr, ajaxOptions, thrownError) { $.jGrowl(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); } }); } }, 100); } Что в итоге получается? Допустим изначально (до изменения кол-ва) все товары имеют кол-во со значением "1", далее я изменяю, например, на "12" и происходит следующее. Корзины в шапке и в теле страницы обновляются, но значения кол-ва товара снова меняется на "1", не пойму в чем дело, то есть что в Ajax запросе не так, наверное в параметре "data" что-то не так написал, уже убил времени много на это дело. Поэтому решил попросить помощи здесь. Из коробки в common.js кусок кода обновления корзины 'update': function(key, quantity) { $.ajax({ url: 'index.php?route=checkout/cart/edit', type: 'post', data: 'key=' + key + '&quantity=' + (typeof(quantity) != 'undefined' ? quantity : 1), dataType: 'json', success: function(json) { // Need to set timeout otherwise it wont update the total setTimeout(function () { $('header .headerTotal').html('<span id="cart-total">' + json['total'] + '</span>'); }, 100); if (getURLVar('route') == 'checkout/cart' || getURLVar('route') == 'checkout/checkout') { location = 'index.php?route=checkout/cart'; } else { $('#cart .ch_allProductsWrapper').load('index.php?route=common/cart/info .ch_allProductsWrapper .ch_products'); if($('#checkout-cart').length>0){ $('#checkout-cart .ch_allProductsWrapper').load('index.php?route=common/cart/info .ch_allProductsWrapper .ch_products'); } } }, error: function(xhr, ajaxOptions, thrownError) { $.jGrowl(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); } }); }, Как я понял, key значит значение cart_id из БД, но непонятно как оно оттуда достается
-
Купил модуль, ни разу не жалею, тема дефолт, но естественно полностью переделанная под свои нужды, половину js этого модуля изменил под себя, модуль сэкономил мне миллион нервов и времени, автору спасибо.
-
-
- seo url
- автозаполнение чпу
-
(і ще %d)
Теги:
- seo url
- автозаполнение чпу
- автозаполнение seo url
- автогенерация чпу
- автогенерация seo url
- автоматическая генерация seo url
- автоматическое заполнение чпу
- автоматическое заполнение seo url
- seo генератор чпу
- seo url генератор
- seo url autocomplete
- seo генератор url
- автоматическая генерация чпу
- seo url generator
-
Еще один апдейт - на скорую руку делал и забыл поставил пробел между переменными ссылки и искомого #div Собственно: И да, в category.twig необходимо найти пагинацию и к ее родителю добавить класс .products_pag ну или в скрипте изменить всё на свои классы
-
Напишу здесь ключевое слово для поисковиков Ajax фильтрация + сортировка + пагинация товаров Opencart 3x бесплатно делюсь опытом
-
Обновленный скрипт: исправлены баги + ajax пагинация Сброс фильтров на ajax делать не стал, сделал тупо так <form action="{{action}}"><button type="submit">Сбросить</button></form> (то есть вернулись на главную страницу категории, в которой находимся)
-
Заметил, что если при загрузке страницы ничего не трогать и попытаться изменить сортировку, то получишь ошибку, поэтому: /в ajax сортировка найти строку var url = action+sortBy+'&filter='+filter.join(','); //и заменить ее на это: if(!!filter){ var url = action+sortBy; } else{ var url = action+sortBy+'&filter='+filter.join(','); }
-
Opencart 3.0.3.3, default theme Привет всем. Стояла задача сделать простой магазин. Но какой магазин без ajax подгрузки товаров в аля 2К20, а? Сам я не то чтобы был полный ноль в js, нет, что-то в целом понимаю. Однако, сначала я искал готовые бесплатные плагины, но на мою версию опенкарт в общей сумме плагинов как кот наплакал, а для ajax подгрузки товаров их вообще 2, и то, один из них триальной версии на 3 дня потом плати монету. Пытался установить от shopunity ajax free filter, но мне не зашел, хотя бы на том, что там уродский вывод пунктов фильтров если выбираешь выводить как select. Ну и в целом плагин имеет много моментов, мне непонравившихся. Мне всё это не подходило и я решил сделать сам. Конечно, я хотел сделать это быстрее, поэтому искав в интете все по запросу ajax фильтрация товаров OpenCart 3, я может что-то и находил полезное, но этого было недостаточно. Однако одну функцию я все таки спер оттуда, так как свою писать было лень, да и зачем второй велосипед нужен?! Чтобы никто не писал потом что "эту функцию ты стырил оттуда-то". Скрипт на jquery, если кто-то может переписать на ванила js, будет хорошо, Ну или если кто-то сможет заменить .load на $.ajax было бы удобней, но да ладно, перейдем к сути. Строго не судите, я не гуру jq, если есть что подправить, напишите это в комментах без грязи. Делюсь своим способом ajax фильтрации товаров opencart3 и ajax сортировка <!--ajax фильтрация ++--> 0. Сначала я бы предложил для фильтров поставить плагин fixfilter opecart3x чтобы изменить логику фильтрации or/and. (Но не обязательно) 1. в category.twig (catalog/view/theme/default/template/product/category.twig) делаем обертку для вывода товаров <div id="pp" class="products_products">...тут уже цикл с выводом товаров..</div> //обернули 2. Тут же в селекте #input-sort убрать метод "onchange location = this", он нам уже не нужен 3. в category.php (catalog/controller/product/category.php) найти способы сортировки, например сортировка по умолчанию $data['sorts'][] = array( 'text' => $this->language->get('text_default'), 'value' => 'p.sort_order-ASC', //'href' => $this->url->link('product/category', 'path=' . $this->request->get['path'] . '&sort=p.sort_order&order=ASC' . $url) //копируем строку и комментируем ее на всякий случай 'href' => '&sort=p.sort_order&order=ASC',// вставляем ее ниже и изменяем на такой вид ); Тоже самое проделать со всеми другими способами сортировки, которые нужны. Мне нужны были только по цене вверх, вниз и по умолчанию; и то "по умолчанию" всегда переименовываю в "рекомендуем". 4. Идем в filter.twig (catalog/view/theme/default/template/extension/module/filter.twig) Тут уже кому как надо, а у меня стояла задача сделать вместо чекбоксов select. Собственно я изменил вывод фильтра на: <div class="the_filters df aj"> {% for filter_group in filter_groups %} <div id="filter-group{{ filter_group.filter_group_id }}" class="filtr_group"> <select name="filter[]" id="filters{{filter_group.filter_group_id}}" class="ajax_select"> <option value="{{ filter_group.name }}" disabled selected>{{ filter_group.name }}</option> {% for filter in filter_group.filter %} {% if filter.filter_id in filter_category %} <option value="{{ filter.filter_id }}" selected>{{ filter.name }}</option> {% else %} <option value="{{ filter.filter_id }}">{{ filter.name }}</option> {% endif %} {% endfor %} </select> </div> {% endfor %} <div class="part filtr_group"><button type="button" id="reset_filter">Сбросить</button></div></div> Тут должно быть все понятно, тупо из чекбокс переделал в селект, который потом подхватывает плагин select2. Кстати, рекомендую его для кастомизации селектов. Это все что будет в этом файле из разметки. Ниже будут скрипты: <script type="text/javascript"> $(document).on('change', '.filtr_group .ajax_select',function(){//обновление без кнопки "применить", если успели заметить что в разметке кнокпку убрал filter = []; //создаем резервуар для фильтров $('.filtr_group .ajax_select').each(function(element) { // каждый выбранный фильтр filter.push($(this).val()); //записываем в резервуар }); $('#pp').css('opacity', '0.3'); // самый простой способ дать уровень прозрачности блоку с товарами $('#pp').prepend('<div class="loading"><?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="margin: auto; background-image: none; display: block; shape-rendering: auto; background-position: initial initial; background-repeat: initial initial;" width="100px" height="100px" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid"><circle cx="50" cy="50" r="0" fill="none" stroke="#3e6d8d" stroke-width="2"><animate attributeName="r" repeatCount="indefinite" dur="1s" values="0;29" keyTimes="0;1" keySplines="0 0.2 0.8 1" calcMode="spline" begin="-0.5s"></animate><animate attributeName="opacity" repeatCount="indefinite" dur="1s" values="1;0" keyTimes="0;1" keySplines="0.2 0 0.8 1" calcMode="spline" begin="-0.5s"></animate></circle><circle cx="50" cy="50" r="0" fill="none" stroke="#4b9bbe" stroke-width="2"><animate attributeName="r" repeatCount="indefinite" dur="1s" values="0;29" keyTimes="0;1" keySplines="0 0.2 0.8 1" calcMode="spline"></animate><animate attributeName="opacity" repeatCount="indefinite" dur="1s" values="1;0" keyTimes="0;1" keySplines="0.2 0 0.8 1" calcMode="spline"></animate></circle></svg></div>'); // для интуитивности делаем прелоудер href = '{{action}}&filter='+filter.join(','); //тут мы берем текущую ссыль, которая конфигурируется в category.php и добавляем к ней фильтры с разделением div = $(document).find('#pp'); //куда будем загружать новые товары $(div).load(href+'#pp .product-layout', {limit: 16}, //загружаем методом jq load с лимитом 16, у кого отличается в админке кол-во вывода товаров на фронте, то изменить здесь function (responseText, textStatus, xhr) { if (textStatus == "error") { //если ошибка, то выводим текст ошибки, но я немного сделал по-своему var cn = $('header nav li a.current_page').text(); //находим название категории (но по факту текст в теге <a></a> с классом current_page) var cn_href = $('header nav li a.current_page').attr('href'); //далее берем у нее ссыль $.jGrowl('Упс, что-то пошло не так, пробуем вернуть Вас в главную категорию ' + '"'+cn+'"'); // ну и выводим соответственно текст ошибки и setTimeout(function(){window.location.replace(cn_href);}, 5000); //возвращаем покупателя главную той категории, в которой он был, но можно только вывести текст ошибки, тут уже кому как } if($('#pp .product-layout').length <= 0) { // если нет товаров по выбранной нами фильтрации, то $('#pp').text('Нет товаров, которые соответствуют критериям поиска'); //вывести этот текст } if (textStatus == "success") { // ну а если ответ успешный, то $('#pp').css('opacity', '1'); // убираем непрозрачность у блока с товарами $(document).find('.loading').remove(); //убираем прелоудер } }); setLocation(href); // адресную строку меняем в соответствие с выбранными фильтрами (функция будем ниже) return false; }); //ajax сортировка $(document).on('change', '#product_category #input-sort', function(){ //при изменении селекта сортировки + я изменил id #product-category на #product_category, а то через тире выделять неудобно filter = []; // создали резервуар фильтров $('.filtr_group .ajax_select').each(function(element) { filter.push($(this).val()); // в резервуар записали фильтры }); $('#pp').css('opacity', '0.3'); // непрозрачность установили $('#pp').prepend('<div class="loading"><?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="margin: auto; background-image: none; display: block; shape-rendering: auto; background-position: initial initial; background-repeat: initial initial;" width="100px" height="100px" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid"><circle cx="50" cy="50" r="0" fill="none" stroke="#3e6d8d" stroke-width="2"><animate attributeName="r" repeatCount="indefinite" dur="1s" values="0;29" keyTimes="0;1" keySplines="0 0.2 0.8 1" calcMode="spline" begin="-0.5s"></animate><animate attributeName="opacity" repeatCount="indefinite" dur="1s" values="1;0" keyTimes="0;1" keySplines="0.2 0 0.8 1" calcMode="spline" begin="-0.5s"></animate></circle><circle cx="50" cy="50" r="0" fill="none" stroke="#4b9bbe" stroke-width="2"><animate attributeName="r" repeatCount="indefinite" dur="1s" values="0;29" keyTimes="0;1" keySplines="0 0.2 0.8 1" calcMode="spline"></animate><animate attributeName="opacity" repeatCount="indefinite" dur="1s" values="1;0" keyTimes="0;1" keySplines="0.2 0 0.8 1" calcMode="spline"></animate></circle></svg></div>'); //прелоудер показали var sortBy = $(this).val(); // находим значение выбранного option в сортировке, то чей вывод мы изменяли в (контроллере) category.php var action = $('header nav li a.current_page').attr('href'); // берем адрес главной категории, в который находимся, так как {{action}} тут работать уже не так будет как надо// ну или найти адрес другим методом js/jq var url = action+sortBy+'&filter='+filter.join(','); // собираем в переменную куски - адрес главной категории + значение выбранной сортировки + фильтры, если есть //alert(url); // на момент тестов отслеживал какой адрес в итоге получается $(document).find('#pp').load(url+'#pp .product-layout', {limit: 16}, // опять загружаем с лимитом 16 function (responseText, textStatus, xhr) {//если ошибка, отдаем текст if (textStatus == "error") { $.jGrowl('Произошла ошибка'); } if($('#pp .product-layout').length <= 0) { // если нечего загружать, сообщаем $('#pp').text('Нет товаров, которые соответствуют критериям поиска'); } if (textStatus == "success") { // если все у всех ок, то $('#pp').css('opacity', '1'); // снимаеи непрозрачность $(document).find('.loading').remove(); // убираем прелоудер $.jGrowl('Успешная сортировка');//отдаем сообщение, тоже на момент тестов } }); setLocation(url); // записываем в адрес строку получившийся адрес return false; }); //ajax адрес в адресную строку function setLocation(curLoc){ try { history.pushState(null, null, curLoc); return; } catch(e) {} location.hash = '#' + curLoc; } /// тут тоже должно быть все ясно как ясный день </script> Дальше хочу сделать ajax пагинацию и написать скрипт сброса фильтров, наверное позже дополню в тему
-
Может проблема локальная у Вас. То есть может у Вас библиотека подключена внизу, а не вверху? И посмотреть бы на шаблон filter.twig - возможно меняли его или тема не дефолтная.
-
Еще баг - при заходе в категорию (например site.tu/cat1) и выборе фильтров все работает норм, но если выбрать любой даже 1 фильтр и перезагрузить страницу (ты попадешь на страницу с ранее выбранными уже подгруженными фильтрами) и попытаться выбрать любой другой фильтр, то будет ошибка в запросе, а именно в строке filter.join(',') Это разделение, которое почему то ставится после домена сайта site.tu/,&filter=1&filter=2....
-
Здравствуйте, ребята. Не могу разобраться как можно вывести фильтры на результатах поиска. Целый день ищу в интернете похожие темы. Из путевого понял что это нельзя сделать способом из коробки так как нужно category Id чтобы было и так далее. Но вроде как некоторые плагины умеют такое. Но все они платные, а нашему простому магазину платные модули не хотелось бы. Ну раз они умеют, значит можно ведь. Перерыл весь файл controller/category.php. Сравнил его с search.php. И там и там вроде как скрипт ищет category id. Пробовал пару строк скопировать из одного файла в другой. Но все равно нет фильтра в результатах. В php я <= 0 поэтому уж извинюльки за некомпетентность. Кто-нибудь делал это сам? Можете хоть примерно подсказать как реализовать? тема дефолтная, open cart 3.0.3.3
-
К этому плагина есть ряд вопросов "почему" (например: почему не весь стандартный функционал помещен в попа? Где "забыли пароль, уже зареганы..."). Зачем он нужен если остальное самому придется пилить?! Это же модуль готовый. Да и хрен бы с ним! Кто-нить подскажет как со своего модал окна отправлять Ajax-ом данные с форм на страницу login для их проверки на валидность и выводить ошибки тут же в модал окне? В форму авторизации добавил id #ajaxAuth и гружу ее в свое окно далее пробовал шаманить с кнопкой submit но стр редиректит все равно на login хотя попап из success срабатывает
- 21 відповідь
-
- ocstore
- модальное окно
- (і ще %d)
-
Ну да это работает на 2.3 Но блин руками все же хотелось бы добиться сделать
- 21 відповідь
-
- ocstore
- модальное окно
- (і ще %d)
-
В xml файле перед module (почти в конце) вставил extension/ и что-то бестолку
- 21 відповідь
-
- ocstore
- модальное окно
- (і ще %d)
-
Там и там submit кнопка, единственное что я заметил что у меня поля завернуты в div, но это же не играет роли никакой либо я не понял что Вы хотели показать этими скриншотами popup_logreg.ocmod.xml
- 21 відповідь
-
- ocstore
- модальное окно
- (і ще %d)