/** * Change user reward to higher one. * * <code> * $context = "com_user.registration"; * * $keys = array( * "id" => 1, * "group_id" => 2 * ); * * // Create user reward object based. * $reward = new Gamification\Reward\Reward(\JFactory::getDbo()); * $reward->load($keys); * * $rewardManager = new Gamification\User\Reward\RewardManager(\JFactory::getDbo()); * $rewardManager->setReward($reward); * * if ($rewardManager->give($context, $userId, $options)) { * // ... * } * </code> * * @param string $context * @param int $userId * @param array $options * * @throws \UnexpectedValueException * @throws \RuntimeException * @throws \InvalidArgumentException * * @return null|Reward */ public function give($context, $userId, array $options = array()) { if (!$this->reward instanceof BasicReward) { throw new \UnexpectedValueException('It is missing user reward object.'); } // Check if this reward already exists in user profile. $userProfile = new Profile($this->db); $rewardReceived = $userProfile->isRewardReceived($this->reward, $userId); if (!$rewardReceived) { $data = array('user_id' => $userId, 'group_id' => $this->reward->getGroupId(), 'reward_id' => $this->reward->getId()); // Create user reward. $userReward = new Reward(\JFactory::getDbo()); $userReward->bind($data); // Implement JObservableInterface: Pre-processing by observers $this->observers->update('onBeforeGiveReward', array($context, &$userReward, &$options)); $userReward->store(); // Implement JObservableInterface: Post-processing by observers $this->observers->update('onAfterGiveReward', array($context, &$userReward, &$options)); return $userReward; } return null; }
/** * Change user achievement to higher one. * * <code> * $context = "com_user.registration"; * * $keys = array( * "id" => 1, * "group_id" => 2 * ); * * // Create user achievement object based. * $achievement = new Gamification\Achievement\Achievement(\JFactory::getDbo()); * $achievement->load($keys); * * $achievementManager = new Gamification\User\Achievement\AchievementManager(\JFactory::getDbo()); * $achievementManager->setAchievement($achievement); * * if ($achievementManager->accomplish($context, $userId, $options)) { * // ... * } * </code> * * @param string $context * @param int $userId * @param array $options * * @throws \UnexpectedValueException * @throws \RuntimeException * @throws \InvalidArgumentException * * @return null|Achievement */ public function accomplish($context, $userId, array $options = array()) { if (!$this->achievement instanceof BasicAchievement) { throw new \UnexpectedValueException('It is missing user achievement object.'); } // Check if this achievement already exists in user profile. $userProfile = new Profile($this->db); $achievementAccomplished = $userProfile->isAchievementAccomplished($this->achievement, $userId); if (!$achievementAccomplished) { $date = new \JDate(); $data = array('user_id' => $userId, 'achievement_id' => $this->achievement->getId(), 'accomplished' => 1, 'accomplished_at' => $date->toSql()); // Create user achievement. $userAchievement = new Achievement(\JFactory::getDbo()); $userAchievement->bind($data); // Implement JObservableInterface: Pre-processing by observers $this->observers->update('onBeforeAccomplishAchievement', array($context, &$userAchievement, &$options)); $userAchievement->store(); // Implement JObservableInterface: Post-processing by observers $this->observers->update('onAfterAccomplishAchievement', array($context, &$userAchievement, &$options)); return $userAchievement; } return null; }