From cad7f5dc0ff2d5b7958c0a72127c95bf0af9df1d Mon Sep 17 00:00:00 2001 From: Andrew Garrett Date: Sat, 15 Dec 2007 06:24:55 +0000 Subject: [PATCH] * New special page: Special:Protectedtitles, which lists titles protected from creation. * Requires schema change introduced in r28385, and perfected in later revisions. --- includes/SpecialPage.php | 1 + includes/SpecialProtectedtitles.php | 219 ++++++++++++++++++++++++++++ languages/messages/MessagesEn.php | 5 + 3 files changed, 225 insertions(+) create mode 100755 includes/SpecialProtectedtitles.php diff --git a/includes/SpecialPage.php b/includes/SpecialPage.php index 6dd707f9ec..7cffa12fc7 100644 --- a/includes/SpecialPage.php +++ b/includes/SpecialPage.php @@ -112,6 +112,7 @@ class SpecialPage 'Ancientpages' => array( 'SpecialPage', 'Ancientpages' ), 'Deadendpages' => array( 'SpecialPage', 'Deadendpages' ), 'Protectedpages' => array( 'SpecialPage', 'Protectedpages' ), + 'Protectedtitles' => array( 'SpecialPage', 'Protectedtitles' ), 'Allpages' => array( 'IncludableSpecialPage', 'Allpages' ), 'Prefixindex' => array( 'IncludableSpecialPage', 'Prefixindex' ) , 'Ipblocklist' => array( 'SpecialPage', 'Ipblocklist' ), diff --git a/includes/SpecialProtectedtitles.php b/includes/SpecialProtectedtitles.php new file mode 100755 index 0000000000..69638afeac --- /dev/null +++ b/includes/SpecialProtectedtitles.php @@ -0,0 +1,219 @@ +setPagetitle( wfMsg( "protectedtitles" ) ); + if ( "" != $msg ) { + $wgOut->setSubtitle( $msg ); + } + + // Purge expired entries on one in every 10 queries + if ( !mt_rand( 0, 10 ) ) { + Title::purgeExpiredRestrictions(); + } + + $type = $wgRequest->getVal( $this->IdType ); + $level = $wgRequest->getVal( $this->IdLevel ); + $sizetype = $wgRequest->getVal( 'sizetype' ); + $size = $wgRequest->getIntOrNull( 'size' ); + $NS = $wgRequest->getIntOrNull( 'namespace' ); + + $pager = new ProtectedTitlesPager( $this, array(), $type, $level, $NS, $sizetype, $size ); + + $wgOut->addHTML( $this->showOptions( $NS, $type, $level, $sizetype, $size ) ); + + if ( $pager->getNumRows() ) { + $s = $pager->getNavigationBar(); + $s .= ""; + $s .= $pager->getNavigationBar(); + } else { + $s = '

' . wfMsgHtml( 'protectedtitlesempty' ) . '

