Перейти к содержимому
Русский язык для 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

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

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

	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 ботов НЕ ИЗ КУКОВ

 

 

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

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

Аккаунт

Навигация

Поиск

Поиск

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

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