TemKa_SD 9 09/04/18 17:29 Здравствуйте. Часов 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 Поделиться сообщением Ссылка на сообщение
newbie 1723 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'); } }); Изменено 5 сентября 2018 пользователем newbie Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 09/05/18 07:02 Спасибо, но проблему это не решило. Может весь код нужно обернуть? 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 ); } } Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 09/05/18 09:00 Стало лучше, но немного не так, чекбокс подтупает после обновления страницы ручками и почему-то не срабатывает тут: http://prntscr.com/kqst87 т.е при загрузки страницы отображается не правильно, только после 1 обновления на аякс становится как надо, гляньте по ссылке. Поделиться сообщением Ссылка на сообщение
newbie 1723 09/05/18 09:27 Смотрю как гость.Если страница кешируется, то оно понятно.Либо отключайте для той страницы кеширование, либо используйте только аякс для получения данных. Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 09/05/18 12:43 Хм, похоже и правда из-за него. Скажите еще вот что, можно как-то сделать обновление моментальным после нажатия на чек бокс? Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 09/05/18 15:45 И еще у меня есть одна проблемка, в примере выше я просто вывел один бот, чтобы не было лишних чекбоксов и прочего. Текущий код выглядит так: http://prntscr.com/kqygzw ошибка: No data supplied for parameters in prepared statement Она возникает, потому что стандартно данные в куках отсутствуют, как бы мне это решить? Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 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. Если куки существуют, они в любом случае будут равны тру, если чекбокс не отмечен, куки пустые. Изменено 5 сентября 2018 пользователем TemKa_SD Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 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 Изменено 5 сентября 2018 пользователем TemKa_SD Поделиться сообщением Ссылка на сообщение
newbie 1723 09/06/18 05:48 Скажите еще вот что, можно как-то сделать обновление моментальным после нажатия на чек бокс? Загружать все записи и скрывать через 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? Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 09/06/18 12:04 Где данные? 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? У меня была ошибка, нельзя использовать массив, нужно преобразовать в строку. Поделиться сообщением Ссылка на сообщение
newbie 1723 09/06/18 12:20 здесь код такой будет:$conditions = array(); if($onlyLobby) { $conditions[] = array('lobby=?', 1); } if($botid) { $conditions[] = array(\IPS\Db::i()->in('botid', explode(',', $botid))); } Хотелось это всё держать в одном месте, а так, нужно подключать сторонний файл или на странице JS выводить. Как лучше? Не понял. У Вас все в 1-ом js-файле. Что еще хотите подключать? У Вас, кстати, сейчас "нотис" на форуме (со всеми путями и проч), если не установлена кука RunningGames_botid Поделиться сообщением Ссылка на сообщение
TemKa_SD 9 09/06/18 12:53 $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'])); Поделиться сообщением Ссылка на сообщение
newbie 1723 09/06/18 13:05 У меня подключен файл 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); Поделиться сообщением Ссылка на сообщение