'; + } + $wgOut->addHTML( $s ); + } + + /** + * Callback function to output a restriction + */ + function formatRow( $row ) { + global $wgUser, $wgLang, $wgContLang; + + wfProfileIn( __METHOD__ ); + + static $skin=null; + + if( is_null( $skin ) ) + $skin = $wgUser->getSkin(); + + $title = Title::makeTitleSafe( $row->pt_namespace, $row->pt_title ); + $link = $skin->makeLinkObj( $title ); + + $description_items = array (); + + $protType = wfMsgHtml( 'restriction-level-' . $row->pt_create_perm ); + + $description_items[] = $protType; + + $expiry_description = ''; $stxt = ''; + + if ( $row->pt_expiry != 'infinity' && strlen($row->pt_expiry) ) { + $expiry = Block::decodeExpiry( $row->pt_expiry ); + + $expiry_description = wfMsgForContent( 'protect-expiring', $wgLang->timeanddate( $expiry ) ); + + $description_items[] = $expiry_description; + } + + wfProfileOut( __METHOD__ ); + + return '
  • ' . wfSpecialList( $link . $stxt, implode( $description_items, ', ' ) ) . "
  • \n"; + } + + /** + * @param $namespace int + * @param $type string + * @param $level string + * @param $minsize int + * @private + */ + function showOptions( $namespace, $type='edit', $level, $sizetype, $size ) { + global $wgScript; + $action = htmlspecialchars( $wgScript ); + $title = SpecialPage::getTitleFor( 'ProtectedTitles' ); + $special = htmlspecialchars( $title->getPrefixedDBkey() ); + return "
    \n" . + '
    ' . + Xml::element( 'legend', array(), wfMsg( 'protectedtitles' ) ) . + Xml::hidden( 'title', $special ) . " \n" . + $this->getNamespaceMenu( $namespace ) . " \n" . + $this->getLevelMenu( $level ) . "
    \n" . + " " . Xml::submitButton( wfMsg( 'allpagessubmit' ) ) . "\n" . + "
    "; + } + + /** + * Prepare the namespace filter drop-down; standard namespace + * selector, sans the MediaWiki namespace + * + * @param mixed $namespace Pre-select namespace + * @return string + */ + function getNamespaceMenu( $namespace = null ) { + return Xml::label( wfMsg( 'namespace' ), 'namespace' ) + . ' ' + . Xml::namespaceSelector( $namespace, '' ); + } + + /** + * @return string Formatted HTML + * @private + */ + function getLevelMenu( $pr_level ) { + global $wgRestrictionLevels; + + $m = array( wfMsg('restriction-level-all') => 0 ); // Temporary array + $options = array(); + + // First pass to load the log names + foreach( $wgRestrictionLevels as $type ) { + if ( $type !='' && $type !='*') { + $text = wfMsg("restriction-level-$type"); + $m[$text] = $type; + } + } + + // Third pass generates sorted XHTML content + foreach( $m as $text => $type ) { + $selected = ($type == $pr_level ); + $options[] = Xml::option( $text, $type, $selected ); + } + + return + Xml::label( wfMsg('restriction-level') , $this->IdLevel ) . ' ' . + Xml::tags( 'select', + array( 'id' => $this->IdLevel, 'name' => $this->IdLevel ), + implode( "\n", $options ) ); + } +} + +/** + * @todo document + * @addtogroup Pager + */ +class ProtectedtitlesPager extends AlphabeticPager { + public $mForm, $mConds; + + function __construct( $form, $conds = array(), $type, $level, $namespace, $sizetype='', $size=0 ) { + $this->mForm = $form; + $this->mConds = $conds; + $this->level = $level; + $this->namespace = $namespace; + $this->size = intval($size); + parent::__construct(); + } + + function getStartBody() { + wfProfileIn( __METHOD__ ); + # Do a link batch query + $this->mResult->seek( 0 ); + $lb = new LinkBatch; + + while ( $row = $this->mResult->fetchObject() ) { + $lb->add( $row->pt_namespace, $row->pt_title ); + } + + $lb->execute(); + wfProfileOut( __METHOD__ ); + return ''; + } + + function formatRow( $row ) { + return $this->mForm->formatRow( $row ); + } + + function getQueryInfo() { + $conds = $this->mConds; + $conds[] = 'pt_expiry>' . $this->mDb->addQuotes( $this->mDb->timestamp() ); + + if( !is_null($this->namespace) ) + $conds[] = 'pt_namespace=' . $this->mDb->addQuotes( $this->namespace ); + return array( + 'tables' => 'protected_titles', + 'fields' => 'pt_namespace,pt_title,pt_create_perm,pt_expiry,pt_timestamp', + 'conds' => $conds + ); + } + + function getIndexField() { + return 'pt_timestamp'; + } +} + +/** + * Constructor + */ +function wfSpecialProtectedtitles() { + + $ppForm = new ProtectedTitlesForm(); + + $ppForm->showList(); +} + + + diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php index b1edeba7f1..fbe1337f67 100644 --- a/languages/messages/MessagesEn.php +++ b/languages/messages/MessagesEn.php @@ -382,6 +382,7 @@ $specialPageAliases = array( 'Ancientpages' => array( 'Ancientpages' ), 'Deadendpages' => array( 'Deadendpages' ), 'Protectedpages' => array( 'Protectedpages' ), + 'Protectedtitles' => array( 'Protectedtitles' ), 'Allpages' => array( 'Allpages' ), 'Prefixindex' => array( 'Prefixindex' ) , 'Ipblocklist' => array( 'Ipblocklist' ), @@ -1695,6 +1696,10 @@ The [http://meta.wikimedia.org/wiki/Help:Job_queue job queue] length is '''\$7'' 'protectedpages-summary' => '', # only translate this message to other languages if you have to change it 'protectedpagestext' => 'The following pages are protected from moving or editing', 'protectedpagesempty' => 'No pages are currently protected with these parameters.', +'protectedtitles' => 'Protected titles', +'protectedtitles-summary' => '', # only translate this message to other languages if you have to change it +'protectedtitlestext' => 'The following titles are protected from creation', +'protectedtitlesempty' => 'No titles are currently protected with these parameters.', 'listusers' => 'User list', 'listusers-summary' => '', # only translate this message to other languages if you have to change it 'specialpages' => 'Special pages', -- 2.20.1