Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
TemKa_SD

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

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

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

Поделиться сообщением


Ссылка на сообщение
09/05/18 06:36 (изменено)

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

	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

 

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

Поделиться сообщением


Ссылка на сообщение
09/05/18 20:46 (изменено)

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

 

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

Поделиться сообщением


Ссылка на сообщение
09/05/18 22:26 (изменено)

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

 

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

Поделиться сообщением


Ссылка на сообщение

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

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

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

×
×
  • Создать...