New RSS feed should be easier to integrate with any QueryPage. Sample for Newpages.
[lhc/web/wiklou.git] / includes / QueryPage.php
1 <?php
2
3 include_once ( "LogPage.php" ) ;
4 include_once ( "Feed.php" );
5
6 # This is a class for doing query pages; since they're almost all the same,
7 # we factor out some of the functionality into a superclass, and let
8 # subclasses derive from it.
9
10 class QueryPage {
11 # Subclasses return their name here. Make sure the name is also
12 # specified in Language.php, both in the $wgValidSpecialPagesEn
13 # variable, and as a language message param.
14
15 function getName() {
16 return "";
17 }
18
19 # Subclasses return a SQL query here.
20
21 function getSQL( $offset, $limit ) {
22 return "";
23 }
24
25 # Is this query expensive (for some definition of expensive)? Then we
26 # don't let it run in miser mode. $wgDisableQueryPages causes all query
27 # pages to be declared expensive. Some query pages are always expensive.
28 function isExpensive( ) {
29 global $wgDisableQueryPages;
30 return $wgDisableQueryPages;
31 }
32
33 # Formats the results of the query for display. The skin is the current
34 # skin; you can use it for making links. The result is a single row of
35 # result data. You should be able to grab SQL results off of it.
36
37 function formatResult( $skin, $result ) {
38 return "";
39 }
40
41 # This is the actual workhorse. It does everything needed to make a
42 # real, honest-to-gosh query page.
43
44 function doQuery( $offset, $limit ) {
45
46 global $wgUser, $wgOut, $wgLang, $wgMiserMode;
47
48 $sname = $this->getName();
49 $fname = get_class($this) . "::doQuery";
50
51 if ( $this->isExpensive( ) ) {
52
53 $vsp = $wgLang->getValidSpecialPages();
54 $logpage = new LogPage( "!" . $vsp[$sname] );
55 $logpage->mUpdateRecentChanges = false;
56
57 if ( $wgMiserMode ) {
58 $logpage->showAsDisabledPage();
59 return;
60 }
61 }
62
63 $sql = $this->getSQL( $offset, $limit );
64
65 $res = wfQuery( $sql, DB_READ, $fname );
66
67 $sk = $wgUser->getSkin( );
68
69 $top = wfShowingResults( $offset, $limit );
70 $wgOut->addHTML( "<p>{$top}\n" );
71
72 $sl = wfViewPrevNext( $offset, $limit, $wgLang->specialPage( $sname ) );
73 $wgOut->addHTML( "<br>{$sl}\n" );
74
75 $s = "<ol start=" . ( $offset + 1 ) . ">";
76 while ( $obj = wfFetchObject( $res ) ) {
77 $format = $this->formatResult( $sk, $obj );
78 $s .= "<li>{$format}</li>\n";
79 }
80 wfFreeResult( $res );
81 $s .= "</ol>";
82 $wgOut->addHTML( $s );
83 $wgOut->addHTML( "<p>{$sl}\n" );
84
85 # Saving cache
86
87 if ( $this->isExpensive() && $offset == 0 && $limit >= 50 ) {
88 $logpage->replaceContent( $s );
89 }
90 }
91
92 # Similar to above, but packaging in a syndicated feed instead of a web page
93 function doFeed( $class = "" ) {
94 global $wgFeedClasses;
95 global $wgOut, $wgLanguageCode, $wgLang;
96 if( $class == "rss" ) {
97 $wgOut->disable();
98
99 $feed = new RSSFeed(
100 $this->feedTitle(),
101 $this->feedDesc(),
102 $this->feedUrl() );
103 $feed->outHeader();
104
105 $sql = $this->getSQL( 0, 50 );
106 $res = wfQuery( $sql, DB_READ, "QueryPage::doFeed" );
107 while( $obj = wfFetchObject( $res ) ) {
108 $item = $this->feedResult( $obj );
109 if( $item ) $feed->outItem( $item );
110 }
111 wfFreeResult( $res );
112
113 $feed->outFooter();
114 return true;
115 } else {
116 return false;
117 }
118 }
119
120 # Override for custom handling. If the titles/links are ok, just do feedItemDesc()
121 function feedResult( $result ) {
122 if( isset( $result->cur_title ) ) {
123 $title = Title::MakeTitle( $result->cur_namespace, $result->cur_title );
124 } elseif( isset( $result->old_title ) ) {
125 $title = Title::MakeTitle( $result->old_namespace, $result->old_title );
126 } elseif( isset( $result->rc_title ) ) {
127 $title = Title::MakeTitle( $result->rc_namespace, $result->rc_title );
128 } else {
129 return NULL;
130 }
131 if( $title ) {
132 return new FeedItem(
133 $title->getText(),
134 $this->feedItemDesc( $result ),
135 wfFullUrl( $title->getUrl() ) );
136 } else {
137 return NULL;
138 }
139 }
140
141 function feedItemDesc( $row ) {
142 if( isset( $row->cur_comment ) ) {
143 return $row->cur_comment;
144 } elseif( isset( $row->old_comment ) ) {
145 return $row->old_comment;
146 } elseif( isset( $row->rc_comment ) ) {
147 return $row->rc_comment;
148 }
149 return "";
150 }
151
152 function feedTitle() {
153 global $wgLanguageCode, $wgSitename, $wgLang;
154 $pages = $wgLang->getValidSpecialPages();
155 $title = $pages[$this->getName()];
156 return "$title - $wgSitename [$wgLanguageCode]";
157 }
158
159 function feedDesc() {
160 return wfMsg( "fromwikipedia" );
161 }
162
163 function feedUrl() {
164 global $wgLang;
165 return wfFullUrl( $wgLang->SpecialPage( $this->getName() ) );
166 }
167 }
168
169 # This is a subclass for very simple queries that are just looking for page
170 # titles that match some criteria. It formats each result item as a link to
171 # that page.
172
173 class PageQueryPage extends QueryPage {
174
175 function formatResult( $skin, $result ) {
176 return $skin->makeKnownLink( $result->cur_title, "" );
177 }
178 }
179
180 ?>