/** * Find the level that has to be reached by the user. * * <code> * $keys = array( * 'user_id' => 1, * 'points_id' => 2 * ); * $points = new Gamification\User\Points\Points(\JFactory::getDbo()); * $points->load($keys); * * $levelSeeker = new Gamification\User\Level\LevelPointsSeeker(\JFactory::getDbo()); * $levelSeeker->setUserPoints($points); * * $newLevel = $levelSeeker->find(); * </code> * * @throws \RuntimeException * * @return null|BasicLevel */ public function find() { // Get basic levels based on specific points. $options = array('points_id' => (int) $this->userPoints->getPointsId(), 'state' => (int) Constants::PUBLISHED, 'order_column' => 'a.points_number', 'order_direction' => 'ASC'); $levels = new BasicLevels($this->db); $levels->load($options); $results = $levels->toArray(); /** @var array $results */ $levelData = array(); for ($i = 0, $max = count($results); $i < $max; $i++) { // Get current item $current = array_key_exists($i, $results) ? $results[$i] : array(); /** @var $current array */ // Get next item $n = $i + 1; $next = array_key_exists($n, $results) ? $results[$n] : array(); /** @var $next array */ if (count($next) > 0) { // Check for coincidence with next item if ((int) $next['points_number'] === (int) $this->userPoints->getPointsNumber()) { $levelData = $next; break; } // Check for coincidence with current item if ((int) $current['points_number'] <= (int) $this->userPoints->getPointsNumber() and (int) $next['points_number'] > (int) $this->userPoints->getPointsNumber()) { $levelData = $current; break; } } else { // If there is not next item, we compare with last (current). if ((int) $current['points_number'] <= (int) $this->userPoints->getPointsNumber()) { $levelData = $current; break; } } } // Create a level object. $level = null; if (count($levelData) > 0) { $level = new BasicLevel($this->db); $level->bind($levelData); } return $level; }
/** * Return the levels as array with objects. * * <code> * $options = array( * "ids" => array(1,2,3,4,5) * ); * * $levels = new Gamification\Level\Levels(\JFactory::getDbo()); * $levels->load($options); * * $levels = $levels->getLevels(); * </code> * * @return array */ public function getLevels() { $results = array(); $i = 0; foreach ($this->items as $item) { $level = new Level($this->db); $level->bind($item); $results[$i] = $level; $i++; } return $results; }