summaryrefslogtreecommitdiff
path: root/includes/specials/SpecialRandompage.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/specials/SpecialRandompage.php')
-rw-r--r--includes/specials/SpecialRandompage.php61
1 files changed, 49 insertions, 12 deletions
diff --git a/includes/specials/SpecialRandompage.php b/includes/specials/SpecialRandompage.php
index 31199b23..fd3f17f2 100644
--- a/includes/specials/SpecialRandompage.php
+++ b/includes/specials/SpecialRandompage.php
@@ -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 '';
+ }
}