Перейти к публикации
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

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

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

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

	protected function ajax() {
	$games = $this->getGameList(isset(\IPS\Request::i()->cookie['RunningGames_only_lobby']) and \IPS\Request::i()->cookie['RunningGames_only_lobby'] === 'true', 6);
	\IPS\Output::i()->sendOutput( \IPS\Theme::i()->getTemplate('stats', 'sharedstats')->runningGamesList($games), 200 );
}

+

в js добавить

$('#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');
	}
   });	

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

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

Спасибо, но проблему это не решило. Может весь код нужно обернуть?

 

	protected function ajax() {
if (\IPS\Request::i()->isAjax())
	$games = $this->getGameList(\IPS\Request::i()->only_lobby === 'true', 6);
	#setcookie('RunningGames_botid', \IPS\Request::i()->botid_list, time() + 3600 * 24 * 31 * 365);

	{
	    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' ) ) );
	    }

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

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

Я поправил пост. Проверьте.

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

Стало лучше, но немного не так, чекбокс подтупает после обновления страницы ручками и почему-то не срабатывает тут:

 

http://prntscr.com/kqst87 т.е при загрузки страницы отображается не правильно, только после 1 обновления на аякс становится как надо, гляньте по ссылке.

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

Смотрю как гость.

Если страница кешируется, то оно понятно.

Либо отключайте для той страницы кеширование, либо используйте только аякс для получения данных.

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

Хм, похоже и правда из-за него. Скажите еще вот что, можно как-то сделать обновление моментальным после нажатия на чек бокс?

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

И еще у меня есть одна проблемка, в примере выше я просто вывел один бот, чтобы не было лишних чекбоксов и прочего. Текущий код выглядит так:

 

http://prntscr.com/kqygzw

 

ошибка:

 

No data supplied for parameters in prepared statement

 

Она возникает, потому что стандартно данные в куках отсутствуют, как бы мне это решить?

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

Я кстати сделал так, правильно?

 

http://prntscr.com/kr20i9

 

И мне еще вот что не понятно, зачем тут AND?

 

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

 

Т.е условие такое: ВЫБРАТЬ если существуют куки RunningGames_only_lobby и куки RunningGames_only_lobby равно true.

 

Если куки существуют, они в любом случае будут равны тру, если чекбокс не отмечен, куки пустые.

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

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

Блин, не получается. У меня получилось вывести данные из куков, оно вроде работает ( данные выбирает правильно ) но галочки почему-то не отмечены:

 

		$bots = explode(',', \IPS\Request::i()->cookie['RunningGames_botid']);
	$games = $this->getGameList(isset(\IPS\Request::i()->cookie['RunningGames_only_lobby']) and \IPS\Request::i()->cookie['RunningGames_only_lobby'] === 'true', implode(',', $bots));

 

Как мне вот это вызвать тут? ( см.скрин ), через $this->ajax() же ?

 

http://prntscr.com/kr2vz2

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

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

Скажите еще вот что, можно как-то сделать обновление моментальным после нажатия на чек бокс?

Загружать все записи и скрывать через css.

ошибка:

 

Цитата

 

No data supplied for parameters in prepared statement

Где данные?

		if($onlyLobby) {
		$conditions = array('lobby=1 AND (botid < ? OR botid > ?)');
	} else {
		$conditions = array('botid < ? OR botid > ?');
	}
	if(!empty($botid))
	{
		$botid = ($botid[mb_strlen($botid) - 1] == ',' ? mb_substr($botid, 0, -1) : $botid);
		$conditions = array('botid in (' . $botid . ')' . ($onlyLobby == true ? 'AND lobby=1' : ''));
	}

Что здесь botid ? ? Меньше чего или больше чего? 1, 10 или чего-то еще?

 

Я кстати сделал так, правильно?

А в чем смысл менять куки каждые 5 секунд?

 

И мне еще вот что не понятно, зачем тут AND?

Не хотите, не используйте. isset проверяет, была ли установлена переменная значением отличным от NULL. Если не важно значение, то не используйте.

 

они в любом случае будут равны тру,

Кто такое сказал? Куки юзер может изменить.

 

Блин, не получается. У меня получилось вывести данные из куков, оно вроде работает ( данные выбирает правильно ) но галочки почему-то не отмечены:

В чем идея делать сначала explode, а после implode?
Опубликовано:
  • Автор

Где данные?

if($onlyLobby) {
		$conditions = array('lobby=1 AND (botid < ? OR botid > ?)');
	} else {
		$conditions = array('botid < ? OR botid > ?');
	}
	if(!empty($botid))
	{
		$botid = ($botid[mb_strlen($botid) - 1] == ',' ? mb_substr($botid, 0, -1) : $botid);
		$conditions = array('botid in (' . $botid . ')' . ($onlyLobby == true ? 'AND lobby=1' : ''));
	}

Что здесь botid < ? OR botid > ? ? Меньше чего или больше чего? 1, 10 или чего-то еще?

 

Ой, это остатки от другой функции, не то удалил: https://github.com/TemKaSD/IPS-Stats/blob/master/modules/front/stats/RunningGames.php#L109 здесь код такой будет:

 

		if($onlyLobby)
	{
		$conditions = array('lobby=1');
	} else {
		$conditions = null;
	}
	if(!empty($botid))
	{
		$botid = ($botid[mb_strlen($botid) - 1] == ',' ? mb_substr($botid, 0, -1) : $botid);
		$conditions = array('botid in (' . $botid . ')' . ($onlyLobby == true ? 'AND lobby=1' : ''));
	}

 

А в чем смысл менять куки каждые 5 секунд?

 

Хотелось это всё держать в одном месте, а так, нужно подключать сторонний файл или на странице JS выводить. Как лучше?

 

В чем идея делать сначала explode, а после implode?

 

У меня была ошибка, нельзя использовать массив, нужно преобразовать в строку.

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

здесь код такой будет:

$conditions = array();

if($onlyLobby)
{
$conditions[] = array('lobby=?', 1);
}

if($botid)
{
$conditions[] = array(\IPS\Db::i()->in('botid', explode(',', $botid)));
}

 

Хотелось это всё держать в одном месте, а так, нужно подключать сторонний файл или на странице JS выводить. Как лучше?

 

Не понял. У Вас все в 1-ом js-файле. Что еще хотите подключать?

 

У Вас, кстати, сейчас "нотис" на форуме (со всеми путями и проч), если не установлена кука RunningGames_botid

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

$conditions = array();

if($onlyLobby)
{
$conditions[] = array('lobby=?', 1);
}

if($botid)
{
$conditions[] = array(\IPS\Db::i()->in('botid', explode(',', $botid)));
}

 

Супер, ту ошибку исправило, а я думал это потому что куки пустые были )

 

 

