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:
parent
ee5922ccf6
commit
e275ea28a9
7 changed files with 181 additions and 104 deletions
|
|
@ -1829,6 +1829,14 @@ class Article {
|
||||||
$this->protect();
|
$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.
|
* Insert a new empty page record for this article.
|
||||||
* This *must* be followed up by creating a revision
|
* This *must* be followed up by creating a revision
|
||||||
|
|
@ -4000,95 +4008,6 @@ class Article {
|
||||||
$wgOut->showErrorPage( 'nosuchaction', 'nosuchactiontext' );
|
$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.
|
* Return a list of templates used by this article.
|
||||||
* Uses the templatelinks table
|
* Uses the templatelinks table
|
||||||
|
|
|
||||||
|
|
@ -249,6 +249,7 @@ $wgAutoloadLocalClasses = array(
|
||||||
# includes/actions
|
# includes/actions
|
||||||
'CreditsAction' => 'includes/actions/CreditsAction.php',
|
'CreditsAction' => 'includes/actions/CreditsAction.php',
|
||||||
'DeletetrackbackAction' => 'includes/actions/DeletetrackbackAction.php',
|
'DeletetrackbackAction' => 'includes/actions/DeletetrackbackAction.php',
|
||||||
|
'InfoAction' => 'includes/actions/InfoAction.php',
|
||||||
'MarkpatrolledAction' => 'includes/actions/MarkpatrolledAction.php',
|
'MarkpatrolledAction' => 'includes/actions/MarkpatrolledAction.php',
|
||||||
'PurgeAction' => 'includes/actions/PurgeAction.php',
|
'PurgeAction' => 'includes/actions/PurgeAction.php',
|
||||||
'RevisiondeleteAction' => 'includes/actions/RevisiondeleteAction.php',
|
'RevisiondeleteAction' => 'includes/actions/RevisiondeleteAction.php',
|
||||||
|
|
|
||||||
|
|
@ -5020,6 +5020,7 @@ $wgMaxRedirectLinksRetrieved = 500;
|
||||||
$wgActions = array(
|
$wgActions = array(
|
||||||
'credits' => true,
|
'credits' => true,
|
||||||
'deletetrackback' => true,
|
'deletetrackback' => true,
|
||||||
|
'info' => true,
|
||||||
'markpatrolled' => true,
|
'markpatrolled' => true,
|
||||||
'purge' => true,
|
'purge' => true,
|
||||||
'revisiondelete' => true,
|
'revisiondelete' => true,
|
||||||
|
|
|
||||||
|
|
@ -444,7 +444,6 @@ class MediaWiki {
|
||||||
case 'rollback':
|
case 'rollback':
|
||||||
case 'protect':
|
case 'protect':
|
||||||
case 'unprotect':
|
case 'unprotect':
|
||||||
case 'info':
|
|
||||||
case 'render':
|
case 'render':
|
||||||
$article->$act();
|
$article->$act();
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
149
includes/actions/InfoAction.php
Normal file
149
includes/actions/InfoAction.php
Normal 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 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -812,7 +812,6 @@ XHTML id names.
|
||||||
'history' => 'Page history',
|
'history' => 'Page history',
|
||||||
'history_short' => 'History',
|
'history_short' => 'History',
|
||||||
'updatedmarker' => 'updated since my last visit',
|
'updatedmarker' => 'updated since my last visit',
|
||||||
'info_short' => 'Information',
|
|
||||||
'printableversion' => 'Printable version',
|
'printableversion' => 'Printable version',
|
||||||
'permalink' => 'Permanent link',
|
'permalink' => 'Permanent link',
|
||||||
'print' => 'Print',
|
'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',
|
'spam_blanking' => 'All revisions contained links to $1, blanking',
|
||||||
|
|
||||||
# Info page
|
# Info page
|
||||||
'infosubtitle' => 'Information for page',
|
'pageinfo-title' => 'Information for "$1"',
|
||||||
'numedits' => 'Number of edits (page): $1',
|
'pageinfo-header-edits' => 'Edits',
|
||||||
'numtalkedits' => 'Number of edits (discussion page): $1',
|
'pageinfo-header-watchlist' => 'Watchlist',
|
||||||
'numwatchers' => 'Number of watchers: $1',
|
'pageinfo-header-views' => 'Views',
|
||||||
'numauthors' => 'Number of distinct authors (page): $1',
|
'pageinfo-subjectpage' => 'Page',
|
||||||
'numtalkauthors' => 'Number of distinct authors (discussion page): $1',
|
'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
|
# Skin names
|
||||||
'skinname-standard' => 'Classic', # only translate this message to other languages if you have to change it
|
'skinname-standard' => 'Classic', # only translate this message to other languages if you have to change it
|
||||||
|
|
|
||||||
|
|
@ -218,7 +218,6 @@ $wgMessageStructure = array(
|
||||||
'history',
|
'history',
|
||||||
'history_short',
|
'history_short',
|
||||||
'updatedmarker',
|
'updatedmarker',
|
||||||
'info_short',
|
|
||||||
'printableversion',
|
'printableversion',
|
||||||
'permalink',
|
'permalink',
|
||||||
'print',
|
'print',
|
||||||
|
|
@ -2513,12 +2512,17 @@ $wgMessageStructure = array(
|
||||||
'spam_blanking',
|
'spam_blanking',
|
||||||
),
|
),
|
||||||
'info' => array(
|
'info' => array(
|
||||||
'infosubtitle',
|
'pageinfo-title',
|
||||||
'numedits',
|
'pageinfo-header-edits',
|
||||||
'numtalkedits',
|
'pageinfo-header-watchlist',
|
||||||
'numwatchers',
|
'pageinfo-header-views',
|
||||||
'numauthors',
|
'pageinfo-subjectpage',
|
||||||
'numtalkauthors',
|
'pageinfo-talkpage',
|
||||||
|
'pageinfo-watchers',
|
||||||
|
'pageinfo-edits',
|
||||||
|
'pageinfo-authors',
|
||||||
|
'pageinfo-views',
|
||||||
|
'pageinfo-viewsperedit',
|
||||||
),
|
),
|
||||||
'skin' => array(
|
'skin' => array(
|
||||||
'skinname-standard',
|
'skinname-standard',
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue