Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Помогите пофиксить баги

Опубликовано:

Здравствуйте. Часов 6 вчера ночью копал, не смог разобраться с одним вопросом, суть следующая: пациент http://dev.wc3.games/Stats/RunningGames/ есть чекбокс Только лобби - он работает не корректно, попробую показать на видео:

 

http://skrinshoter.ru/v/040918/EDThAFwq

 

Вот, я нажал на "только лобби", записалось в куки и функция сработала - всё супер, обновил страницу, в куках всё осталось - а геимлист не работает. Если обновить страницу не сразу а через 4-5 сек, то всё сработает как надо. Я так понимаю, это из-за автообновления каждые 5 сек? Помогите пофиксить.

 

По коду:

 

здесь мы определяем наличие куков при загрузке страницы.

$games = $this->getGameList(isset(\IPS\Request::i()->cookie['RunningGames_only_lobby']) == 'true', 6);

 

Здесь записываем данные, когда галочка стоит или не стоит.

		if(\IPS\Request::i()->only_lobby === 'true')
		\IPS\Request::i()->setCookie( 'RunningGames_only_lobby', 'true', \IPS\DateTime::create()->add( new \DateInterval( 'P365D' ) ) );
	else
		\IPS\Request::i()->setCookie( 'RunningGames_only_lobby', '', \IPS\DateTime::create()->add( new \DateInterval( 'P365D' ) ) );

 

Наверно ничего не понятно?

RunningGames.php

Рекомендованные сообщения

Опубликовано:
  • Автор

Разве так правильно?

 

$(document).ready(function() {
   var gamenames = document.querySelectorAll('.copy');
   var table = document.querySelector('#gamelistTable');
   var names = new Clipboard(gamenames);

   var date = new Date();
   date.setTime(date.getTime() + (365 * 86400000));

   setInterval(function() {
       var updateUrl = table.getAttribute('data-update-url');
       var val = document.querySelector('input[name="only_lobby"]').checked;
       updateUrl += '&only_lobby=' + val;
       var botid_list = '';
       $('input:checkbox[name="botid[]"]:checked').each(function(){
           botid_list += $(this).val() + ',';
       });
       /*console.log(botid_list);*/
       updateUrl += '&botid_list=' + botid_list;
       console.log(updateUrl);
       ips.getAjax()(updateUrl).done(function (data) {
           table.querySelector('tbody').innerHTML = data;
           gamenames = document.querySelectorAll('.copy');
           names.destroy();
           names = new Clipboard(gamenames);
       });
   }, 5000);
});
$('#only_lobby').change(function() {
   if(this.checked) {
       var date = new Date();
       date.setTime(date.getTime() + (365 * 86400000));
       ips.utils.cookie.set('RunningGames_only_lobby', true, date.toUTCString());
   } else {
       ips.utils.cookie.unset('RunningGames_only_lobby');
   }
});
$('input:checkbox[name="botid[]"]').change(function() {
   if(this.checked) {
	var botid_list = '';
	var date = new Date();
	date.setTime(date.getTime() + (365 * 86400000));
       $('input:checkbox[name="botid[]"]:checked').each(function(){
           botid_list += $(this).val() + ',';
       });
       ips.utils.cookie.set('RunningGames_botid', botid_list += $(this).val() + ',', date.toUTCString());
   }
});

Опубликовано:

        var val = document.querySelector('input[name="only_lobby"]').checked;
       updateUrl += '&only_lobby=' + val;
       var botid_list = '';
       $('input:checkbox[name="botid[]"]:checked').each(function(){
           botid_list += $(this).val() + ',';
       });
       /*console.log(botid_list);*/
       updateUrl += '&botid_list=' + botid_list;

Это Вам зачем, если Вы не используете параметры в php?

 

if(this.checked) {

var botid_list = '';

var date = new Date();

date.setTime(date.getTime() + (365 * 86400000));

$('input:checkbox[name="botid[]"]:checked').each(function(){

botid_list += $(this).val() + ',';

});

ips.utils.cookie.set('RunningGames_botid', botid_list += $(this).val() + ',', date.toUTCString());

}

