]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blobdiff - includes/specials/SpecialRandompage.php
MediaWiki 1.16.0
[autoinstallsdev/mediawiki.git] / includes / specials / SpecialRandompage.php
index 31199b2399b87c79f83a51c2e32936bbdfb3ac2b..fd3f17f2ff2f93db570e196443f8eaa53f676f94 100644 (file)
@@ -9,12 +9,12 @@
  */
 class RandomPage extends SpecialPage {
        private $namespaces;  // namespaces to select pages from
+       protected $isRedir = false; // should the result be a redirect?
+       protected $extra = array(); // Extra SQL statements
 
-       function __construct( $name = 'Randompage' ){
+       public function __construct( $name = 'Randompage' ){
                global $wgContentNamespaces;
-
                $this->namespaces = $wgContentNamespaces;
-
                parent::__construct( $name );
        }
 
@@ -28,22 +28,23 @@ class RandomPage extends SpecialPage {
        }
 
        // select redirects instead of normal pages?
-       // Overriden by SpecialRandomredirect
        public function isRedirect(){
-               return false;
+               return $this->isRedir;
        }
 
        public function execute( $par ) {
                global $wgOut, $wgContLang;
 
-               if ($par)
+               if ($par) {
                        $this->setNamespace( $wgContLang->getNsIndex( $par ) );
+               }
 
                $title = $this->getRandomTitle();
 
                if( is_null( $title ) ) {
                        $this->setHeaders();
-                       $wgOut->addWikiMsg( strtolower( $this->mName ) . '-nopages',  $wgContLang->getNsText( $this->namespace ) );
+                       $wgOut->addWikiMsg( strtolower( $this->mName ) . '-nopages', 
+                               $this->getNsList(), count( $this->namespaces ) );
                        return;
                }
 
@@ -51,6 +52,23 @@ class RandomPage extends SpecialPage {
                $wgOut->redirect( $title->getFullUrl( $query ) );
        }
 
+       /**
+        * Get a comma-delimited list of namespaces we don't have
+        * any pages in
+        * @return String
+        */
+       private function getNsList() {
+               global $wgContLang;
+               $nsNames = array();
+               foreach( $this->namespaces as $n ) {
+                       if( $n === NS_MAIN )
+                               $nsNames[] = wfMsgForContent( 'blanknamespace' );
+                       else
+                               $nsNames[] = $wgContLang->getNsText( $n );
+               }
+               return $wgContLang->commaList( $nsNames );
+       }
+
 
        /**
         * Choose a random title.
@@ -58,6 +76,10 @@ class RandomPage extends SpecialPage {
         */
        public function getRandomTitle() {
                $randstr = wfRandom();
+               $title = null;
+               if ( !wfRunHooks( 'SpecialRandomGetRandomTitle', array( &$randstr, &$this->isRedir, &$this->namespaces, &$this->extra, &$title ) ) ) {
+                       return $title;
+               }
                $row = $this->selectRandomPageFromDB( $randstr );
 
                /* If we picked a value that was higher than any in
@@ -78,8 +100,6 @@ class RandomPage extends SpecialPage {
 
        private function selectRandomPageFromDB( $randstr ) {
                global $wgExtraRandompageSQL;
-               $fname = 'RandomPage::selectRandomPageFromDB';
-
                $dbr = wfGetDB( DB_SLAVE );
 
                $use_index = $dbr->useIndexClause( 'page_random' );
@@ -87,8 +107,17 @@ class RandomPage extends SpecialPage {
 
                $ns = implode( ",", $this->namespaces );
                $redirect = $this->isRedirect() ? 1 : 0;
-
-               $extra = $wgExtraRandompageSQL ? "AND ($wgExtraRandompageSQL)" : "";
+               
+               if ( $wgExtraRandompageSQL ) {
+                       $this->extra[] = $wgExtraRandompageSQL;
+               }
+               if ( $this->addExtraSQL() ) {
+                       $this->extra[] = $this->addExtraSQL();
+               }
+               $extra = '';
+               if ( $this->extra ) {
+                       $extra = 'AND (' . implode( ') AND (', $this->extra ) . ')';
+               }
                $sql = "SELECT page_title, page_namespace
                        FROM $page $use_index
                        WHERE page_namespace IN ( $ns )
@@ -98,7 +127,15 @@ class RandomPage extends SpecialPage {
                        ORDER BY page_random";
 
                $sql = $dbr->limitResult( $sql, 1, 0 );
-               $res = $dbr->query( $sql, $fname );
+               $res = $dbr->query( $sql, __METHOD__ );
                return $dbr->fetchObject( $res );
        }
+
+       /* an alternative to $wgExtraRandompageSQL so subclasses
+        * can add their own SQL by overriding this function
+        * @deprecated, append to $this->extra instead
+        */
+       public function addExtraSQL() {
+               return '';
+       }
 }