* 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() {
/**
* Get a DB connection to be used for slow recache queries
- * @return IDatabase
+ * @return \Wikimedia\Rdbms\Database
*/
function getRecacheDB() {
return wfGetDB( DB_REPLICA, [ $this->getName(), 'QueryPage::recache', 'vslow' ] );
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.
function preprocessResults( $db, $res ) {
}
- /**
- * 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
* title and optional the namespace field) and executes the batch. This operation will pre-cache