Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

JsonSerializable в IPS

Опубликовано:

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

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

Опубликовано:
  • Автор

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

}

Опубликовано:
  • Автор

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

Изменено пользователем TemKa_SD

Опубликовано:
  • Автор

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

 

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

Изменено пользователем TemKa_SD

Опубликовано:
  • Автор

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

Опубликовано:

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

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

Опубликовано:
  • Автор

Пока так:

 

	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

Опубликовано:
  • Автор

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

 

Было:

 

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

Опубликовано:
  • Автор

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

 

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

 

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

 

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

heroesScore.php

Изменено пользователем TemKa_SD

Опубликовано:

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

 

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

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

Опубликовано:
  • Автор

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

Опубликовано:
  • Автор

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

Опубликовано:

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

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.