Moved action=info to an Action subclass; also changed display to use a table (a bit like Special:Statistics) with a column for the page and one for the talk page

This commit is contained in:
Alexandre Emsenhuber 2011-06-20 18:55:17 +00:00
parent ee5922ccf6
commit e275ea28a9
7 changed files with 181 additions and 104 deletions

View file

@ -1829,6 +1829,14 @@ class Article {
$this->protect();
}
/**
* Info about this page
* Called for ?action=info when $wgAllowPageInfo is on.
*/
public function info() {
Action::factory( 'info', $this )->show();
}
/**
* Insert a new empty page record for this article.
* This *must* be followed up by creating a revision
@ -4000,95 +4008,6 @@ class Article {
$wgOut->showErrorPage( 'nosuchaction', 'nosuchactiontext' );
}
/**
* Info about this page
* Called for ?action=info when $wgAllowPageInfo is on.
*/
public function info() {
global $wgLang, $wgOut, $wgAllowPageInfo, $wgUser;
if ( !$wgAllowPageInfo ) {
$wgOut->showErrorPage( 'nosuchaction', 'nosuchactiontext' );
return;
}
$page = $this->mTitle->getSubjectPage();
$wgOut->setPagetitle( $page->getPrefixedText() );
$wgOut->setPageTitleActionText( wfMsg( 'info_short' ) );
$wgOut->setSubtitle( wfMsgHtml( 'infosubtitle' ) );
if ( !$this->mTitle->exists() ) {
$wgOut->addHTML( '<div class="noarticletext">' );
$msg = $wgUser->isLoggedIn()
? 'noarticletext'
: 'noarticletextanon';
$wgOut->addWikiMsg( $msg );
$wgOut->addHTML( '</div>' );
} else {
$dbr = wfGetDB( DB_SLAVE );
$wl_clause = array(
'wl_title' => $page->getDBkey(),
'wl_namespace' => $page->getNamespace() );
$numwatchers = $dbr->selectField(
'watchlist',
'COUNT(*)',
$wl_clause,
__METHOD__ );
$pageInfo = $this->pageCountInfo( $page );
$talkInfo = $this->pageCountInfo( $page->getTalkPage() );
// @todo FIXME: unescaped messages
$wgOut->addHTML( "<ul><li>" . wfMsg( "numwatchers", $wgLang->formatNum( $numwatchers ) ) . '</li>' );
$wgOut->addHTML( "<li>" . wfMsg( 'numedits', $wgLang->formatNum( $pageInfo['edits'] ) ) . '</li>' );
if ( $talkInfo ) {
$wgOut->addHTML( '<li>' . wfMsg( "numtalkedits", $wgLang->formatNum( $talkInfo['edits'] ) ) . '</li>' );
}
$wgOut->addHTML( '<li>' . wfMsg( "numauthors", $wgLang->formatNum( $pageInfo['authors'] ) ) . '</li>' );
if ( $talkInfo ) {
$wgOut->addHTML( '<li>' . wfMsg( 'numtalkauthors', $wgLang->formatNum( $talkInfo['authors'] ) ) . '</li>' );
}
$wgOut->addHTML( '</ul>' );
}
}
/**
* Return the total number of edits and number of unique editors
* on a given page. If page does not exist, returns false.
*
* @param $title Title object
* @return mixed array or boolean false
*/
public function pageCountInfo( $title ) {
$id = $title->getArticleId();
if ( $id == 0 ) {
return false;
}
$dbr = wfGetDB( DB_SLAVE );
$rev_clause = array( 'rev_page' => $id );
$edits = $dbr->selectField(
'revision',
'COUNT(rev_page)',
$rev_clause,
__METHOD__
);
$authors = $dbr->selectField(
'revision',
'COUNT(DISTINCT rev_user_text)',
$rev_clause,
__METHOD__
);
return array( 'edits' => $edits, 'authors' => $authors );
}
/**
* Return a list of templates used by this article.
* Uses the templatelinks table

View file

@ -249,6 +249,7 @@ $wgAutoloadLocalClasses = array(
# includes/actions
'CreditsAction' => 'includes/actions/CreditsAction.php',
'DeletetrackbackAction' => 'includes/actions/DeletetrackbackAction.php',
'InfoAction' => 'includes/actions/InfoAction.php',
'MarkpatrolledAction' => 'includes/actions/MarkpatrolledAction.php',
'PurgeAction' => 'includes/actions/PurgeAction.php',
'RevisiondeleteAction' => 'includes/actions/RevisiondeleteAction.php',

View file

@ -5020,6 +5020,7 @@ $wgMaxRedirectLinksRetrieved = 500;
$wgActions = array(
'credits' => true,
'deletetrackback' => true,
'info' => true,
'markpatrolled' => true,
'purge' => true,
'revisiondelete' => true,

View file

@ -444,7 +444,6 @@ class MediaWiki {
case 'rollback':
case 'protect':
case 'unprotect':
case 'info':
case 'render':
$article->$act();
break;

View file

@ -0,0 +1,149 @@
<?php
/**
* Display informations about a page.
* Very inefficient for the moment.
*
* Copyright © 2011 Alexandre Emsenhuber
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*
* @file
* @ingroup Actions
*/
class InfoAction extends FormlessAction {
public function getName() {
return 'info';
}
public function getRestriction() {
return 'read';
}
protected function getDescription() {
return '';
}
public function requiresWrite() {
return false;
}
public function requiresUnblock() {
return false;
}
public function onView() {
global $wgDisableCounters;
$title = $this->getTitle()->getSubjectPage();
$this->getOutput()->setPagetitle( wfMsg( 'pageinfo-title', $title->getPrefixedText() ) );
$pageInfo = self::pageCountInfo( $title );
$talkInfo = self::pageCountInfo( $title->getTalkPage() );
return Html::rawElement( 'table', array( 'class' => 'wikitable mw-page-info' ),
Html::rawElement( 'tr', array(),
Html::element( 'th', array(), '' ) .
Html::element( 'th', array(), wfMsg( 'pageinfo-subjectpage' ) ) .
Html::element( 'th', array(), wfMsg( 'pageinfo-talkpage' ) )
) .
Html::rawElement( 'tr', array(),
Html::element( 'th', array( 'colspan' => 3 ), wfMsg( 'pageinfo-header-edits' ) )
) .
Html::rawElement( 'tr', array(),
Html::element( 'td', array(), wfMsg( 'pageinfo-edits' ) ) .
Html::element( 'td', array(), $this->getLang()->formatNum( $pageInfo['edits'] ) ) .
Html::element( 'td', array(), $this->getLang()->formatNum( $talkInfo['edits'] ) )
) .
Html::rawElement( 'tr', array(),
Html::element( 'td', array(), wfMsg( 'pageinfo-authors' ) ) .
Html::element( 'td', array(), $this->getLang()->formatNum( $pageInfo['authors'] ) ) .
Html::element( 'td', array(), $this->getLang()->formatNum( $talkInfo['authors'] ) )
) .
( !$this->getUser()->isAllowed( 'unwatchedpages' ) ? '' :
Html::rawElement( 'tr', array(),
Html::element( 'th', array( 'colspan' => 3 ), wfMsg( 'pageinfo-header-watchlist' ) )
) .
Html::rawElement( 'tr', array(),
Html::element( 'td', array(), wfMsg( 'pageinfo-watchers' ) ) .
Html::element( 'td', array( 'colspan' => 2 ), $this->getLang()->formatNum( $pageInfo['watchers'] ) )
)
).
( $wgDisableCounters ? '' :
Html::rawElement( 'tr', array(),
Html::element( 'th', array( 'colspan' => 3 ), wfMsg( 'pageinfo-header-views' ) )
) .
Html::rawElement( 'tr', array(),
Html::element( 'td', array(), wfMsg( 'pageinfo-views' ) ) .
Html::element( 'td', array(), $this->getLang()->formatNum( $pageInfo['views'] ) ) .
Html::element( 'td', array(), $this->getLang()->formatNum( $talkInfo['views'] ) )
) .
Html::rawElement( 'tr', array(),
Html::element( 'td', array(), wfMsg( 'pageinfo-viewsperedit' ) ) .
Html::element( 'td', array(), $this->getLang()->formatNum( sprintf( '%.2f', $pageInfo['edits'] ? $pageInfo['views'] / $pageInfo['edits'] : 0 ) ) ) .
Html::element( 'td', array(), $this->getLang()->formatNum( sprintf( '%.2f', $talkInfo['edits'] ? $talkInfo['views'] / $talkInfo['edits'] : 0 ) ) )
)
)
);
}
/**
* Return the total number of edits and number of unique editors
* on a given page. If page does not exist, returns false.
*
* @param $title Title object
* @return mixed array or boolean false
*/
public static function pageCountInfo( $title ) {
$id = $title->getArticleId();
$dbr = wfGetDB( DB_SLAVE );
$watchers = (int)$dbr->selectField(
'watchlist',
'COUNT(*)',
array(
'wl_title' => $title->getDBkey(),
'wl_namespace' => $title->getNamespace()
),
__METHOD__
);
$edits = (int)$dbr->selectField(
'revision',
'COUNT(rev_page)',
array( 'rev_page' => $id ),
__METHOD__
);
$authors = (int)$dbr->selectField(
'revision',
'COUNT(DISTINCT rev_user_text)',
array( 'rev_page' => $id ),
__METHOD__
);
$views = (int)$dbr->selectField(
'page',
'page_counter',
array( 'page_id' => $id ),
__METHOD__
);
return array( 'watchers' => $watchers, 'edits' => $edits,
'authors' => $authors, 'views' => $views );
}
}

