summaryrefslogtreecommitdiff
path: root/includes/SpecialMostlinkedtemplates.php
blob: e7e7afcceb9b32eaf0c6740cdedc3f96440ccf8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<?php

/**
 * Special page lists templates with a large number of
 * transclusion links, i.e. "most used" templates
 *
 * @addtogroup SpecialPage
 * @author Rob Church <robchur@gmail.com>
 */
class SpecialMostlinkedtemplates extends QueryPage {

	/**
	 * Name of the report
	 *
	 * @return string
	 */
	public function getName() {
		return 'Mostlinkedtemplates';
	}
	
	/**
	 * Is this report expensive, i.e should it be cached?
	 *
	 * @return bool
	 */
	public function isExpensive() {
		return true;
	}
	
	/**
	 * Is there a feed available?
	 *
	 * @return bool
	 */
	public function isSyndicated() {
		return false;
	}

	/**
	 * Sort the results in descending order?
	 *
	 * @return bool
	 */
	public function sortDescending() {
		return true;
	}
	
	/**
	 * Generate SQL for the report
	 *
	 * @return string
	 */
	public function getSql() {
		$dbr = wfGetDB( DB_SLAVE );
		$templatelinks = $dbr->tableName( 'templatelinks' );
		$name = $dbr->addQuotes( $this->getName() );
		return "SELECT {$name} AS type,
			" . NS_TEMPLATE . " AS namespace,
			tl_title AS title,
			COUNT(*) AS value
			FROM {$templatelinks}
			WHERE tl_namespace = " . NS_TEMPLATE . "
			GROUP BY 1, 2, 3";			
	}
	
	/**
	 * Pre-cache page existence to speed up link generation
	 *
	 * @param Database $dbr Database connection
	 * @param int $res Result pointer
	 */
	public function preprocessResults( $dbr, $res ) {
		$batch = new LinkBatch();
		while( $row = $dbr->fetchObject( $res ) ) {
			$title = Title::makeTitleSafe( $row->namespace, $row->title );
			$batch->addObj( $title );
		}
		$batch->execute();
		if( $dbr->numRows( $res ) > 0 )
			$dbr->dataSeek( $res, 0 );
	}
	
	/**
	 * Format a result row
	 *
	 * @param Skin $skin Skin to use for UI elements
	 * @param object $result Result row
	 * @return string
	 */
	public function formatResult( $skin, $result ) {
		$title = Title::makeTitleSafe( $result->namespace, $result->title );
		if( $title instanceof Title ) {
			return wfSpecialList(
				$skin->makeLinkObj( $title ),
				$this->makeWlhLink( $title, $skin, $result )
			);
		} else {
			$tsafe = htmlspecialchars( $result->title );
			return "Invalid title in result set; {$tsafe}";
		}
	}
	
	/**
	 * Make a "what links here" link for a given title
	 *
	 * @param Title $title Title to make the link for
	 * @param Skin $skin Skin to use
	 * @param object $result Result row
	 * @return string
	 */
	private function makeWlhLink( $title, $skin, $result ) {
		global $wgLang;
		$wlh = SpecialPage::getTitleFor( 'Whatlinkshere' );
		$label = wfMsgExt( 'nlinks', array( 'parsemag', 'escape' ),
			$wgLang->formatNum( $result->value ) );
		return $skin->makeKnownLinkObj( $wlh, $label, 'target=' . $title->getPrefixedUrl() );
	}
	
}

/**
 * Execution function
 *
 * @param mixed $par Parameters passed to the page
 */
function wfSpecialMostlinkedtemplates( $par = false ) {
	list( $limit, $offset ) = wfCheckLimits();
	$mlt = new SpecialMostlinkedtemplates();
	$mlt->doQuery( $offset, $limit );
}