Jump to content
thirty bees forum

Beeta

Members
  • Posts

    390
  • Joined

  • Last visited

  • Days Won

    6

Everything posted by Beeta

  1. I cloned the original file AdminProductsController.php, modified as instructions and copied in the directory: override/controllers/admin/ Permissions are correct.
  2. this is working but not if I try to override it. :( I would like to override, @zimmer-media is your code working override in 1.0.7? p.s. Overrides are not disabled in "performance"
  3. Now I disabled friendly URLs and the issue is still there
  4. @traumflug I applied one of the commits, the others were already applied but the issue is still there: this is my blocklayered.js: ``` /* global paramproducturl */ var ajaxQueries = []; var sliderList = []; var slidersInit = false; function hideFilterValueAction($toggle) { var $list = $toggle.closest('ul'); var listId = $list.attr('id'); var expand = !!window.layeredhiddenlist[listId]; $list.find('.hiddable').toggle(expand); $list.find('.hide-action.less').toggle(expand); $list.find('.hide-action.more').toggle(!expand); } function addSlider(type, data, unit, format) { sliderList = sliderList.filter(slider => slider.type !== type); sliderList.push({ type: type, data: data, unit: unit, format: format }); } function initSliders() { $(sliderList).each(function (i, slider) { var $slider = $('#layered' + slider.type + 'slider'); var $sliderRange = $('#layered' + slider.type + 'range'); $slider.slider(slider.data); var from = ''; var to = ''; switch (slider.format) { case 1: case 2: case 3: case 4: from = window.formatCurrency($slider.slider('values', 0), slider.format, slider.unit); to = window.formatCurrency($slider.slider('values', 1), slider.format, slider.unit); break; case 5: from = $slider.slider('values', 0) + slider.unit; to = $slider.slider('values', 1) + slider.unit; break; } if (isRtl) { $sliderRange.html(to + ' - ' + from); } else { $sliderRange.html(from + ' - ' + to); } }); } function paginationButton(nbProductsIn, nbProductOut) { if (typeof window.currentfriendlyurl === 'undefined') { window.currentfriendlyurl = '#'; } $('.content_sortPagiBar .pagination a').each(function () { var page; if ($(this).attr('href').search(/(\?|&)p=/) === -1) { page = 1; } else { page = parseInt($(this).attr('href').replace(/^.*(\?|&)p=(\d+).*$/, '$2'), 10); } var location = window.location.href.replace(/#.*$/, ''); $(this).attr('href', location + window.current_friendly_url.replace(/\/page-(\d+)/, '') + '/page-' + page); }); //product count refresh if (nbProductsIn) { var $productCount = $('.product-count'); if (!isNaN(nbProductsIn)) { // add variables var productCountRow = $productCount.html(); var currentPageText = $('.content_sortPagiBar .pagination li.current').first().text(); var nbPage = parseInt(currentPageText, 10) || 1; var nbProducts = nbProductsIn; var nbPerPage; var $option = $('#nb_item').find('option:selected'); if ($option.length === 0) { nbPerPage = nbProducts; } else { nbPerPage = parseInt($option.val(), 10); } nbPage = isNaN(nbPage) ? 1 : nbPage; window.productShowing = (nbPerPage * nbPage) < nbProducts ? nbPerPage * nbPage : ((nbPerPage * nbPage) - nbProducts - (nbPerPage * nbPage)) * -1; window.productShowingStart = nbPage === 1 ? 1 : (nbPerPage * nbPage) - nbPerPage + 1; // insert values into a .product-count productCountRow = $.trim(productCountRow); productCountRow = productCountRow.split(' '); var backStart = []; for (var row in productCountRow) { if (productCountRow.hasOwnProperty(row)) { if (parseInt(productCountRow[row], 10) + 0 == parseInt(productCountRow[row], 10)) { backStart.push(row); } } } if (typeof backStart[0] !== 'undefined') { productCountRow[backStart[0]] = window.productShowingStart; } if (typeof backStart[1] !== 'undefined') { productCountRow[backStart[1]] = (typeof nbProductOut !== 'undefined') && (nbProductOut > window.productShowing) ? nbProductOut : window.productShowing; } if (typeof backStart[2] !== 'undefined') { productCountRow[backStart[2]] = nbProducts; } if (typeof backStart[1] !== 'undefined' && typeof backStart[2] !== 'undefined' && productCountRow[backStart[1]] > productCountRow[backStart[2]]) { productCountRow[backStart[1]] = productCountRow[backStart[2]]; } productCountRow = productCountRow.join(' '); $productCount.html(productCountRow).show(); } else { $productCount.hide(); } } } function reloadContent(paramsPlus) { var $form = $('#layered_form'); var $categoryProducts = $('#category-products'); stopAjaxQuery(); $form.addClass('loading-overlay'); $categoryProducts.addClass('loading-overlay'); var data = $form.serialize(); $('.layeredslider').each(function () { var sliderStart = $(this).slider('values', 0); var sliderStop = $(this).slider('values', 1); if ($.isNumeric(sliderStart) && $.isNumeric(sliderStop)) { data += '&' + $(this).attr('id') + '=' + sliderStart + '' + sliderStop; } }); $(['price', 'weight']).each(function (it, sliderType) { var $sliderRangeMin = $('#layered' + sliderType + 'rangemin'); var $sliderRangeMax = $('#layered' + sliderType + 'rangemax'); if ($sliderRangeMin.length) { data += '&layered_' + sliderType + '_slider=' + $sliderRangeMin.val() + '_' + $sliderRangeMax.val(); } }); $form.find('select option').each(function () { if ($(this).attr('id') && $(this).parent().val() == $(this).val()) { data += '&' + $(this).attr('id') + '=' + $(this).val(); } }); var $selectProductSort = $('.selectProductSort'); if ($selectProductSort.length && $selectProductSort.val()) { var splitData; if ($selectProductSort.val().search(/orderby=/) > 0) { // Old ordering working splitData = [ $selectProductSort.val().match(/orderby=(\w)/)[1], $selectProductSort.val().match(/orderway=(\w)/)[1] ]; } else { // New working for default theme 1.4 and theme 1.5 splitData = $selectProductSort.val().split(':'); } data += '&orderby=' + splitData[0] + '&orderway=' + splitData[1]; } var $selectN = $('select[name=n]:first'); if ($selectN.length) { if (paramsPlus) { data += '&n=' + $selectN.val(); } else { data += '&n=' + $('.showall').find('input[name="n"]').val(); } } var slideUp = true; if (typeof paramsPlus === 'undefined' || !(typeof paramsPlus === 'string')) { paramsPlus = ''; slideUp = false; } // Get nb items per page var n = ''; if (paramsPlus) { var $opt = $('.js-per-page select[name=n]').find('option:selected'); if ($opt.length) { n = '&n=' + $opt.val(); } } window.ajaxQuery = $.ajax({ type: 'GET', url: window.baseDir + 'modules/blocklayered/blocklayered-ajax.php', data: data + '&' + paramsPlus + n, dataType: 'json', cache: false, // @todo see a way to use cache and to add a timestamps parameter to refresh cache each 10 minutes for example success: function (result) { if (typeof result === 'undefined') { return; } if (result.meta_description !== '') { $('meta[name="description"]').attr('content', result.meta_description); } if (result.meta_keywords !== '') { $('meta[name="keywords"]').attr('content', result.meta_keywords); } if (result.meta_title !== '') { $('title').html(result.meta_title); } if (result.heading !== '') { $('.page-heading .cat-name').html(result.heading); } $('#layered_block_left').replaceWith(utf8_decode(result.filtersBlock)); $('.category-product-count, .heading-counter').replaceWith(result.categoryCount); if (result.nbRenderedProducts == result.nbAskedProducts) { $('.js-per-page').hide(); } if (result.productList) { $('.product_list').replaceWith(utf8_decode(result.productList)); } else { $('.product_list').html(''); } $categoryProducts.removeClass('loading-overlay'); $form.removeClass('loading-overlay'); if (result.pagination.search(/[^\s]/) >= 0) { var pagination = $('<div/>').html(result.pagination); var pagination_bottom = $('<div/>').html(result.pagination_bottom); if ($('<div/>').html(pagination).find('#pagination').length) { $('#pagination').show().replaceWith(pagination.find('#pagination')); } else { $('#pagination').hide(); } if ($('<div/>').html(pagination_bottom).find('#pagination_bottom').length) { $('#pagination_bottom').show().replaceWith(pagination_bottom.find('#pagination_bottom')); } else { $('#pagination_bottom').hide(); } } else { $('#pagination, #pagination_bottom').hide(); } // On submitting nb items form, reload with the good nb of items $('.showall form').on('submit', function (e) { e.preventDefault(); var num = $(this).find('input[name="n"]').val(); $('.content_sortPagiBar select[name="n"] option').each(function () { var $opt = $(this); if ($opt.val() === num) { $opt.attr('selected', true); } else { $opt.removeAttr('selected'); } }); // Reload products and pagination reloadContent(); }); if (typeof ajaxCart !== 'undefined') { ajaxCart.overrideButtonsInThePage(); } if (typeof(reloadProductComparison) == 'function') { reloadProductComparison(); } window.filters = result.filters; initFilters(); initSliders(); window.current_friendly_url = result.current_friendly_url; if (typeof window.current_friendly_url === 'undefined') { window.current_friendly_url = '#'; } // Get all sliders value $(['price', 'weight']).each(function (it, sliderType) { var $slider = $('#layered_' + sliderType + '_slider'); var $sliderRangerMin = $('#layered_' + sliderType + '_range_min'); var $sliderRangeMax = $('#layered_' + sliderType + '_range_max'); if ($slider.length) { // Check if slider is enable & if slider is used if (typeof $slider.slider('values', 0) !== 'object') { if ($slider.slider('values', 0) !== $slider.slider('option', 'min') || $slider.slider('values', 1) !== $slider.slider('option', 'max')) { window.current_friendly_url += '/' + sliderType + '-' + $slider.slider('values', 0) + '-' + $slider.slider('values', 1); } } } else if ($sliderRangerMin.length) { window.current_friendly_url += '/' + sliderType + '-' + $slider.slider('values', 0) + '-' + $slider.slider('values', 1); } }); paginationButton(result.nbRenderedProducts, result.nbAskedProducts); if (history.pushState) { history.pushState(null, '', window.current_friendly_url); } else { window.location.hash = window.current_friendly_url; } if (window.current_friendly_url !== '#/show-all') { $('.js-per-page').show(); } window.lockLocationChecking = true; if (slideUp) { $.scrollTo('.product_list', 400); } updateProductUrl(); $('.hide-action').each(function () { hideFilterValueAction($(this)); }); if (display instanceof Function) { var view = $.totalStorage('display'); if (view && view !== 'grid') { display(view); } } } }); ajaxQueries.push(ajaxQuery); } function cancelFilter() { $(document).on('click', '#enabledfilters a', function (e) { var rel = $(this).data('rel'); var $el = $('#' + rel); var $rangeMin = $('#' + rel.replace(/slider$/, 'rangemin')); if (rel.search(/_slider$/) > 0) { if ($el.length) { $el.slider('values', 0, $el.slider('option', 'min')); $el.slider('values', 1, $el.slider('option', 'max')); $el.slider('option', 'slide')(0, { values: [$el.slider('option', 'min'), $el.slider('option', 'max')] }); } else if ($rangeMin.length) { var $rangeMax = $('#' + rel.replace(/_slider$/, '_range_max')); $rangeMin.val($rangeMin.attr('limitValue')); $rangeMax.val($rangeMax.attr('limitValue')); } } else if ($('option#' + rel).length) { $el.parent().val(''); } else { $el.attr('checked', false); $('.' + rel).attr('checked', false); $('#layered_form').find('input[type=hidden][name=' + rel + ']').remove(); } reloadContent(true); e.preventDefault(); }); } function stopAjaxQuery() { if (typeof ajaxQueries === 'undefined') { ajaxQueries = []; } for (var i = 0; i < ajaxQueries.length; i++) { ajaxQueries[i].abort(); } ajaxQueries = []; } function initLocationChange(func, time) { if (!time) { time = 500; } var currentFriendlyUrl = getUrlParams(); setInterval(function () { if (getUrlParams() != currentFriendlyUrl && !window.lockLocationChecking) { // Don't reload page if currentfriendlyurl and real url match if (currentFriendlyUrl.replace(/^#(\/)?/, '') === getUrlParams().replace(/^#(\/)?/, '')) { return; } window.lockLocationChecking = true; reloadContent('&selected_filters=' + getUrlParams().replace(/^#/, '')); } else { window.lockLocationChecking = false; currentFriendlyUrl = getUrlParams(); } }, time); } function getUrlParams() { if (typeof window.currentfriendlyurl === 'undefined') { window.currentfriendlyurl = '#'; } var params = currentfriendlyurl; if (window.location.href.split('#').length == 2 && window.location.href.split('#')[1] != '') { params = '#' + window.location.href.split('#')[1]; } return params; } function updateProductUrl() { // Adding the filters to URL product if (typeof paramproducturl !== 'undefined' && paramproducturl !== '' && paramproducturl !== '#') { $.each($('ul.productlist li.ajaxblockproduct .productimglink,' + 'ul.productlist li.ajaxblockproduct h5 a,' + 'ul.productlist li.ajaxblockproduct .productdesc a,' + 'ul.productlist li.ajaxblockproduct .lnkview'), function () { $(this).attr('href', $(this).attr('href') + paramproducturl); }); } } /** * Copy of the php function utf8decode() */ function utf8decode(utfstr) { var res = ''; for (var i = 0; i < utfstr.length;) { var c = utfstr.charCodeAt(i); var c1; var c2; if (c < 128) { res += String.fromCharCode(c); i++; } else if ((c > 191) && (c < 224)) { c1 = utfstr.charCodeAt(i + 1); res += String.fromCharCode(((c & 31) << 6) | (c1 & 63)); i += 2; } else { c1 = utfstr.charCodeAt(i + 1); c2 = utfstr.charCodeAt(i + 2); res += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63)); i += 3; } } return res; } function initFilters() { if (typeof filters !== 'undefined') { for (var key in filters) { var filter; if (filters.hasOwnProperty(key)) { filter = filters[key]; } if (typeof filter.slider !== 'undefined' && parseInt(filter.filter_type, 10) === 0) { var filterRange = parseInt(filter.max, 10) - parseInt(filter.min, 10); var step = filterRange / 100; if (step > 1) { step = parseInt(step, 10); } var sliderOptions = { range: true, step: step, min: parseInt(filter.min, 10), max: parseInt(filter.max, 10), values: [filter.values[0], filter.values[1]], slide: function (event, ui) { stopAjaxQuery(); var from, to, span; if (parseInt($(event.target).data('format'), 10) < 5) { from = window.formatCurrency(ui.values[0], parseInt($(event.target).data('format'), 10), $(event.target).data('unit')); to = window.formatCurrency(ui.values[1], parseInt($(event.target).data('format'), 10), $(event.target).data('unit')); } else { from = ui.values[0] + $(event.target).data('unit'); to = ui.values[1] + $(event.target).data('unit'); } if (isRtl) { span = to + ' - ' + from; } else { span = from + ' - ' + to; } $('#layered_' + $(event.target).data('type') + '_range').html(span); }, stop: function () { reloadContent(true); } }; addSlider(filter.type, sliderOptions, filter.unit, parseInt(filter.format, 10)); } else if (typeof filter.slider !== 'undefined' && parseInt(filter.filter_type, 10) === 1) { $('#layered_' + filter.type + '_range_min').attr('limitValue', filter.min); $('#layered_' + filter.type + '_range_max').attr('limitValue', filter.max); } $('.layered_' + filter.type).show(); } } } function initLayered() { initFilters(); initSliders(); initLocationChange(); updateProductUrl(); if (window.location.href.split('#').length === 2 && window.location.href.split('#')[1] !== '') { var params = window.location.href.split('#')[1]; reloadContent('&selected_filters=' + params); } } (function () { function initBlockLayered() { if (typeof $ === 'undefined') { setTimeout(initBlockLayered, 100); return; } $(function () { cancelFilter(); // Click on color $(document).on('click', '#layered_form input[type=button], #layered_form label.layered_color', function () { var $hiddenInput = $('input[name=' + $(this).attr('name') + '][type=hidden]'); if (!$hiddenInput.length) { $('<input />').attr('type', 'hidden').attr('name', $(this).attr('name')).val($(this).data('rel')).appendTo('#layered_form'); } else { $hiddenInput.remove(); } reloadContent(true); }); // @TODO Click on label $(document).on('click', '#layered_form input[type=checkbox]', function () { reloadContent(true); }); // Doesn't work with document element $('body').on('change', '#layered_form select, #layered_form input[type=radio]', function () { reloadContent(true); }); // Changing content of an input text $(document).on('keyup', '#layered_form input.layered_input_range', function () { if ($(this).attr('timeout_id')) { window.clearTimeout($(this).attr('timeout_id')); } // IE Hack, setTimeout do not accept the third parameter var reference = this; $(this).attr('timeout_id', window.setTimeout(function (it) { if (!$(it).attr('id')) { it = reference; } var filter = $(it).attr('id').replace(/^layered_(.+)_range_.*$/, '$1'); var $filterRangeMin = $('#layered_' + filter + '_range_min'); var $filterRangeMax = $('#layered_' + filter + '_range_max'); var valueMin = parseInt($filterRangeMin.val(), 10) || 0; $filterRangeMin.val(valueMin); var valueMax = parseInt($filterRangeMax.val(), 10) || 0; $filterRangeMax.val(valueMax); if (valueMax < valueMin) { $filterRangeMin.val($(it).val()); $filterRangeMax.val($(it).val()); } reloadContent(); }, 500, this)); }); $(document).on('click', '#layered_block_left .radio', function () { var name = $(this).attr('name'); $.each($(this).parent().parent().find('input[type=button]'), function (it, item) { if ($(item).hasClass('on') && $(item).attr('name') !== name) { $(item).click(); } }); return true; }); // Click on label $(document).on('click', '#layered_block_left label:not(.layered_color) a', function (e) { e.preventDefault(); var disable = $(this).parent().parent().find('input').attr('disabled'); if (!disable) { $(this).parent().parent().find('input').click(); } }); // Global var window.layered_hidden_list = {}; $(document).on('click', '.hide-action', function () { var id = $(this).closest('ul').attr('id'); window.layered_hidden_list[id] = !window.layered_hidden_list[id]; hideFilterValueAction($(this)); }); $('.hide-action').each(function () { hideFilterValueAction($(this)); }); $(document).off('change', '.selectProductSort').on('change', '.selectProductSort', function () { $('.selectProductSort').val($(this).val()); if ($('#layered_form').length > 0) { reloadContent('forceSlide'); } }); $(document).off('change', 'select[name="n"]').on('change', 'select[name="n"]', function () { $('select[name=n]').val($(this).val()); reloadContent('forceSlide'); }); paginationButton(false); initLayered(); }); } initBlockLayered(); }());```
  5. @traumflug oh I thought that default theme get updated during the normal update process... if it's not I'm going to do a manual full default theme update.
  6. Same problem in my 1.0.7 sand box with default theme... please add some product to the demo here on TB so it will be possible to test this on the official demo, too. I think that it's the same issue I just posted, right?
  7. is it a bug? or only my sandbox? I activated the block layered module on the main category. The filter works and in case the results are more than 12 items the page navigation is correctly displayed. When I click on page 2 (for example) the filter reset and it displays page 2 of the NOT FILTERED root category. I can't reproduce in the demo here because there are not enough products to display the page navigation.
  8. @traumflug said in Sort Cart controller by total amount: Maybe even hardcoding such a criterion. Like removing empty carts after the time which is also used for cookie timeout. I can hardly see any use for empty carts, but maybe I'm missing something. I vote to adding it to the core
  9. What a difference from xenforo 1.5 to 2.0! 1.X addons obviously not working in 2.X... but if you upgrade the core from 1.5 to 2.x the data of the 1.X addons is still there (and the addons get deactivated), if you install a 2.0 compatible addon it will find the old data and convert it to the new "format". Plus many developers simply updated their addons and if you have an active license with them you get the 2.x version of the addon.
  10. Please stay away from IPB! Plus the IPB Gallery is not meant to do that, the XF Resource Manager can include to each specific resource (a resource can be for example an addon/plugin/theme) images, discussion, reviews, changelogs and internal/external link to download/pay it, etc. Maybe "Downloads" from IPB can do some of that. Another thing is that IPB and addons cost more (license expire in 6 months and not 12.) Xenforo have some great and reliably thirtparty developers, one of them is "Bob". He developed some great addons like Article Manager System seamless integrated with the forum, take a look here: https://xenaddons.com/ He strictly follows XenForo code standards so his add-ons are very solid and really close to the official ones. Contact him directly and chitchat a little bit with him I think that he will give better info about his addons. https://xenaddons.com/misc/contact One example from a production law website with AMS: https://www.thelaw.com/ One example from a production film school portal website with AMS and Blogs https://www.filmschool.org/blogs/ Some different examples are MacRumors.com and IGN.com that are using XenForo for their forum/communities. Blogs can be used with comments and/or thread discussion attached to it. If a new blog is created a new thread can be created to a specific forum/node automatically. Take a look to the XF2 developer's docs too. https://xenforo.com/xf2-docs/dev/ p.s. About the specific and very solid Blog add-on for XenForo, I will contact you in private.
  11. @lesley PLEASE PLEASE PLEASE migrate to Xenforo!!!! The resource manager of xenforo could be really great for addons/tutorials and other content. take a look here: https://xenforo.com/community/forums/have-you-seen/ https://xenforo.com/community/resources/ Resource example (with dedicated tabs for updates, threads, versions and more): https://xenforo.com/community/resources/conversation-essentials.6694/ The resource manager is great for listing but also for give feedback to users about the specific addon.
  12. @foolab solving that I found this: https://forum.thirtybees.com/topic/2164/thirtybees-and-prestashop-on-nginx-expose-tpl-and-other-files
  13. I think that all the prestashop (and thirtybees?) nginx configuration I saw publicized are exposing tpl files. Please test is your thirtybees installation is doing with this link (change the domain and theme dir) https://domain.com/themes/themedir/404.tpl If the .tpl file get downloaded your template files are exposed. to block this behavior add this o your vhost nginx configuration file: location ~* \.tpl$ { deny all; } the only post I saw that talk about blocking tpl and others file types inside tb and ps installation is this: https://www.prestashop.com/forums/topic/351975-using-nginx-with-ps-16-what-to-pay-attention-to/#comment-1775268
  14. problem found... was a rule inside an included file in the nginx configuration (more info here)
  15. @lesley console gives a 403 error *48 access forbidden by rule
  16. I just migrated from debian to centos (with centminmod) my sandbox and I have the same problem but on front-office. on nginx I have: location ~* \.(eot|svg|ttf|woff|woff2)$ { #add_header Pragma public; #add_header X-Frame-Options SAMEORIGIN; #add_header X-Xss-Protection "1; mode=block" always; #add_header X-Content-Type-Options "nosniff" always; #add_header Referrer-Policy "strict-origin-when-cross-origin"; add_header Access-Control-Allow-Origin *; add_header Cache-Control "public, must-revalidate, proxy-revalidate"; access_log off; expires 30d; break; } is not a permission problem: -rwxr-xr-x. 1 nginx nginx 1,6K 25 lug 21.00 index.php -rwxr-xr-x. 1 nginx nginx 71K 25 lug 21.00 fontawesome-webfont.woff2 -rwxr-xr-x. 1 nginx nginx 89K 25 lug 21.00 fontawesome-webfont.woff -rwxr-xr-x. 1 nginx nginx 150K 25 lug 21.00 fontawesome-webfont.ttf -rwxr-xr-x. 1 nginx nginx 383K 25 lug 21.00 fontawesome-webfont.svg -rwxr-xr-x. 1 nginx nginx 75K 25 lug 21.00 fontawesome-webfont.eot -rwxr-xr-x. 1 nginx nginx 123K 25 lug 21.00 FontAwesome.otf
  17. As I write in my first post the client right now is on PS1.6. I was only asking if someone is using that module to have some "no TB specific" opinions. @movieseals do you remember some specific troublesome configurations?
  18. Anyone ever used this? Some opinions about it? I think it can be very useful. https://addons.prestashop.com/en/promotions-gifts/7422-price-increment-reduction-by-group-category-and-more.html I'm evaluating for a client (right now is on PS1.6).
  19. Try to register and take a look at the customer accounts pages too.
  20. ok but putting aside the custom/script thing... I think that it's a great e-commerce website with good ideas and easy to use/navigate/buy.
  21. @wakabayashi I don't think it's a tb/ps store.
  22. Take a look at prozis.com and take the time to create an account to "play" with it. I think that it's a great example of today's e-commerce (the mobile version too).
  23. @troy-roberts how did you solve?
  24. Here's the uptimerobot page I published... when it goes down means that the patrons number is changed https://stats.uptimerobot.com/E9g0wFwkG p.s. it checks every 30 minutes
×
×
  • Create New...