Помогите с условием - Дизайн и модификация Invision Power Board

Перейти к содержимому

 

СвернутьПрикрепленные теги

Теги не найдены

Страница 1 из 1

Помогите с условием

#1 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 342
  • Регистрация: 16-Январь 18
  • Репутация: 1
  • IPB version:4.1.x
 

Отправлено 01 Ноябрь 2018 - 15:24

Здравствуйте. У в функции выбираются последние игры игрока, есть два типа игроков dotaPlayer и w3mmdPlayer.

     /**
         * STEP 2: Selet Game
         */
        $steps['sharedstats_report_select_game'] = function ($data) use ($names) {
            $games = $gameIds = [];
            $i = 0;

            $acc = isset($data['account']) ? $data['account'] : $names[0];


            foreach ((\IPS\DB::i('stats')->select('*', 'stats_gameplayers', array('name=?', $acc['name']), 'id DESC', \IPS\Settings::i()->report_max_last_games)) as $gameplayer) {
                try {
                    $game = \IPS\DB::i('stats')->select('*', 'stats_games', array('id=?', $gameplayer['gameid']))->first();
                    $dotaPlayer = \IPS\DB::i('stats')->select('*', 'stats_dotaplayers', array('newcolour=? and gameid=?', $gameplayer['colour'], $game['id']))->first();
                    $w3mmdPlayer = \IPS\DB::i('stats')->select('*', 'stats_w3mmdplayers', array('pid=? and gameid=?', $gameplayer['colour'], $game['id']))->first();
                    $hero = mb_strtoupper($dotaPlayer['hero']);
                    $gameIds[$i] = $game['id'];
                    $games[] = $game['gamename'] /*"<br>
                            <div class='gc_u_flex_row'><span class='hero hero-${hero} hero--small hero--round'></span>&nbsp;
                            <strong>K/D/A:</strong> &nbsp; <span style='color: #0F0;'>${dotaPlayer['kills']}</span>/<span style='color: #00F;'>${dotaPlayer['assists']}</span>/<span style='color: #F00;'>${dotaPlayer['deaths']}</span>
                            &nbsp;&nbsp;&nbsp;<strong>C/D/N:</strong> <span>${dotaPlayer['creepkills']}</span>/<span>${dotaPlayer['creepdenies']}</span>/<span>${dotaPlayer['neutralkills']}</span></div>
                    "*/;
                } catch(\UnderflowException $e) {}
                ++$i;
            }
            $form = new \IPS\Helpers\Form('', 'continue');
            $form->addHeader('sharedstats_report_select_game');
            $form->add(new \IPS\Helpers\Form\Radio('sharedstats_report_select_recent_game', null, true, array('options' => $games)));
            if ($values = $form->values()) {
                $data['gameid'] = $gameIds[$values['sharedstats_report_select_recent_game']];
                return $data;
            }
            return $form;
        };


Изначально код имеет вид без строк, так как заточено под доту, мне нужно вывести игры второго типа игрока.

$w3mmdPlayer = \IPS\DB::i('stats')->select('*', 'stats_w3mmdplayers', array('pid=? and gameid=?', $gameplayer['colour'], $game['id']))->first();


Игры не отображаются, если убрать
$dotaPlayer = \IPS\DB::i('stats')->select('*', 'stats_dotaplayers', array('newcolour=? and gameid=?', $gameplayer['colour'], $game['id']))->first();
то всё в порядке.

Сообщение изменено: TemKa_SD (01 Ноябрь 2018 - 15:24)

0

#2 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 342
  • Регистрация: 16-Январь 18
  • Репутация: 1
  • IPB version:4.1.x
 

Отправлено 01 Ноябрь 2018 - 15:30

Вроде понял, нужно в catch добавить условие для второго типа игроков. Правильно?
0

#3 Пользователь не на сайте   newbie ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins.ru Team
  • Сообщений: 3 502
  • Регистрация: 26-Октябрь 11
  • Репутация: 1 378
  • IPB version:I have no IPB
 

