Jump to content

Recommended Posts

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 пагинацию и написать скрипт сброса фильтров, наверное позже дополню в тему

 

 

Share this post


Link to post
Share on other sites

Заметил, что если при загрузке страницы ничего не трогать и попытаться изменить сортировку, то получишь ошибку, поэтому:

 

 ajax сортировка найти строку

var url = action+sortBy+'&filter='+filter.join(',');

//и заменить ее на это:

if(!!filter){
var url = action+sortBy;
}
else{
var url = action+sortBy+'&filter='+filter.join(',');
}

 

Share this post


Link to post
Share on other sites

Обновленный скрипт:

исправлены баги + ajax пагинация

 

Спойлер
<script type="text/javascript"><!--
//ajax фильтрация
var loader = '<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>';
$(document).on('change', '.filtr_group .ajax_select',function(){
var filter = [];
var isSort = [];
$('.filtr_group .ajax_select').each(function(element) {
var val = $(this).val();
if (val) {
filter.push(val);
}
});
if ($('#input-sort').val().length > 0){
var val2 = $('#input-sort').val();
}
if (val2){
isSort.push(val2);
}
$('#pp').css('opacity', '0.3');
$('#pp').prepend(loader);
if(isSort.length < 0){
href = '{{action}}&filter='+filter.join(',');
}
else{
href = '{{action}}?'+isSort+'&filter='+filter.join(',');
}
div = $(document).find('#pp');
$(div).load(href+'#pp .product-layout', {limit: 16},
function (responseText, textStatus, xhr) {
if (textStatus == "error") {
var cn = $('header nav li a.current_page').text();
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);
setTimeout(function(){
$('.products_pag').load(document.URL + ' .products_pag');}, 100);
return false;
});
//ajax сортировка
$(document).on('change', '#product_category #input-sort', function(){
var filter = [];
$('.filtr_group .ajax_select').each(function(element) {
var val = $(this).val();
if (val) {
filter.push(val);
}
});
$('#pp').css('opacity', '0.3');
$('#pp').prepend(loader);
var action = $('header nav li a.current_page').attr('href');
var sortBy = $(this).val();
if(filter.length <= 0){
var url = action+sortBy;
}
else{
var url = action+sortBy+'&filter='+filter.join(',');
}
$(document).find('#pp').load(url+'#pp .product-layout', {limit: 16},
function (responseText, textStatus, xhr) {
if (textStatus == "error") {
var cn = $('header nav li a.current_page').text();
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(url);
setTimeout(function(){
$('.products_pag').load(document.URL + ' .products_pag');}, 100);
return false;
});
//ajax пагинация
$(document).on('click', '#product_category .pagination li a', function(){
$('.pagination li').removeClass('active');
$(this).closest('li').addClass('active');
var link = $(this).attr('href');
$(document).find('#pp').load(link+'#pp .product-layout', {limit: 16},
function (responseText, textStatus, xhr) {
if (textStatus == "error") {
var cn = $('header nav li a.current_page').text();
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(link);
setTimeout(function(){
$('.products_pag').load(document.URL + ' .products_pag');}, 100);
return false;
});
//ajax адрес в адресную строку
function setLocation(curLoc){
try {
history.pushState(null, null, curLoc);
return;
} catch(e) {}
location.hash = '#' + curLoc;
}
//--></script>

 

 

 

 

Сброс фильтров на ajax делать не стал, сделал тупо так

 

<form action="{{action}}"><button type="submit">Сбросить</button></form> (то есть вернулись на главную страницу категории, в которой находимся)

 

Share this post


Link to post
Share on other sites

Напишу здесь ключевое слово для поисковиков

Ajax фильтрация + сортировка + пагинация товаров Opencart 3x бесплатно делюсь опытом

Share this post


Link to post
Share on other sites

Еще один апдейт - на скорую руку делал и забыл поставил пробел между переменными ссылки и искомого #div

Собственно:

Спойлер
<script type="text/javascript"><!--
//ajax фильтрация
var loader = '<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>';
$(document).on('change', '.filtr_group .ajax_select',function(){
var filter = [];
var isSort = [];
$('.filtr_group .ajax_select').each(function(element) {
var val = $(this).val();
if (val) {
filter.push(val);
}
});
if ($('#input-sort').val().length > 0){
var val2 = $('#input-sort').val();
}
if (val2){
isSort.push(val2);
}
$('#pp').css('opacity', '0.3');
$('#pp').prepend(loader);
if(isSort.length < 0){
href = '{{action}}&filter='+filter.join(',');
}
else{
href = '{{action}}?'+isSort+'&filter='+filter.join(',');
}
div = $(document).find('#pp');
$(div).load(href+' #pp .product-layout', {limit: 16},
function (responseText, textStatus, xhr) {
if (textStatus == "error") {
var cn = $('header nav li a.current_page').text();
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);
setTimeout(function(){
$('.products_pag').load(document.URL + ' .products_pag');}, 100);
return false;
});
//ajax сортировка
$(document).on('change', '#product_category #input-sort', function(){
var filter = [];
$('.filtr_group .ajax_select').each(function(element) {
var val = $(this).val();
if (val) {
filter.push(val);
}
});
$('#pp').css('opacity', '0.3');
$('#pp').prepend(loader);
var action = $('header nav li a.current_page').attr('href');
var sortBy = $(this).val();
if(filter.length <= 0){
var url = action+sortBy;
}
else{
var url = action+sortBy+'&filter='+filter.join(',');
}
$(document).find('#pp').load(url+' #pp .product-layout', {limit: 16},
function (responseText, textStatus, xhr) {
if (textStatus == "error") {
var cn = $('header nav li a.current_page').text();
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(url);
setTimeout(function(){
$('.products_pag').load(document.URL + ' .products_pag');}, 100);
return false;
});
//ajax пагинация
$(document).on('click', '#product_category .pagination li a', function(){
$('.pagination li').removeClass('active');
$(this).closest('li').addClass('active');
var link = $(this).attr('href');
$(document).find('#pp').load(link+'#pp .product-layout', {limit: 16},
function (responseText, textStatus, xhr) {
if (textStatus == "error") {
var cn = $('header nav li a.current_page').text();
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(link);
setTimeout(function(){
$('.products_pag').load(document.URL + ' .products_pag');}, 100);
return false;
});
//ajax адрес в адресную строку
function setLocation(curLoc){
try {
history.pushState(null, null, curLoc);
return;
} catch(e) {}
location.hash = '#' + curLoc;
}
//--></script>

 

 

И да, в category.twig необходимо найти пагинацию и к ее родителю добавить класс

.products_pag

ну или в скрипте изменить всё на свои классы

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Similar Content

    • By Feech
      300.00 руб
      Скачать/Купить дополнение


      Last-Modified, If-Modified-Since, 304 not modified. Для Opencart 3. Ускорение индексации поисковыми системами, экономия Трафика, снижение нагрузки на сервер,
      Поддержка: OpenCart 3.x.x.x
      Возможности:
      Выводит дату последней модификации для страниц категорий, товаров и статьей и для главной страницы. Можно менять вручную дату последней модификации категорий Можно менять вручную дату последней модификации статей Можно менять вручную дату последней модификации главной страницы Установить:
      Модули/Расширения -> Установка расширений. Выбрать архив с модулем и Загрузить. Модули/Расширения -> выбрать установленный модуль (Last Modified ...) -> Активировать Зайти в активированный модуль и установить время для главной страницы Модули/Расширения -> Модификаторы. Нажать кнопку Обновить  
      Обращаем ваше внимание, что заголовок LastModified не отдаётся для WWW-доменов с включенным SSI.
      Перед покупкой проверьте передает ли ваш сервер параметры $_SERVER['HTTP_IF_MODIFIED_SINCE'] или $_ENV['HTTP_IF_MODIFIED_SINCE']
      * Если при установке модуля возникает ошибка "Директория не доступна для записи!" - необходимо поставить бесплатный модуль Localcopy OCMOD для Opencart 3
       
      Зачем нужен Last-Modified
      HTTP заголовок Last-Modified сообщает клиенту время последнего изменения страницы (объекта). Если клиент (браузер, поисковый робот) получил заголовок Last-Modified, то при следующем обращении к адресу, при условии, что страница (объект) есть в локальном кеше, он добавит вопрос If-Modified-Since(не изменилась ли страница после даты, полученной в Last-Modified). В свою очередь сервер, получив запрос If-Modified-Since должен сверить полученную временную метку с временем последнего изменения страницы и, если страница не изменялась ответить 304 Not Modified.
      Экономия Трафика
      Если страница не изменилась, то сервер прекратит передачу данных после отправки заголовков с кодом 304 Not Modified, тело страницы, изображения и другие объекты передаваться не будут.
      Снижение нагрузки на сервер
      Правильная реализация проверки времени последнего изменения страницы может значительно (до 30% и более) сократить нагрузку на сервер. Под правильной реализацией подразумевается проверка времени до начала генерации страницы на динамическом сайте. В таком случае все действия для генерации страницы (запрос контента из базы данных, парсинг шаблонов, получение комментариев и др) выполняться не будут. Особенно это актуально для сайтов с высокой посещаемостью и долгой продолжительностью визита пользователя. Пример: пользователь находится на сайте спортивных новостей и постоянно обновляет главную страницу в ожидании публикации результата матча. За несколько минут страница может быть запрошена и получена десятки раз. Если заголовок Last-Modified отдается и запрос If-Modified-Since обрабатывается правильно, то реально страница будет передана один раз, а на все последующие запросы будет выдан ответ 304 Not Modified.
      Ускорение индексации поисковыми системами
      Поисковые системы через руководство для вебмастеров рекомендуют отсылать заголовок Last-Modifiedи правильно обрабатывать If-Modified-Since.
      Добавил Feech Добавлено 19.04.2019 Категория SEO, карта сайта, оптимизация Системные требования Метод активации Без активации Ioncube Loader Нет OpenCart 3.0 ocStore 3.0 OpenCart.Pro, ocShop Обращение к серверу разработчика Нет Старая цена 600  
    • By Feech
      Поддержка: OpenCart 3.x.x.x
      Возможности:
      Выводит дату последней модификации для страниц категорий, товаров и статьей и для главной страницы. Можно менять вручную дату последней модификации категорий Можно менять вручную дату последней модификации статей Можно менять вручную дату последней модификации главной страницы Установить:
      Модули/Расширения -> Установка расширений. Выбрать архив с модулем и Загрузить. Модули/Расширения -> выбрать установленный модуль (Last Modified ...) -> Активировать Зайти в активированный модуль и установить время для главной страницы Модули/Расширения -> Модификаторы. Нажать кнопку Обновить  
      Обращаем ваше внимание, что заголовок LastModified не отдаётся для WWW-доменов с включенным SSI.
      Перед покупкой проверьте передает ли ваш сервер параметры $_SERVER['HTTP_IF_MODIFIED_SINCE'] или $_ENV['HTTP_IF_MODIFIED_SINCE']
      * Если при установке модуля возникает ошибка "Директория не доступна для записи!" - необходимо поставить бесплатный модуль Localcopy OCMOD для Opencart 3
       
      Зачем нужен Last-Modified
      HTTP заголовок Last-Modified сообщает клиенту время последнего изменения страницы (объекта). Если клиент (браузер, поисковый робот) получил заголовок Last-Modified, то при следующем обращении к адресу, при условии, что страница (объект) есть в локальном кеше, он добавит вопрос If-Modified-Since(не изменилась ли страница после даты, полученной в Last-Modified). В свою очередь сервер, получив запрос If-Modified-Since должен сверить полученную временную метку с временем последнего изменения страницы и, если страница не изменялась ответить 304 Not Modified.
      Экономия Трафика
      Если страница не изменилась, то сервер прекратит передачу данных после отправки заголовков с кодом 304 Not Modified, тело страницы, изображения и другие объекты передаваться не будут.
      Снижение нагрузки на сервер
      Правильная реализация проверки времени последнего изменения страницы может значительно (до 30% и более) сократить нагрузку на сервер. Под правильной реализацией подразумевается проверка времени до начала генерации страницы на динамическом сайте. В таком случае все действия для генерации страницы (запрос контента из базы данных, парсинг шаблонов, получение комментариев и др) выполняться не будут. Особенно это актуально для сайтов с высокой посещаемостью и долгой продолжительностью визита пользователя. Пример: пользователь находится на сайте спортивных новостей и постоянно обновляет главную страницу в ожидании публикации результата матча. За несколько минут страница может быть запрошена и получена десятки раз. Если заголовок Last-Modified отдается и запрос If-Modified-Since обрабатывается правильно, то реально страница будет передана один раз, а на все последующие запросы будет выдан ответ 304 Not Modified.
      Ускорение индексации поисковыми системами
      Поисковые системы через руководство для вебмастеров рекомендуют отсылать заголовок Last-Modifiedи правильно обрабатывать If-Modified-Since.
    • By ibond
      499.00 руб
      Скачать/Купить дополнение


      Редактор товаров в админке + Фильтр по производителю, категории, артикулу, изображению и ID
      Дополнение добавляет возможность фильтровать товары в административной панели Opencart по производителям, категориям, артикулу (Sku), изображениям и ID товара. Добавляет колонки ID товара, Артикул, Производители и  Категории в списке товаров и позволяет включать/отключать для просмотра колонки по выбору. Добавлена возможность выбора для фильтрации нескольких производителей и/или категорий.
       
      Более 115 интернет-магазинов уже используют этот модуль!
      (информация на 1 декабря 2019 года)
       
      NEW! В версии 3.2 добавлена возможность редактирования изображений, названия, модели, артикула, производителя, категорий (совместим с SEO_PRO), цены, акционной цены, количества и статуса товара не заходя в товар. Добавлена возможность группового Включения/Отключения отфильтрованных товаров. Добавлена возможность скрытия левого меню и фильтра.
       
      Демонстрация (admin):
      Логин: demo / Пароль: demo
      https://demo3ru.open.cc.ua/admin/index.php?route=catalog/product
       
      Не заменяет файлов, все изменения вносятся через OCMOD или jQuery.
       
      Работает (тестировался): OpenCart: 3.0.0.0, 3.0.1.1, 3.0.1.2, 3.0.2.0, 3.0.3.x; ocStore: 3.0.2.0.
       
      ВНИМАНИЕ!
      Версия 3.2 требует Ioncube Loader не ниже версии 10 и PHP не ниже версии 5.6 (поддерживает версии PHP 5.6, 7.0, 7.1, 7.2)! Лицензия активируется автоматически. Тех, кто не указал домен при покупке, прошу указать его в ЛС или письмом на адрес [email protected] указав при этом номер счета и ник на данном форуме.  
      Установка:
      Загрузить файл в установках расширений, перейти в модификаторы и обновить.
       
      Что нового в версии 3.2.2:
      Добавлена совместимость с ocStore 3.0.2.0. Исправлены мелкие ошибки.  
      Что нового в версии 3.2.1.2:
      Исправлены мелкие ошибки.  
      Что нового в версии 3.2.0:
      Добавлена возможность редактирования изображений, названия, модели, артикула, производителя, категорий (совместим с SEO_PRO), цены, акционной цены, количества и статуса товара не заходя в товар. Добавлена возможность группового Включения/Отключения отфильтрованных товаров. Добавлена возможность скрытия левого меню и фильтра.  
      Что нового в версии 3.1.0:
      Добавлена возможность выбора для фильтрации нескольких производителей и/или категорий. Добавлена колонка производители в список товаров. Добавлена сортировка по производителю.  
      Что нового в версии 3.0.1:
      Исправлены мелкие ошибки. Добавил ibond Добавлено 16.10.2018 Категория Фильтры Системные требования Метод активации Автоматическая активация Ioncube Loader Требуется OpenCart 3.0 ocStore 3.0 OpenCart.Pro, ocShop Не проверялось Обращение к серверу разработчика Да Старая цена 0  
    • By ibond
      Дополнение добавляет возможность фильтровать товары в административной панели Opencart по производителям, категориям, артикулу (Sku), изображениям и ID товара. Добавляет колонки ID товара, Артикул, Производители и  Категории в списке товаров и позволяет включать/отключать для просмотра колонки по выбору. Добавлена возможность выбора для фильтрации нескольких производителей и/или категорий.
       
      Более 115 интернет-магазинов уже используют этот модуль!
      (информация на 1 декабря 2019 года)
       
      NEW! В версии 3.2 добавлена возможность редактирования изображений, названия, модели, артикула, производителя, категорий (совместим с SEO_PRO), цены, акционной цены, количества и статуса товара не заходя в товар. Добавлена возможность группового Включения/Отключения отфильтрованных товаров. Добавлена возможность скрытия левого меню и фильтра.
       
      Демонстрация (admin):
      Логин: demo / Пароль: demo
      https://demo3ru.open.cc.ua/admin/index.php?route=catalog/product
       
      Не заменяет файлов, все изменения вносятся через OCMOD или jQuery.
       
      Работает (тестировался): OpenCart: 3.0.0.0, 3.0.1.1, 3.0.1.2, 3.0.2.0, 3.0.3.x; ocStore: 3.0.2.0.
       
      ВНИМАНИЕ!
      Версия 3.2 требует Ioncube Loader не ниже версии 10 и PHP не ниже версии 5.6 (поддерживает версии PHP 5.6, 7.0, 7.1, 7.2)! Лицензия активируется автоматически. Тех, кто не указал домен при покупке, прошу указать его в ЛС или письмом на адрес [email protected] указав при этом номер счета и ник на данном форуме.  
      Установка:
      Загрузить файл в установках расширений, перейти в модификаторы и обновить.
       
      Что нового в версии 3.2.2:
      Добавлена совместимость с ocStore 3.0.2.0. Исправлены мелкие ошибки.  
      Что нового в версии 3.2.1.2:
      Исправлены мелкие ошибки.  
      Что нового в версии 3.2.0:
      Добавлена возможность редактирования изображений, названия, модели, артикула, производителя, категорий (совместим с SEO_PRO), цены, акционной цены, количества и статуса товара не заходя в товар. Добавлена возможность группового Включения/Отключения отфильтрованных товаров. Добавлена возможность скрытия левого меню и фильтра.  
      Что нового в версии 3.1.0:
      Добавлена возможность выбора для фильтрации нескольких производителей и/или категорий. Добавлена колонка производители в список товаров. Добавлена сортировка по производителю.  
      Что нового в версии 3.0.1:
      Исправлены мелкие ошибки.
    • By markimax
      690.00 руб
      Скачать/Купить дополнение


      SEO мультиязык / мультирегион
      Поддерживает opencart и сборки на нем версий 1.5.x, 2.x, 3.x
      Демо
      Демо админ. части
      логин / пароль
      demo / demo
        Документация и инструкция по установке   Описание   Корректные языковые URL с языковыми префиксами,
      правильно индексируются все языковые страницы (чего нет у opencart, сборках и подобных модулях),
      поддержка мета тега hreflang,
      правильный редирект (при установленном seo_pro),
      языковые мета теги для Главной страницы,
      убирает index.php?route=common/home для Главной страницы
      поддержка мультимагазинов,
      позволяет создавать мультимагазин в подпапках,
      управляет регионами в том числе и городами,
      шорткоды привязанные к языкам, регионам, мультимагазинам,
      не изменяет системный код файлов, работает со всеми SEO формирователями ЧПУ (seo_pro, seo_url, seoblog, или вообще при выключенном ЧПУ, модулю "все равно" кто там формирует ЧПУ, он свою работу все равно сделает, причем не надо задумываться, чтобы править seo_url, или seo_pro, или кто-то придумает еще что-то, модуль все равно создаст правильный, согласно seo требований, URL для языка). И поэтому модуль выдает правильные sitemap-ы и т.п.

      Решает проблему ЧПУ для пагинации, проблема заключается в том, что при пагинации в opencart title, description одинаковые (по умолчанию в opencart и сборках) и товары однотипные в списке, то ПС могут подумать что это дубль страница, что очень негативно для seo, а благодаря модулю - этого быть не может, т.е. модуль предотвращает дубли страниц при пагинации добавляя новый title и description второстепенной страницы отличный от "главной" страницы категории, чтобы не "опустить" её в поисковой выдаче.
      Заменяет параметр первой страницы пагинации на URL без параметра
      Модуль реализует правильную SEO пагинацию вида http://site.com/page-2 и т.п.
      С изменением title документа и description HTML документа в зависимости от языка т.е.например "Компьютеры - страница 2" (русский), "Computers - page 2" (english). Также теперь нету ссылки на первую страницу (/en/desctops/page-1) заменяется на /en/desctops/)
      Даже без включения ЧПУ пагинация работает и имеет вид к примеру http://site.com/en/page-2?route=product/category&path=1_2   Модуль позволяет и имеет функционал:
        - модуль НЕ заменяет файлы системы
        - модуль НЕ использует ioncube
        - простая установка и обновление
        - правильно индексируются все языковые страницы (чего нет у opencart, сборках и подобных модулях)
        - разные SEO URL для разных языков (посредством языковых префиксов или поддоменов)
        - разные SEO URL для разных регионов (в т.ч. городов)
        - шорткоды привязанные к языкам, регионам, мультимагазинам
        - переключение валюты связанной с языком, регионом
        - поддержка мета - тега hreflang
        - отключение описании категорий на дополнительных страницах пагинации (только opencart 2.x)
        - правильная SEO пагинация (к примеру вида http://site.com/en/page-2)
        - правильные ЧПУ в переключателе языков, для каждого языка, региона (даже если ЧПУ разные)
        - автоадаптер под тему
        - развитая поддержка мультимагазинов
        - гибкая взаимосвязь с любым функционалом и модулями - виджетами платформы SEO CMS
        - совместимость с любой темой, любыми модулями, которые соотвествуют стандартам программирования и требованиям opencart
        - пользовательский css код прямо в админ. части модуля
        - поддержка любых модулей sitemap (посредством добавления префикса в URL карты магазина)
       
      Возможности
       
      - полная индексация страниц магазина для разных языков, разных регионов (в т.ч. городов)
       
      - ЧПУ пагинация
       
      - hreflang
       
      - разные мета - теги Главной страницы, для разных языков, разных регионов (в т.ч. городов)
       
      - поддержка модулей sitemap
       
      ...
       
      Чем модуль лучше других
       
      - правильная индексация языковых, региональных страниц поисковыми системами
       
      - уникальная технология добавления префиксов (языков, регионов, городов) и изменения ЧПУ пагинации
       
      - модуль НЕ патчит (средствами vqmod или ocmod) ЧПУ формирователи (seo_url, seo_pro и т.п.)
       
      - модуль работает с ЛЮБЫМИ ЧПУ формирователями (seo_url.php, seo_pro.php и любыми другими)
       
       
      Лицензия и техническая поддержка
       
      Добавил markimax Добавлено 19.04.2016 Категория SEO, карта сайта, оптимизация Системные требования PHP 5.3+ Метод активации Через официальный сайт дополнения Ioncube Loader Нет OpenCart 3.0
      2.3
      2.2
      2.1
      2.0
      1.5.6.4
      1.5.6.3
      1.5.6.2
      1.5.6.1
      1.5.6
      1.5.4.1
      1.5.3.1 ocStore 3.0
      2.3
      2.2
      2.1
      1.5.5.1.2
      1.5.5.1.1
      1.5.5.1
      1.5.4.1.2
      1.5.4.1.1
      1.5.4.1
      1.5.3.1
      1.5.2.1
      1.5.1.3 OpenCart.Pro, ocShop Opencart.pro 2.3
      Opencart.pro 2.1
      OcShop 2.0.3.х
      OcShop 1.5.6.4.х Обращение к серверу разработчика Нет Старая цена 0  
  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.