wikimedia/mediawiki-core

View on GitHub
includes/specialpage/WantedQueryPage.php

Summary

Maintainability
A
25 mins
Test Coverage
<?php
/**
 * 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.
 * http://www.gnu.org/copyleft/gpl.html
 *
 * @file
 */

namespace MediaWiki\SpecialPage;

use MediaWiki\Title\Title;
use Skin;
use stdClass;
use Wikimedia\Rdbms\IDatabase;
use Wikimedia\Rdbms\IResultWrapper;

/**
 * Base class for a "wanted" query page like WantedPages, WantedTemplates, etc
 *
 * @stable to extend
 * @ingroup SpecialPage
 */
abstract class WantedQueryPage extends QueryPage {
    public function isExpensive() {
        return true;
    }

    public function isSyndicated() {
        return false;
    }

    /**
     * Cache page existence for performance
     * @stable to override
     * @param IDatabase $db
     * @param IResultWrapper $res
     */
    protected function preprocessResults( $db, $res ) {
        $this->executeLBFromResultWrapper( $res );
    }

    /**
     * Should formatResult() always check page existence, even if
     * the results are fresh?  This is a (hopefully temporary)
     * kluge for Special:WantedFiles, which may contain false
     * positives for files that exist e.g. in a shared repo (bug
     * 6220).
     * @stable to override
     * @return bool
     */
    protected function forceExistenceCheck() {
        return false;
    }

    /**
     * Format an individual result
     *
     * @stable to override
     *
     * @param Skin $skin Skin to use for UI elements
     * @param stdClass $result Result row
     * @return string
     */
    public function formatResult( $skin, $result ) {
        $linkRenderer = $this->getLinkRenderer();
        $title = Title::makeTitleSafe( $result->namespace, $result->title );
        if ( $title instanceof Title ) {
            if ( $this->isCached() || $this->forceExistenceCheck() ) {
                $pageLink = $this->existenceCheck( $title )
                    ? '<del>' . $linkRenderer->makeLink( $title ) . '</del>'
                    : $linkRenderer->makeLink( $title );
            } else {
                $pageLink = $linkRenderer->makeBrokenLink( $title );
            }
            return $this->getLanguage()->specialList( $pageLink, $this->makeWlhLink( $title, $result ) );
        } else {
            return $this->msg( 'wantedpages-badtitle', $result->title )->escaped();
        }
    }

    /**
     * Does the Title currently exists
     *
     * This method allows a subclass to override this check
     * (For example, wantedfiles, would want to check if the file exists
     * not just that a page in the file namespace exists).
     *
     * This will only control if the link is crossed out. Whether or not the link
     * is blue vs red is controlled by if the title exists.
     *
     * @note This will only be run if the page is cached (ie $wgMiserMode = true)
     *   unless forceExistenceCheck() is true.
     * @since 1.24
     * @stable to override
     *
     * @param Title $title
     * @return bool
     */
    protected function existenceCheck( Title $title ) {
        return $title->isKnown();
    }

    /**
     * Make a "what links here" link for a given title
     *
     * @param Title $title Title to make the link for
     * @param stdClass $result Result row
     * @return string
     */
    protected function makeWlhLink( $title, $result ) {
        $wlh = SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedText() );
        $label = $this->msg( 'nlinks' )->numParams( $result->value )->text();
        return $this->getLinkRenderer()->makeLink( $wlh, $label );
    }

    /**
     * Order by title for pages with the same number of links to them
     *
     * @stable to override
     * @return array
     * @since 1.29
     */
    protected function getOrderFields() {
        return [ 'value DESC', 'namespace', 'title' ];
    }

    /**
     * Do not order descending for all order fields.  We will use DESC only on one field, see
     * getOrderFields above. This overwrites sortDescending from QueryPage::getOrderFields().
     * Do NOT change this to true unless you remove the phrase DESC in getOrderFields above.
     * If you do a database error will be thrown due to double adding DESC to query!
     *
     * @stable to override
     * @return bool
     * @since 1.29
     */
    protected function sortDescending() {
        return false;
    }

    /**
     * Also use the order fields returned by getOrderFields when fetching from the cache.
     * @stable to override
     * @return array
     * @since 1.29
     */
    protected function getCacheOrderFields() {
        return $this->getOrderFields();
    }

}

/** @deprecated class alias since 1.41 */
class_alias( WantedQueryPage::class, 'WantedQueryPage' );