Отправлено 01 Ноябрь 2018 - 15:39

Я же уже писал про first() и try/catch

Если у Вас есть
                try {
                    $game = \IPS\DB::i('stats')->select('*', 'stats_games', array('id=?', $gameplayer['gameid']))->first();
                    $dotaPlayer = \IPS\DB::i('stats')->select('*', 'stats_dotaplayers', array('newcolour=? and gameid=?', $gameplayer['colour'], $game['id']))->first();
                    $w3mmdPlayer = \IPS\DB::i('stats')->select('*', 'stats_w3mmdplayers', array('pid=? and gameid=?', $gameplayer['colour'], $game['id']))->first();
                } catch(\UnderflowException $e) {}

и в
                     $game = \IPS\DB::i('stats')->select('*', 'stats_games', array('id=?', $gameplayer['gameid']))->first();
будет выброшено исключение, то ниже идущий код не выполнится
То же справедливо для других выборок
0

#4 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 342
  • Регистрация: 16-Январь 18
  • Репутация: 1
  • IPB version:4.1.x
 

Отправлено 01 Ноябрь 2018 - 15:41

Я думал об этом, но изначальный код имеет вид:

                try {
                    $game = \IPS\DB::i('stats')->select('*', 'stats_games', array('id=?', $gameplayer['gameid']))->first();
                    $dotaPlayer = \IPS\DB::i('stats')->select('*', 'stats_dotaplayers', array('newcolour=? and gameid=?', $gameplayer['colour'], $game['id']))->first();
                } catch(\UnderflowException $e) {}


И всё работает, первая и вторая переменная выбирают результаты.
0

#5 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 342
  • Регистрация: 16-Январь 18
  • Репутация: 1
  • IPB version:4.1.x
 

Отправлено 01 Ноябрь 2018 - 16:51

Правильно?
            foreach ((\IPS\DB::i('stats')->select('*', 'stats_gameplayers', array('name=?', $acc['name']), 'id DESC', \IPS\Settings::i()->report_max_last_games)) as $gameplayer) {
                try {
                    $game = \IPS\DB::i('stats')->select('*', 'stats_games', array('id=?', $gameplayer['gameid']))->first();
                        try {
                            $dotaPlayer = \IPS\DB::i('stats')->select('*', 'stats_dotaplayers', array('newcolour=? and gameid=?', $gameplayer['colour'], $game['id']))->first();
                            $hero = mb_strtoupper($dotaPlayer['hero']);
                            $gameIds[$i] = $game['id'];
                            $games[] = $game['gamename'] . "<br>
                                    <div class='gc_u_flex_row'><span class='hero hero-${hero} hero--small hero--round'></span>&nbsp;
                                    <strong>K/D/A:</strong> &nbsp; <span style='color: #0F0;'>${dotaPlayer['kills']}</span>/<span style='color: #00F;'>${dotaPlayer['assists']}</span>/<span style='color: #F00;'>${dotaPlayer['deaths']}</span>
                                    &nbsp;&nbsp;&nbsp;<strong>C/D/N:</strong> <span>${dotaPlayer['creepkills']}</span>/<span>${dotaPlayer['creepdenies']}</span>/<span>${dotaPlayer['neutralkills']}</span></div>
                            ";
                        } catch(\UnderflowException $e) {}
                        try {
                            $w3mmdPlayer = \IPS\DB::i('stats')->select('*', 'stats_w3mmdplayers', array('pid=? and gameid=?', $gameplayer['colour'], $game['id']))->first();
                            $gameIds[$i] = $game['id'];
                            $games[] = $game['gamename'];
                        } catch(\UnderflowException $e) {}
                } catch(\UnderflowException $e) {}
                ++$i;
            }

0

#6 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 342
  • Регистрация: 16-Январь 18
  • Репутация: 1
  • IPB version:4.1.x
 

Отправлено 01 Ноябрь 2018 - 17:10

Ну да, всё отлично. Я понял примерно, в catch можно еще ошибку выводить или другие какие-нибудт данные, когда try не срабатывает.