Здесь Вы проверяете только одно состояние чекбокса

 

	$('input:checkbox[name="botid[]"]').change(function() {
	var botid_list = [];
	$('input:checkbox[name="botid[]"]:checked').each(function(){
		botid_list.push($(this).val());
	});

	ips.utils.cookie.set('RunningGames_botid', botid_list.join(','), date.toUTCString());
});

Опубликовано:
  • Автор

Спасибо. Ваш вопрос про PHP не понял.

Опубликовано:

Ваш вопрос про PHP не понял.

Зачем Вы передаете параметры index.php?app=sharedstats&module=stats&controller=RunningGames&do=ajax&only_lobby=true&botid_list=18,17,16,15,14,13,11,10,4,3,

если проверяете не их, а куки?

ajax

меняете

\IPS\Output::i()->sendOutput( \IPS\Theme::i()->getTemplate('stats', 'sharedstats')->runningGamesList($games), 200 );

на

\IPS\Output::i()->json(array('html' => \IPS\Theme::i()->getTemplate('stats', 'sharedstats')->runningGamesList($games), 'games' => 5, 'players' => 10));

+

добавить id'шники для Total Games и Total Players

<div class="ipsType_minorHeading">Total Games: <span id="elTotalGames">10</span></div>
<div class="ipsType_minorHeading">Total Players: <span id="elTotalPlayers">28</span></div>

+ js

$(document).ready(function() {
var table = $('#gamelistTable');
var tableBody = table.find('tbody');
var names = new Clipboard('.copy');
var updateUrl = table.attr('data-update-url');
var elTotalGames = $('#elTotalGames');
var elTotalPlayers = $('#elTotalPlayers');
var date = new Date();

date.setTime(date.getTime() + (365 * 86400000));

setInterval(function() {
	ips.getAjax()(updateUrl).done(function (response) {
		tableBody.html(response['html']);
		elTotalGames.html(response['games']);
		elTotalPlayers.html(response['players']);
	});
}, 5000);

$('#only_lobby').change(function() {
	if(this.checked) {
		ips.utils.cookie.set('RunningGames_only_lobby', true, date.toUTCString());
	} else {
		ips.utils.cookie.unset('RunningGames_only_lobby');
	}
});

$('input:checkbox[name="botid[]"]').change(function() {
	var botid_list = [];

	$('input:checkbox[name="botid[]"]:checked').each(function(){
		botid_list.push($(this).val());
	});

	ips.utils.cookie.set('RunningGames_botid', botid_list.join(','), date.toUTCString());
});
});

Опубликовано:
  • Автор

Спасибо большое за помощь, я вам памятник при жизни поставлю. Дело в том, что я не знаю программирования, только HTML и CSS. Со всем этим делом вожусь порядка 10 лет, начинал еще с юкоз. Выучить программирования так и не было времени, пилил свои проекты, как-то зарабатывал на жизнь... Чтением кода владею, но с написанием проблемы, вот пытаюсь что-то освоить, внимательно изучаю всю вашу информацию, я вам сильно надоел?

Опубликовано:
  • Автор

