]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blobdiff - extensions/Gadgets/includes/GadgetRepo.php
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / extensions / Gadgets / includes / GadgetRepo.php
diff --git a/extensions/Gadgets/includes/GadgetRepo.php b/extensions/Gadgets/includes/GadgetRepo.php
new file mode 100644 (file)
index 0000000..76e9dec
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+
+abstract class GadgetRepo {
+
+       /**
+        * @var GadgetRepo|null
+        */
+       private static $instance;
+
+       /**
+        * Get the ids of the gadgets provided by this repository
+        *
+        * It's possible this could be out of sync with what
+        * getGadget() will return due to caching
+        *
+        * @return string[]
+        */
+       abstract public function getGadgetIds();
+
+       /**
+        * Get the Gadget object for a given gadget id
+        *
+        * @param string $id
+        * @throws InvalidArgumentException
+        * @return Gadget
+        */
+       abstract public function getGadget( $id );
+
+       /**
+        * Get a list of gadgets sorted by category
+        *
+        * @return array [ 'category' => [ 'name' => $gadget ] ]
+        */
+       public function getStructuredList() {
+               $list = [];
+               foreach ( $this->getGadgetIds() as $id ) {
+                       try {
+                               $gadget = $this->getGadget( $id );
+                       } catch ( InvalidArgumentException $e ) {
+                               continue;
+                       }
+                       $list[$gadget->getCategory()][$gadget->getName()] = $gadget;
+               }
+
+               return $list;
+       }
+
+       /**
+        * Get the configured default GadgetRepo.
+        *
+        * @return GadgetRepo
+        */
+       public static function singleton() {
+               if ( self::$instance === null ) {
+                       global $wgGadgetsRepoClass; // @todo use Config here
+                       self::$instance = new $wgGadgetsRepoClass();
+               }
+               return self::$instance;
+       }
+
+       /**
+        * Should only be used by unit tests
+        *
+        * @param GadgetRepo|null $repo
+        */
+       public static function setSingleton( $repo = null ) {
+               self::$instance = $repo;
+       }
+}