Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
TemKa_SD

JsonSerializable в IPS

Recommended Posts

Здравствуйте. Имею вот такой файлик с другого движка, это 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

Share this post


Link to post
Share on other sites

Сделал вот еще одну функцию, мне таск пишет 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';

}

Share this post


Link to post
Share on other sites

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

Edited by TemKa_SD

Share this post


Link to post
Share on other sites

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

 

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

Edited by TemKa_SD

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

first() выкидывает исключение, поэтому используйте try/catch

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

Share this post


Link to post
Share on other sites

Пока так:

 

	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 выводить ошибку, что записей в таблице нет?

Edited by TemKa_SD

Share this post


Link to post
Share on other sites

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

 

Было:

 

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

heroesScore.php

Edited by TemKa_SD

Share this post


Link to post
Share on other sites

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

 

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Допустим нужно достать 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)

{

}

Share this post


Link to post
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
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...