JsonSerializable в IPS - Дизайн и модификация Invision Power Board

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

 

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

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

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

JsonSerializable в IPS

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

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

Отправлено 25 Октябрь 2018 - 14:42

Здравствуйте. Имею вот такой файлик с другого движка, это ActiveRecords и еще тут есть какой-то JsonSerializable.

Файлик:

<?php

namespace StatsBundle\Entity;

/**
 * StatsGameplayerHeroes
 */
class StatsGameplayerHeroes implements \JsonSerializable {
    use MultiKillStatsTrait, StatsHeroTrait, AdditionalStatsTrait;

    /**
     * @var integer
     */
    private $playerId;

    /**
     * Set playerId
     *
     * @param integer $playerId
     *
     * @return StatsGameplayerHeroes
     */
    public function setPlayerId($playerId)
    {
        $this->playerId = $playerId;

        return $this;
    }

    /**
     * Get playerId
     *
     * @return integer
     */
    public function getPlayerId()
    {
        return $this->playerId;
    }


    public function jsonSerialize()
    {
        return [
            'hero' => $this->getHero(),
            'games' => $this->getG(),
            'winrate' => number_format(($this->getW() * 100) / $this->getG(), 2),
            'kd' => number_format($this->getD() > 0 ? $this->getK() / $this->getD() : $this->getK(), 2),
            'ad' => number_format($this->getD() > 0 ? $this->getA() / $this->getD() : $this->getA(), 2),
        ];
    }
}


Мне всё понятно кроме подключения implements \JsonSerializable
0

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

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

Отправлено 25 Октябрь 2018 - 14:57

http://php.net/manua....interfaces.php
0

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

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

Отправлено 25 Октябрь 2018 - 15:08

Сделал вот еще одну функцию, мне таск пишет Sorry, we could not find that! Всё правильно, проверил раз 20.

$heroStats = \IPS\sharedstats\Entity\StatsGameplayerHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerHeroes::$databaseTable, ('player_id=1'))->first());


<?php

namespace IPS\sharedstats\Entity;

class _StatsGameplayerHeroes extends \IPS\sharedstats\DbIntegration\ActiveRecord
{

    /**
     * @brief    [ActiveRecord] ID Database Column
     */
    public static $databaseColumnId = 'player_id';
    /**
     * @brief   [ActiveRecord] Database ID Fields
     */
    protected static $databaseIdFields = array( 'player_id' );

    /**
     * @brief    [ActiveRecord] Database table
     * @note    This MUST be over-ridden
     */
    public static $databaseTable = 'stats_gameplayer_heroes';

    /**
     * @brief   [ActiveRecord] Database Prefix
     */
    public static $connectionName = 'stats';

}

0

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

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

Отправлено 25 Октябрь 2018 - 15:33

Пока закомментировал этот код, вот такая строка подключения в другом движке: $gHeroStats = $em->getRepository('StatsBundle:StatsHeroes')->find($hero); что вместо find использовать? Попробовал load, не помогает.

Сообщение изменено: TemKa_SD (25 Октябрь 2018 - 15:33)

0

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

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

Отправлено 25 Октябрь 2018 - 15:44

Так. Посмотрел в движке, может быть, load и нужен. Я так понимаю, нужно добавить таблицу?

Хотя нет. У меня в таблице нет ID, поэтому, load не подходит.

Сообщение изменено: TemKa_SD (25 Октябрь 2018 - 15:53)

0

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

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

Отправлено 25 Октябрь 2018 - 16:18

Разобрался, потому что таблица пустая.
0

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

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

Отправлено 25 Октябрь 2018 - 16:26

first() выкидывает исключение, поэтому используйте try/catch
try
{
    $heroStats = \IPS\sharedstats\Entity\StatsGameplayerHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerHeroes::$databaseTable, ('player_id=1'))->first());
}
catch (\UnderflowException $e)
{
}

0

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

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

Отправлено 25 Октябрь 2018 - 16:42

Пока так:

	public function execute()
	{
		$db = \IPS\sharedstats\DB::get();
		$type = 'dota';
		$hero = '';
		$gameIds = $db->select('g.gameid, d.winner', ['stats_games_scored', 'g'], ['hs.id IS NULL AND type=?', $type], 'g.gameid ASC', 75)->join( array( 'stats_dotagames', 'd' ), 'd.gameid = g.gameid', 'INNER')->join( array( 'stats_heroes_scored', 'hs' ), 'hs.id = g.gameid', 'LEFT');
	    
	    try {
	    	foreach($gameIds as $game) {
	    		$gameId = $game['gameid'];
	    		$players = $db->select('d.*, p.*', ['stats_gameplayers', 'p'], ['p.gameid = ? AND TRIM(d.hero) !=?', $gameId, $hero])->join( array( 'stats_dotaplayers', 'd' ), 'd.gameid = p.gameid AND d.newcolour = p.colour', 'INNER');
	    		foreach($players as $p) {
	    			$dbPlayer = \IPS\sharedstats\Entity\StatsGameplayerScored::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerScored::$databaseTable, (['name=? AND server=?', $p['name'], $p['spoofedrealm']]))->first());

					if($dbPlayer) {
						$hero = $this->getHero(mb_strtoupper($p['hero']));
                        $heroStats = \IPS\sharedstats\Entity\StatsGameplayerHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerHeroes::$databaseTable, (['hero=? AND player_id=?', $hero, $dbPlayer->getId()]))->first());
                        if (!$heroStats) {
                            $heroStats = new StatsGameplayerHeroes();
                            $heroStats->setPlayerId($dbPlayer->getId());
                            $heroStats->setHero($hero);
                        }
                        $gHeroStats = \IPS\sharedstats\Entity\StatsHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsHeroes::$databaseTable, (['hero=?', $hero]))->first());
                        if (!$gHeroStats) {
                            $gHeroStats = new StatsHeroes();
                            $gHeroStats->setHero($hero);
                        }
					}
	    		}
	    	}
	    } catch(\OutOfRangeException $e) {}

	    if(count($gameIds)>0) {
	      return 'Hero: ' . json_encode($heroStats);
	    }
	    else {
	    	return 'Игры не найдены';
	    }
	}


Соответственно, здесь $dbPlayer = \IPS\sharedstats\Entity\StatsGameplayerScored::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerScored::$databaseTable, (['name=? AND server=?', $p['name'], $p['spoofedrealm']]))->first()); тоже нужно его использовать?

А в catch выводить ошибку, что записей в таблице нет?

Сообщение изменено: TemKa_SD (25 Октябрь 2018 - 16:43)

0

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

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

Отправлено 25 Октябрь 2018 - 19:00

Правильно ли я сделал?

Было:

                        $heroStats = \IPS\sharedstats\Entity\StatsGameplayerHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerHeroes::$databaseTable, (['hero=? AND player_id=?', $hero, $dbPlayer->getId()]))->first());
                        if (!$heroStats) {
                            $heroStats = new StatsGameplayerHeroes();
                            $heroStats->setPlayerId($dbPlayer->getId());
                            $heroStats->setHero($hero);
                        }


Стало:

                            try
                                {
                                    $heroStats = \IPS\sharedstats\Entity\StatsGameplayerHeroes::constructFromData($db->select('*', \IPS\sharedstats\Entity\StatsGameplayerHeroes::$databaseTable, (['hero=? AND player_id=?', $hero, $dbPlayer->getId()]))->first());
                                }
                                catch (\UnderflowException $e)
                                {
                                    $heroStats = new StatsGameplayerHeroes();
                                    $heroStats->setPlayerId($dbPlayer->getId());
                                    $heroStats->setHero($hero);
                                }

0

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

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

Отправлено 25 Октябрь 2018 - 19:05

Ну конечно же ПРАВИЛЬНО, у меня ТЕПЕРЬ всё работает как часики, блин, я так рад, что у меня что-то получаться начало и при этом, я понимаю что делаю. Спасибо вам огромнейшее.

Еще хочу спросить на счет try и catch, правильно я понял. Их использовать там, где нет больших условий для if else, например:

Если у меня условие if (!hero) использовать try. Если условие if ($hero >= 1) уже использовать if else?

Я закончил, гляньте пожалуйста на наличие ошибок, как время будет. Функционал рабочий, все функции выполняет и записывает в БД.

Вложений


Сообщение изменено: TemKa_SD (25 Октябрь 2018 - 19:41)

0

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

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

Отправлено 26 Октябрь 2018 - 10:34

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

Еще хочу спросить на счет try и catch, правильно я понял. Их использовать там, где нет больших условий для if else, например:

Если у меня условие if (!hero) использовать try. Если условие if ($hero >= 1) уже использовать if else?

Документацию читали? :)
0

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

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

Отправлено 26 Октябрь 2018 - 10:48

Не читал, обязательно почитаю )
0

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

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

Отправлено 28 Октябрь 2018 - 12:08

Ничего не понял из документации (((
0

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

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

Отправлено 28 Октябрь 2018 - 12:25

Допустим нужно достать 1 запись (таблица постов) из БД с определенной датой
$post = \IPS\Db::i()->select('*', 'forums_posts', array('post_date=?', 1422859622))->first();

Если запись существует, то мы получим массив с данными
Если записи не существует, то будет выброшено исключение UnderflowException, которое нужно поймать
Поэтому оборачиваем код в try/catch
try
{
$post = \IPS\Db::i()->select('*', 'forums_posts', array('post_date=?', 1422859622))->first();
}
catch (\UnderflowException $e)
{
}
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
При копировании материалов с сайта
прямая ссылка на источник обязательна