Перейти к содержимому
Русский язык для Invision Community 5

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

Здравствуйте. Часов 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

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

(isset(\IPS\Request::i()->cookie['RunningGames_botid']) AND \IPS\Request::i()->cookie['RunningGames_botid']) ? \IPS\Request::i()->cookie['RunningGames_botid'] : ''

  • Автор

Супер, огромной спасибо. Осталось пофиксить галочки и всё )))) Они почему-то заболели.

 

На счет JS понял, нужно убрать за setInterval(function() {

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

  • Автор

Всё же правильно, почему тупит?

 

        <input type="checkbox" role="checkbox" name="botid[]" value="{$id}" {{if in_array($id, explode(',', isset(\IPS\Request::i()->cookie['RunningGames_botid']))) || !isset(\IPS\Request::i()->cookie['RunningGames_botid'])}}checked{{endif}}>

{{if in_array($id, explode(',', isset(\IPS\Request::i()->cookie['RunningGames_botid'])))

Опять Вы не правильно интерпретируете isset.

Если кука установлена, то код выглядит как

{{if in_array($id, explode(',', true))

  • Автор

Как дебажить в шаблоне?

  • Автор
        <input type="checkbox" role="checkbox" name="botid[]" value="{$id}" {{if isset(\IPS\Request::i()->cookie['RunningGames_botid']) AND \IPS\Request::i()->cookie['RunningGames_botid'] == in_array($id, explode(',', \IPS\Request::i()->cookie['RunningGames_botid']))}}checked{{endif}}>

        <input type="checkbox" role="checkbox" name="botid[]" value="{$id}" {{if isset(\IPS\Request::i()->cookie['RunningGames_botid']) AND in_array($id, explode(',', \IPS\Request::i()->cookie['RunningGames_botid']))}}checked{{endif}}>

  • Автор

Да, я тоже об этом подумал, а вы уже написали. Как вывести дебаг информацию в шаблоне? {{print_r $per}}

Как вывести дебаг информацию в шаблоне?

Пишите валидный php-код в двойных фигурных скобках

  • Автор

2222

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

  • Автор

Блин, тут то что не так? Правильно же всё вроде.

 

http://prntscr.com/krlcnk

 

$(document).ready(function() {
   var gamenames = document.querySelectorAll('.copy');
   var table = document.querySelector('#gamelistTable');
   var names = new Clipboard(gamenames);
   var botid_list = '';
   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;
       $('input:checkbox[name="botid[]"]:checked').each(function(){
           botid_list += $(this).val() + ',';
       });
       /*console.log(botid_list);*/
       updateUrl += '&botid_list=' + botid_list;
       if(document.querySelector('input[name="only_eu"]')) {
           var euval = document.querySelector('input[name="only_eu"]').checked;
           var usval = document.querySelector('input[name="only_us"]').checked;
           updateUrl += '&only_eu=' + euval + '&only_us=' + usval;
       }
       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) {
           ips.utils.cookie.set('RunningGames_botid', botid_list += $(this).val() + ',', date.toUTCString());
       }
   });
});

  • Автор

Изменил дизайн фильтра, прикольно получилось )))

 

Скажите пожалуйста по вопросу выше, я так и не разобрался почему он так записывает в куки. Еще пару вопросов, сильно сложно реализовать статистику по играм и игрокам с условием по фильтру ( которая в самом низу фильтра )? Она работает, но только при ручно обновлении, выбирает по чекбоксам, на аяксе нет. И еще вопрос, реально вывести какой нить тамймер в том же месте для следующего обновления? Чтобы люди просто видели.

Опять огород нагородили.

В setInterval нужно только делать запрос, получать данные и обновлять таблицу. Вы туда все пытаетесь всунуть.

 

я так и не разобрался почему он так записывает в куки.

Потому что переменную объявили за пределами setInterval

Простой пример

var counter = 0;
setInterval(function() {
   counter += 1;
}, 5000);

Каждые 5 секунд значение будет увеличиваться на единицу. Так и у Вас значения прибавляются к старым.

1,2

1,2,1,2

1,2,1,2,1,2

Юзер выбрал 7, в результате в куку записалось значение 1,2,1,2,1,2,7

 

сильно сложно реализовать статистику по играм и игрокам с условием по фильтру ( которая в самом низу фильтра )

Возвращайте json и обновляйте данные

\IPS\Output::i()->json(array('table' => $table, 'games' => $games, 'players' => $players));

 

И еще вопрос, реально вывести какой нить тамймер в том же месте для следующего обновления?

Какой таймер? Обновление каждые 5 секунд?
  • Автор

Какой таймер? Обновление каждые 5 секунд?

угу

угу

var timer = $('#elTimer');
var timerTime = timer.html();
var counter = timerTime;

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

<span id="elTimer">10</span>

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

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.