pagehistory.php

来自「php 开发的内容管理系统」· PHP 代码 · 共 686 行 · 第 1/2 页

PHP
686
字号
<?php/** * Page history * * Split off from Article.php and Skin.php, 2003-12-22 * @package MediaWiki *//** * This class handles printing the history page for an article.  In order to * be efficient, it uses timestamps rather than offsets for paging, to avoid * costly LIMIT,offset queries. * * Construct it by passing in an Article, and call $h->history() to print the * history. * * @package MediaWiki */class PageHistory {	const DIR_PREV = 0;	const DIR_NEXT = 1;		var $mArticle, $mTitle, $mSkin;	var $lastdate;	var $linesonpage;	var $mNotificationTimestamp;	var $mLatestId = null;	/**	 * Construct a new PageHistory.	 *	 * @param Article $article	 * @returns nothing	 */	function PageHistory($article) {		global $wgUser;		$this->mArticle =& $article;		$this->mTitle =& $article->mTitle;		$this->mNotificationTimestamp = NULL;		$this->mSkin = $wgUser->getSkin();		$this->defaultLimit = 50;	}	/**	 * Print the history page for an article.	 *	 * @returns nothing	 */	function history() {		global $wgOut, $wgRequest, $wgTitle;		/*		 * Allow client caching.		 */		if( $wgOut->checkLastModified( $this->mArticle->getTimestamp() ) )			/* Client cache fresh and headers sent, nothing more to do. */			return;		$fname = 'PageHistory::history';		wfProfileIn( $fname );		/*		 * Setup page variables.		 */		$wgOut->setPageTitle( $this->mTitle->getPrefixedText() );		$wgOut->setArticleFlag( false );		$wgOut->setArticleRelated( true );		$wgOut->setRobotpolicy( 'noindex,nofollow' );		$wgOut->setSyndicated( true );		$logPage = Title::makeTitle( NS_SPECIAL, 'Log' );		$logLink = $this->mSkin->makeKnownLinkObj( $logPage, wfMsgHtml( 'viewpagelogs' ), 'page=' . $this->mTitle->getPrefixedUrl() );		$subtitle = wfMsgHtml( 'revhistory' ) . '<br />' . $logLink;		$wgOut->setSubtitle( $subtitle );		$feedType = $wgRequest->getVal( 'feed' );		if( $feedType ) {			wfProfileOut( $fname );			return $this->feed( $feedType );		}		/*		 * Fail if article doesn't exist.		 */		if( !$this->mTitle->exists() ) {			$wgOut->addWikiText( wfMsg( 'nohistory' ) );			wfProfileOut( $fname );			return;		}		$dbr =& wfGetDB(DB_SLAVE);		/*		 * Extract limit, the number of revisions to show, and		 * offset, the timestamp to begin at, from the URL.		 */		$limit = $wgRequest->getInt('limit', $this->defaultLimit);		if ( $limit <= 0 ) {			$limit = $this->defaultLimit;		} elseif ( $limit > 50000 ) {			# Arbitrary maximum			# Any more than this and we'll probably get an out of memory error			$limit = 50000;		}		$offset = $wgRequest->getText('offset');		/* Offset must be an integral. */		if (!strlen($offset) || !preg_match("/^[0-9]+$/", $offset))			$offset = 0;#		$offset = $dbr->timestamp($offset);		$dboffset = $offset === 0 ? 0 : $dbr->timestamp($offset);		/*		 * "go=last" means to jump to the last history page.		 */		if (($gowhere = $wgRequest->getText("go")) !== NULL) {			$gourl = null;			switch ($gowhere) {			case "first":				if (($lastid = $this->getLastOffsetForPaging($this->mTitle->getArticleID(), $limit)) === NULL)					break;				$gourl = $wgTitle->getLocalURL("action=history&limit={$limit}&offset=".						wfTimestamp(TS_MW, $lastid));				break;			}			if (!is_null($gourl)) {				$wgOut->redirect($gourl);				return;			}		}		/*		 * Fetch revisions.		 *		 * If the user clicked "previous", we retrieve the revisions backwards,		 * then reverse them.  This is to avoid needing to know the timestamp of		 * previous revisions when generating the URL.		 */		$direction = $this->getDirection();		$revisions = $this->fetchRevisions($limit, $dboffset, $direction);		$navbar = $this->makeNavbar($revisions, $offset, $limit, $direction);		/*		 * We fetch one more revision than needed to get the timestamp of the		 * one after this page (and to know if it exists).		 *		 * linesonpage stores the actual number of lines.		 */		if (count($revisions) < $limit + 1)			$this->linesonpage = count($revisions);		else			$this->linesonpage = count($revisions) - 1;		/* Un-reverse revisions */		if ($direction == PageHistory::DIR_PREV)			$revisions = array_reverse($revisions);		/*		 * Print the top navbar.		 */		$s = $navbar;		$s .= $this->beginHistoryList();		$counter = 1;		/*		 * Print each revision, excluding the one-past-the-end, if any.		 */		foreach (array_slice($revisions, 0, $limit) as $i => $line) {			$latest = !$i && $offset == 0;			$firstInList = !$i;			$next = isset( $revisions[$i + 1] ) ? $revisions[$i + 1 ] : null;			$s .= $this->historyLine($line, $next, $counter, $this->getNotificationTimestamp(), $latest, $firstInList);			$counter++;		}		/*		 * End navbar.		*/		$s .= $this->endHistoryList();		$s .= $navbar;		$wgOut->addHTML( $s );		wfProfileOut( $fname );	}	/** @todo document */	function beginHistoryList() {		global $wgTitle;		$this->lastdate = '';		$s = wfMsgExt( 'histlegend', array( 'parse') );		$s .= '<form action="' . $wgTitle->escapeLocalURL( '-' ) . '" method="get">';		$prefixedkey = htmlspecialchars($wgTitle->getPrefixedDbKey());		// The following line is SUPPOSED to have double-quotes around the		// $prefixedkey variable, because htmlspecialchars() doesn't escape		// single-quotes.		//		// On at least two occasions people have changed it to single-quotes,		// which creates invalid HTML and incorrect display of the resulting		// link.		//		// Please do not break this a third time. Thank you for your kind		// consideration and cooperation.		//		$s .= "<input type='hidden' name='title' value=\"{$prefixedkey}\" />\n";		$s .= $this->submitButton();		$s .= '<ul id="pagehistory">' . "\n";		return $s;	}	/** @todo document */	function endHistoryList() {		$s = '</ul>';		$s .= $this->submitButton( array( 'id' => 'historysubmit' ) );		$s .= '</form>';		return $s;	}	/** @todo document */	function submitButton( $bits = array() ) {		return ( $this->linesonpage > 0 )			? wfElement( 'input', array_merge( $bits,				array(					'class'     => 'historysubmit',					'type'      => 'submit',					'accesskey' => wfMsg( 'accesskey-compareselectedversions' ),					'title'     => wfMsg( 'tooltip-compareselectedversions' ),					'value'     => wfMsg( 'compareselectedversions' ),				) ) )			: '';	}	/** @todo document */	function historyLine( $row, $next, $counter = '', $notificationtimestamp = false, $latest = false, $firstInList = false ) {		global $wgUser;		$rev = new Revision( $row );		$rev->setTitle( $this->mTitle );		$s = '<li>';		$curlink = $this->curLink( $rev, $latest );		$lastlink = $this->lastLink( $rev, $next, $counter );		$arbitrary = $this->diffButtons( $rev, $firstInList, $counter );		$link = $this->revLink( $rev );				$user = $this->mSkin->userLink( $rev->getUser(), $rev->getUserText() )				. $this->mSkin->userToolLinks( $rev->getUser(), $rev->getUserText() );				$s .= "($curlink) ($lastlink) $arbitrary";				if( $wgUser->isAllowed( 'deleterevision' ) ) {			$revdel = Title::makeTitle( NS_SPECIAL, 'Revisiondelete' );			if( $firstInList ) {				// We don't currently handle well changing the top revision's settings				$del = wfMsgHtml( 'rev-delundel' );			} else {				$del = $this->mSkin->makeKnownLinkObj( $revdel,					wfMsg( 'rev-delundel' ),					'target=' . urlencode( $this->mTitle->getPrefixedDbkey() ) .					'&oldid=' . urlencode( $rev->getId() ) );			}			$s .= "(<small>$del</small>) ";		}				$s .= " $link <span class='history-user'>$user</span>";		if( $row->rev_minor_edit ) {			$s .= ' ' . wfElement( 'span', array( 'class' => 'minor' ), wfMsg( 'minoreditletter') );		}		$s .= $this->mSkin->revComment( $rev );		if ($notificationtimestamp && ($row->rev_timestamp >= $notificationtimestamp)) {			$s .= ' <span class="updatedmarker">' .  wfMsgHtml( 'updatedmarker' ) . '</span>';		}		if( $row->rev_deleted & Revision::DELETED_TEXT ) {			$s .= ' ' . wfMsgHtml( 'deletedrev' );		}		$s .= "</li>\n";		return $s;	}		/** @todo document */	function revLink( $rev ) {		global $wgLang;		$date = $wgLang->timeanddate( wfTimestamp(TS_MW, $rev->getTimestamp()), true );		if( $rev->userCan( Revision::DELETED_TEXT ) ) {			$link = $this->mSkin->makeKnownLinkObj(				$this->mTitle, $date, "oldid=" . $rev->getId() );		} else {			$link = $date;		}		if( $rev->isDeleted( Revision::DELETED_TEXT ) ) {			return '<span class="history-deleted">' . $link . '</span>';		}		return $link;	}	/** @todo document */	function curLink( $rev, $latest ) {		$cur = wfMsgExt( 'cur', array( 'escape') );		if( $latest || !$rev->userCan( Revision::DELETED_TEXT ) ) {			return $cur;		} else {			return $this->mSkin->makeKnownLinkObj(				$this->mTitle, $cur,				'diff=' . $this->getLatestID() .				"&oldid=" . $rev->getId() );		}	}	/** @todo document */	function lastLink( $rev, $next, $counter ) {		$last = wfMsgExt( 'last', array( 'escape' ) );		if( is_null( $next ) ) {			if( $rev->getTimestamp() == $this->getEarliestOffset() ) {				return $last;			} else {				// Cut off by paging; there are more behind us...				return $this->mSkin->makeKnownLinkObj(					$this->mTitle,					$last,					"diff=" . $rev->getId() . "&oldid=prev" );			}		} elseif( !$rev->userCan( Revision::DELETED_TEXT ) ) {			return $last;		} else {			return $this->mSkin->makeKnownLinkObj(				$this->mTitle,				$last,				"diff=" . $rev->getId() . "&oldid={$next->rev_id}"				/*,				'',				'',				"tabindex={$counter}"*/ );		}	}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?