Не понял. У Вас все в 1-ом js-файле. Что еще хотите подключать?

 

У меня подключен файл JS к этой странице \IPS\Output::i()->js( 'gamelistcopy.js', 'sharedstats', 'interface' ) я в него и добавил.

 

У Вас, кстати, сейчас "нотис" на форуме (со всеми путями и проч), если не установлена кука RunningGames_botid

 

Да, я это и пытаюсь сделать, мне вот осталось сделать выборку из куков по bot_id и всё )

 

Почему не работает?

 

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

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

У меня подключен файл JS к этой странице \IPS\Output::i()->js( 'gamelistcopy.js', 'sharedstats', 'interface' ) я в него и добавил.

В котором куки устанавливаются/удаляются каждые 5 секунд.

Изменяйте по выбору, как было сделано выше.

 

Почему не работает?

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

Выше писал, что isset проверяет, была ли установлена переменная значением отличным от NULL.

То есть Ваш код выглядит, если кука RunningGames_botid есть, как

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

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

Так, убрал ESSET, убрал куки ошибка - Undefined index: RunningGames_botid всё правильно. Т.е нужно сделать как-то

 

isset(\IPS\Request::i()->cookie['RunningGames_botid']) AND здесь код, выводимый id ботов НЕ ИЗ КУКОВ

 

 

??????????????????????????????

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

Сейчас на странице 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.