--- /dev/null
+<?php
+namespace wcf\data\trophy\category;
+use wcf\data\category\AbstractDecoratedCategory;
+use wcf\data\trophy\Trophy;
+use wcf\data\trophy\TrophyCache;
+use wcf\data\user\User;
+use wcf\data\ITitledLinkObject;
+use wcf\system\request\LinkHandler;
+use wcf\system\WCF;
+
+/**
+ * Represents a trophy category.
+ *
+ * @author Joshua Ruesweg
+ * @copyright 2001-2017 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package WoltLabSuite\Core\Data\Trophy\Category
+ * @since 3.1
+ *
+ * @method TrophyCategory[] getChildCategories()
+ * @method TrophyCategory[] getAllChildCategories()
+ * @method TrophyCategory getParentCategory()
+ * @method TrophyCategory[] getParentCategories()
+ * @method static TrophyCategory|null getCategory($categoryID)
+ */
+class TrophyCategory extends AbstractDecoratedCategory implements ITitledLinkObject {
+ /**
+ * object type name of the trophy categories
+ * @var string
+ */
+ const OBJECT_TYPE_NAME = 'com.woltlab.wcf.trophy.category';
+
+ /**
+ * @inheritDoc
+ */
+ public function isAccessible(User $user = null) {
+ if ($this->getObjectType()->objectType != self::OBJECT_TYPE_NAME) return false;
+
+ if ($this->getDecoratedObject()->isDisabled) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * @inheritDoc
+ */
+ public function getLink() {
+ return LinkHandler::getInstance()->getLink('TrophyList', [
+ 'forceFrontend' => true,
+ 'object' => $this->getDecoratedObject()
+ ]);
+ }
+
+ /** @noinspection PhpMissingParentCallCommonInspection */
+ /**
+ * @inheritDoc
+ */
+ public function getTitle() {
+ return WCF::getLanguage()->get($this->title);
+ }
+}
--- /dev/null
+<?php
+namespace wcf\data\trophy\category;
+use wcf\system\cache\builder\CategoryCacheBuilder;
+use wcf\system\SingletonFactory;
+
+/**
+ * Trophy category cache management.
+ *
+ * @author Joshua Ruesweg
+ * @copyright 2001-2017 WoltLab GmbH
+ * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
+ * @package WoltLabSuite\Core\Data\Trophy\Category
+ * @since 3.1
+ */
+class TrophyCategoryCache extends SingletonFactory {
+ /**
+ * All categories for trophies.
+ * @var TrophyCategory[]
+ */
+ protected $categories = [];
+
+ /**
+ * All enabled categories for trophies.
+ * @var TrophyCategory[]
+ */
+ protected $enabledCategories = [];
+
+ /**
+ * @inheritDoc
+ */
+ public function init() {
+ $categoryData = CategoryCacheBuilder::getInstance()->getData();
+ if (isset($categoryData['objectTypeCategoryIDs'][TrophyCategory::OBJECT_TYPE_NAME])) {
+ $categoryIDs = $categoryData['objectTypeCategoryIDs'][TrophyCategory::OBJECT_TYPE_NAME];
+
+ foreach ($categoryIDs as $categoryID) {
+ $this->categories[$categoryID] = new TrophyCategory($categoryData['categories'][$categoryID]);
+
+ if (!$categoryData['categories'][$categoryID]->isDisabled) {
+ $this->enabledCategories[$categoryID] = $this->categories[$categoryID];
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns the trophy category with the given id.
+ *
+ * @param integer $categoryID
+ * @return TrophyCategory|null
+ */
+ public function getCategoryByID($categoryID) {
+ if (isset($this->categories[$categoryID])) {
+ return $this->categories[$categoryID];
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns the categories with the given id.
+ *
+ * @param integer[] $categoryID
+ * @return TrophyCategory[]
+ */
+ public function getCategoriesByID(array $categoryID) {
+ $returnValues = [];
+
+ foreach ($categoryID as $categoryID) {
+ $returnValues[] = $this->getCategoryByID($categoryID);
+ }
+
+ return $returnValues;
+ }
+
+ /**
+ * Return all categories.
+ *
+ * @return TrophyCategory[]
+ */
+ public function getCategories() {
+ return $this->categories;
+ }
+
+ /**
+ * Return all enabled categories.
+ *
+ * @return TrophyCategory[]
+ */
+ public function getEnabledCategories() {
+ return $this->enabledCategories;
+ }
+}