Помогите еще вывести иконку героя.

У меня есть готовые функции, которые выполняют это, их надо просто внедрить сюда.

Собирает все данные, которые, передает карта в БД:
    protected function collectPlayerVars($gameId) {
        $playerVars = \IPS\DB::i('stats')->select('*', ['stats_w3mmdvars', 'w3v'], array('w3v.gameid=?', $gameId));
        return $playerVars;
    }


Собирает выше упомянутые данные с игроком:
    protected function mergePlayerVars($players, $vars) {
        $p = [];
        foreach($players as $player) {
            $v = [];
            foreach($vars as $var) {
                if($player['pid'] === $var['pid']) {
                    $varName = $var['varname'];
                    if($varName !== 'name') {
                        $v[$varName] = intval($var['value_int']);
                    } else {
                        $v['name'] = $var['value_string'];
                    }
                }
            }
            $winner = $player['flag'] === 'winner';
            if($winner) {
                $this->hasWinner = true;
            }

            $p[$player['pid']] = [
                'name' => $player['name'],
                'team' => $player['team'],
                'ip' => $player['ip'],
                'left' => intval($player['left']),
                'leftreason' => $player['leftreason'],
                'colour' => intval($player['colour']),
                'server' => $player['spoofedrealm'],
                'winner' => $winner,
                'looser' => !$winner,
                'leaver' => intval($player['leaver']),
                'vars' => $v,
                'scoreId' => isset($player['scoreId']) ? $player['scoreId'] : 0
            ];
        }

        return $p;
    }

Сюда нужно вставить результат:
                        try {
                            $w3mmdPlayer = \IPS\DB::i('stats')->select('*', 'stats_w3mmdplayers', array('pid=? and gameid=?', $gameplayer['colour'], $game['id']))->first();
                            $playerVars = $this->collectPlayerVars($game['id']);
                            $mergedPlayerVars = $this->mergePlayerVars($w3mmdPlayer, $playerVars);
                            $hero = $mergedPlayerVars;
                            $gameIds[$i] = $game['id'];
                            $games[] = $game['gamename'] . "<br>
                            ${hero}
                            ";
                        } catch(\UnderflowException $e) {}

0

#7 Пользователь не на сайте   TemKa_SD ответил: »

 
 
  • Advanced
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 342
  • Регистрация: 16-Январь 18
  • Репутация: 1
  • IPB version:4.1.x
 

Отправлено 01 Ноябрь 2018 - 17:14

Сейчас такая ошибка: Whoops\Exception\ErrorException: Illegal string offset 'pid' (2)
0

#8 Пользователь не на сайте   newbie ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins.ru Team
  • Сообщений: 3 502
  • Регистрация: 26-Октябрь 11
  • Репутация: 1 378
  • IPB version:I have no IPB
 

Отправлено 02 Ноябрь 2018 - 09:06

Просмотреть сообщениеTemKa_SD сказал(а):

Сейчас такая ошибка: Whoops\Exception\ErrorException: Illegal string offset 'pid' (2)


Используйте isset()
if isset($var['pid'])

0

Сообщить об этой теме:


Страница 1 из 1


Быстрый ответ

  

1 пользователей читают эту тему
0 зарегистрированных, 1 гостей, 0 скрытых


Контактная информация

Вопросы по работе сайта

+7 (917) 501-4765
C 10 до 20 в рабочие дни (время московское)

Техническая поддержка

Контактные данные специалистов

Дизайн форумов

IPB 3.x ¦ IPB 2.x

Бесплатные шаблоны

IPB 3.2 – 3.4 ¦ IPB 3.1 ¦ IPB 3.0 ¦ IPB 2.2 – 2.3 ¦ IPB 2.1 ¦ Клипарт
Лицензия на использование ¦ Ваша поддержка ¦ О проекте
Copyright © 2005-2018 IPBSkins.ru Team
При копировании материалов с сайта
прямая ссылка на источник обязательна