Jump to content

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


TemKa_SD
 Share

Recommended Posts

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

Link to comment
Share on other sites

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

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

Edited by newbie
Link to comment
Share on other sites

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

 

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

Link to comment
Share on other sites

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

 

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

 

http://prntscr.com/kqygzw

 

ошибка:

 

No data supplied for parameters in prepared statement

 

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

Link to comment
Share on other sites

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

 

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.

 

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

Edited by TemKa_SD
Link to comment
Share on other sites

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

 

		$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

Edited by TemKa_SD
Link to comment
Share on other sites

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

Загружать все записи и скрывать через 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?
Link to comment
Share on other sites

Где данные?

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?

 

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

Link to comment
Share on other sites

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

$conditions = array();

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

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

 

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

 

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

 

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

Link to comment
Share on other sites

$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']));

Link to comment
Share on other sites

У меня подключен файл 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);

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...