Не работает ((( С куками всё супер, с обновлением на AJAX что-то.

 

Тамймер на секунду опаздывает почему-то.

 

$(document).ready(function() {
   var table = $('#gamelistTable');
   var tableBody = table.find('tbody');
   var names = new Clipboard('.copy');
   var updateUrl = table.attr('data-update-url');
   var elTotalGames = $('#elTotalGames');
   var elTotalPlayers = $('#elTotalPlayers');
   var date = new Date();
var timer = $('#elTimer');
var timerTime = timer.html();
var counter = timerTime;

   date.setTime(date.getTime() + (365 * 86400000));

   setInterval(function() {
       ips.getAjax()(updateUrl).done(function (response) {
           tableBody.html(response['html']);
           elTotalGames.html(response['games']);
           elTotalPlayers.html(response['players']);
       });
   }, 5000);

setInterval(function() {
    if (counter < 0) {
        counter = timerTime;
    }
    timer.html(counter);
    counter -= 1;
}, 1000);

   $('#only_lobby').change(function() {
       if(this.checked) {
           ips.utils.cookie.set('RunningGames_only_lobby', true, date.toUTCString());
       } else {
           ips.utils.cookie.unset('RunningGames_only_lobby');
       }
   });

   $('input:checkbox[name="botid[]"]').change(function() {
       var botid_list = [];

       $('input:checkbox[name="botid[]"]:checked').each(function(){
           botid_list.push($(this).val());
       });

       ips.utils.cookie.set('RunningGames_botid', botid_list.join(','), date.toUTCString());
   });
});

Изменено пользователем TemKa_SD

Опубликовано:

Используйте один setInterval с 1000. Если значение счетчика равно 0, делайте ajax-запрос

Опубликовано:
  • Автор

Как правильней?

 

setInterval(function() {
	if (counter == 0) {
        ips.getAjax()(updateUrl).done(function (response) {
            tableBody.html(response['html']);
            elTotalGames.html(response['games']);
            elTotalPlayers.html(response['players']);
        });
       }
    if (counter < 0) {
        counter = timerTime;
    }
    timer.html(counter);
    counter -= 1;
}, 1000);

 

setInterval(function() {
    if (counter <= 0) {
        ips.getAjax()(updateUrl).done(function (response) {
            tableBody.html(response['html']);
            elTotalGames.html(response['games']);
            elTotalPlayers.html(response['players']);
        });
        counter = timerTime;
    }
    timer.html(counter);
    counter -= 1;
}, 1000);

Опубликовано:
var ajaxObj = null;

setInterval(function() {
if (counter === 0) {
	if (ajaxObj != null) {
		return;
	}

	timer.html('Loading...');

	ajaxObj = ips.getAjax()(updateUrl)
		.done(function (response) {
			tableBody.html(response['html']);
			elTotalGames.html(response['games']);
			elTotalPlayers.html(response['players']);

			counter = timerTime;
			ajaxObj = null;
		})
		.fail(function() {
			window.location.reload();
		});
} else {
	timer.html(counter);
	counter -= 1;
}
}, 1000);

Опубликовано:
  • Автор

Спасибо, всё супер. У меня сломалась выборка по фильтру после обновления на AJAX.

Опубликовано:

У меня сломалась выборка по фильтру после обновления на AJAX.

Значит, где-то что-то не так.

Опубликовано:
  • Автор

Я сделал такой вывод:

 

\IPS\Output::i()->json(array('html' => \IPS\Theme::i()->getTemplate('stats', 'sharedstats')->runningGamesList($games), 'games' => $games, 'players' => $totalGames));

 

оно работает, но я не пойму почему. Если вставить любую другую переменную, например:

 

\IPS\Output::i()->json(array('html' => \IPS\Theme::i()->getTemplate('stats', 'sharedstats')->runningGamesList($games), 'games' => $gamesss, 'players' => $totalGamesss));

 

оно тоже работает.

Опубликовано:

'games' => $games, 'players' => $totalGames

А тут вообще что?

Судя по runningGamesList($games), $games - это массив со списком игр.

Так зачем Вы его передаете в 'games' => $games

'games' => $games должно быть кол-во игр

'players' => $totalGames должно быть кол-во игроков

Опубликовано:
  • Автор

Я просто для теста указал. Почему вариант который вы скинули с цифрами 5 и 10 - не работает, а мой с непонятными переменными работает?

Опубликовано:

Почему вариант который вы скинули с цифрами 5 и 10 - не работает, а мой с непонятными переменными работает?

Магия.

Установите 5 и 10, чтобы я посмотрел

Создайте аккаунт или войдите в него для комментирования

Сейчас на странице 0

  • Нет пользователей, просматривающих эту страницу.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.