* The number of rows returned by the query. Reading this variable
* only makes sense in functions that are run after the query has been
* done, such as preprocessResults() and formatRow().
+ *
+ * @var int
*/
protected $numRows;
+ /**
+ * @var string|null
+ */
protected $cachedTimestamp = null;
/**
- * Whether to show prev/next links
+ * @var bool Whether to show prev/next links
*/
protected $shownavigation = true;
*
* DO NOT CHANGE THIS LIST without testing that
* maintenance/updateSpecialPages.php still works.
- * @return array
+ *
+ * @return string[][]
*/
public static function getPages() {
static $qp = null;
* Subclasses return an array of fields to order by here. Don't append
* DESC to the field names, that'll be done automatically if
* sortDescending() returns true.
- * @return array
+ * @return string[]
* @since 1.18
*/
function getOrderFields() {
return [];
}
- /**
- * Some special pages (for example SpecialListusers used to) might not return the
- * current object formatted, but return the previous one instead.
- * Setting this to return true will ensure formatResult() is called
- * one more time to make sure that the very last result is formatted
- * as well.
- *
- * @deprecated since 1.27
- *
- * @return bool
- */
- function tryLastResult() {
- return false;
- }
-
/**
* Clear the cache and save new results
*
return [ 'value' ];
}
+ /**
+ * @return string
+ */
public function getCachedTimestamp() {
if ( is_null( $this->cachedTimestamp ) ) {
$dbr = wfGetDB( DB_REPLICA );
/**
* This is the actual workhorse. It does everything needed to make a
* real, honest-to-gosh query page.
- * @param string $par
+ * @param string|null $par
*/
public function execute( $par ) {
$user = $this->getUser();
$miserMaxResults = $this->getConfig()->get( 'MiserMode' )
&& ( $this->offset + $this->limit >= $this->getMaxResults() );
$atEnd = ( $this->numRows <= $this->limit ) || $miserMaxResults;
- $paging = $this->getLanguage()->viewPrevNext( $this->getPageTitle( $par ), $this->offset,
- $this->limit, $this->linkParameters(), $atEnd );
+ $paging = $this->buildPrevNextNavigation( $this->offset,
+ $this->limit, $this->linkParameters(), $atEnd, $par );
$out->addHTML( '<p>' . $paging . '</p>' );
} else {
# No results to show, so don't bother with "showing X of Y" etc.
# an OutputPage, and let them get on with it
$this->outputResults( $out,
$this->getSkin(),
- $dbr, # Should use a ResultWrapper for this
+ $dbr, # Should use IResultWrapper for this
$res,
min( $this->numRows, $this->limit ), # do not format the one extra row, if exist
$this->offset );
# $res might contain the whole 1,000 rows, so we read up to
# $num [should update this to use a Pager]
- // phpcs:ignore Generic.CodeAnalysis.ForLoopWithTestFunctionCall
for ( $i = 0; $i < $num && $row = $res->fetchObject(); $i++ ) {
$line = $this->formatResult( $skin, $row );
if ( $line ) {
}
}
- # Flush the final result
- if ( $this->tryLastResult() ) {
- $row = null;
- $line = $this->formatResult( $skin, $row );
- if ( $line ) {
- $html[] = $this->listoutput
- ? $line
- : "<li>{$line}</li>\n";
- }
- }
-
if ( !$this->listoutput ) {
$html[] = $this->closeList();
}
}
/**
- * Similar to above, but packaging in a syndicated feed instead of a web page
- * @param string $class
- * @param int $limit
- * @return bool
- */
- function doFeed( $class = '', $limit = 50 ) {
- if ( !$this->getConfig()->get( 'Feed' ) ) {
- $this->getOutput()->addWikiMsg( 'feed-unavailable' );
- return false;
- }
-
- $limit = min( $limit, $this->getConfig()->get( 'FeedLimit' ) );
-
- $feedClasses = $this->getConfig()->get( 'FeedClasses' );
- if ( isset( $feedClasses[$class] ) ) {
- /** @var RSSFeed|AtomFeed $feed */
- $feed = new $feedClasses[$class](
- $this->feedTitle(),
- $this->feedDesc(),
- $this->feedUrl() );
- $feed->outHeader();
-
- $res = $this->reallyDoQuery( $limit, 0 );
- foreach ( $res as $obj ) {
- $item = $this->feedResult( $obj );
- if ( $item ) {
- $feed->outItem( $item );
- }
- }
-
- $feed->outFooter();
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * Override for custom handling. If the titles/links are ok, just do
- * feedItemDesc()
- * @param object $row
- * @return FeedItem|null
- */
- function feedResult( $row ) {
- if ( !isset( $row->title ) ) {
- return null;
- }
- $title = Title::makeTitle( intval( $row->namespace ), $row->title );
- if ( $title ) {
- $date = $row->timestamp ?? '';
- $comments = '';
- if ( $title ) {
- $talkpage = $title->getTalkPage();
- $comments = $talkpage->getFullURL();
- }
-
- return new FeedItem(
- $title->getPrefixedText(),
- $this->feedItemDesc( $row ),
- $title->getFullURL(),
- $date,
- $this->feedItemAuthor( $row ),
- $comments );
- } else {
- return null;
- }
- }
-
- function feedItemDesc( $row ) {
- return isset( $row->comment ) ? htmlspecialchars( $row->comment ) : '';
- }
-
- function feedItemAuthor( $row ) {
- return $row->user_text ?? '';
- }
-
- function feedTitle() {
- $desc = $this->getDescription();
- $code = $this->getConfig()->get( 'LanguageCode' );
- $sitename = $this->getConfig()->get( 'Sitename' );
- return "$sitename - $desc [$code]";
- }
-
- function feedDesc() {
- return $this->msg( 'tagline' )->text();
- }
-
- function feedUrl() {
- return $this->getPageTitle()->getFullURL();
- }
-
- /**
- * Creates a new LinkBatch object, adds all pages from the passed ResultWrapper (MUST include
+ * Creates a new LinkBatch object, adds all pages from the passed result wrapper (MUST include
* title and optional the namespace field) and executes the batch. This operation will pre-cache
* LinkCache information like page existence and information for stub color and redirect hints.
*
- * @param IResultWrapper $res The ResultWrapper object to process. Needs to include the title
+ * @param IResultWrapper $res The result wrapper to process. Needs to include the title
* field and namespace field, if the $ns parameter isn't set.
- * @param null $ns Use this namespace for the given titles in the ResultWrapper object,
+ * @param null $ns Use this namespace for the given titles in the result wrapper,
* instead of the namespace value of $res.
*/
protected function executeLBFromResultWrapper( IResultWrapper $res, $ns = null ) {