View file

@ -812,7 +812,6 @@ XHTML id names.
'history' => 'Page history',
'history_short' => 'History',
'updatedmarker' => 'updated since my last visit',
'info_short' => 'Information',
'printableversion' => 'Printable version',
'permalink' => 'Permanent link',
'print' => 'Print',
@ -3566,12 +3565,17 @@ This is probably caused by a link to a blacklisted external site.',
'spam_blanking' => 'All revisions contained links to $1, blanking',
# Info page
'infosubtitle' => 'Information for page',
'numedits' => 'Number of edits (page): $1',
'numtalkedits' => 'Number of edits (discussion page): $1',
'numwatchers' => 'Number of watchers: $1',
'numauthors' => 'Number of distinct authors (page): $1',
'numtalkauthors' => 'Number of distinct authors (discussion page): $1',
'pageinfo-title' => 'Information for "$1"',
'pageinfo-header-edits' => 'Edits',
'pageinfo-header-watchlist' => 'Watchlist',
'pageinfo-header-views' => 'Views',
'pageinfo-subjectpage' => 'Page',
'pageinfo-talkpage' => 'Talk page',
'pageinfo-watchers' => 'Number of watchers',
'pageinfo-edits' => 'Number of edits',
'pageinfo-authors' => 'Number of distinct authors',
'pageinfo-views' => 'Number of views',
'pageinfo-viewsperedit' => 'Views per edit',
# Skin names
'skinname-standard' => 'Classic', # only translate this message to other languages if you have to change it

View file

@ -218,7 +218,6 @@ $wgMessageStructure = array(
'history',
'history_short',
'updatedmarker',
'info_short',
'printableversion',
'permalink',
'print',
@ -2513,12 +2512,17 @@ $wgMessageStructure = array(
'spam_blanking',
),
'info' => array(
'infosubtitle',
'numedits',
'numtalkedits',
'numwatchers',
'numauthors',
'numtalkauthors',
'pageinfo-title',
'pageinfo-header-edits',
'pageinfo-header-watchlist',
'pageinfo-header-views',
'pageinfo-subjectpage',
'pageinfo-talkpage',
'pageinfo-watchers',
'pageinfo-edits',
'pageinfo-authors',
'pageinfo-views',
'pageinfo-viewsperedit',
),
'skin' => array(
'skinname-standard',