remove superfluous require_once('SpecialValidate.php');
[lhc/web/wiklou.git] / includes / SpecialContributions.php
1 <?php
2
3 function wfSpecialContributions( $par = "" )
4 {
5 global $wgUser, $wgOut, $wgLang, $wgRequest;
6 $fname = "wfSpecialContributions";
7 $sysop = $wgUser->isSysop();
8
9 if( $par )
10 $target = $par;
11 else
12 $target = $wgRequest->getVal( 'target' );
13
14 if ( "" == $target ) {
15 $wgOut->errorpage( "notargettitle", "notargettext" );
16 return;
17 }
18
19 # FIXME: Change from numeric offsets to date offsets
20 list( $limit, $offset ) = wfCheckLimits( 50, "" );
21 $offlimit = $limit + $offset;
22 $querylimit = $offlimit + 1;
23 $hideminor = ($wgRequest->getVal( 'hideminor' ) ? 1 : 0);
24 $sk = $wgUser->getSkin();
25 $dbr =& wfGetDB( DB_SLAVE );
26 $userCond = "";
27
28 $nt = Title::newFromURL( $target );
29 if ( !$nt ) {
30 $wgOut->errorpage( "notargettitle", "notargettext" );
31 return;
32 }
33 $nt->setNamespace( Namespace::getUser() );
34
35 $id = User::idFromName( $nt->getText() );
36
37 if ( 0 == $id ) {
38 $ul = $nt->getText();
39 } else {
40 $ul = $sk->makeLinkObj( $nt, htmlspecialchars( $nt->getText() ) );
41 $userCond = "=" . $id;
42 }
43 $talk = $nt->getTalkPage();
44 if( $talk ) {
45 $ul .= " (" . $sk->makeLinkObj( $talk, $wgLang->getNsText(Namespace::getTalk(0)) ) . ")";
46 }
47
48 if ( $target == 'newbies' ) {
49 # View the contributions of all recently created accounts
50 $max = $dbr->selectField( 'user', 'max(user_id)', false, $fname );
51 $userCond = ">" . ($max - $max / 100);
52 $ul = wfMsg ( 'newbies' );
53 $id = 0;
54 }
55
56 $wgOut->setSubtitle( wfMsg( "contribsub", $ul ) );
57
58 if ( $hideminor ) {
59 $cmq = "AND cur_minor_edit=0";
60 $omq = "AND old_minor_edit=0";
61 $mlink = $sk->makeKnownLink( $wgLang->specialPage( "Contributions" ),
62 WfMsg( "show" ), "target=" . htmlspecialchars( $nt->getPrefixedURL() ) .
63 "&offset={$offset}&limit={$limit}&hideminor=0" );
64 } else {
65 $cmq = $omq = "";
66 $mlink = $sk->makeKnownLink( $wgLang->specialPage( "Contributions" ),
67 WfMsg( "hide" ), "target=" . htmlspecialchars( $nt->getPrefixedURL() ) .
68 "&offset={$offset}&limit={$limit}&hideminor=1" );
69 }
70
71 extract( $dbr->tableNames( 'old', 'cur' ) );
72 if ( $userCond == "" ) {
73 $sql = "SELECT cur_namespace,cur_title,cur_timestamp,cur_comment,cur_minor_edit,cur_is_new,cur_user_text FROM $cur " .
74 "WHERE cur_user_text='" . $dbr->strencode( $nt->getText() ) . "' {$cmq} " .
75 "ORDER BY inverse_timestamp LIMIT {$querylimit}";
76 $res1 = $dbr->query( $sql, $fname );
77
78 $sql = "SELECT old_namespace,old_title,old_timestamp,old_comment,old_minor_edit,old_user_text FROM $old " .
79 "WHERE old_user_text='" . $dbr->strencode( $nt->getText() ) . "' {$omq} " .
80 "ORDER BY inverse_timestamp LIMIT {$querylimit}";
81 $res2 = $dbr->query( $sql, $fname );
82 } else {
83 $sql = "SELECT cur_namespace,cur_title,cur_timestamp,cur_comment,cur_minor_edit,cur_is_new,cur_user_text FROM $cur " .
84 "WHERE cur_user {$userCond} {$cmq} ORDER BY inverse_timestamp LIMIT {$querylimit}";
85 $res1 = $dbr->query( $sql, $fname );
86
87 $sql = "SELECT old_namespace,old_title,old_timestamp,old_comment,old_minor_edit,old_user_text FROM $old " .
88 "WHERE old_user {$userCond} {$omq} ORDER BY inverse_timestamp LIMIT {$querylimit}";
89 $res2 = $dbr->query( $sql, $fname );
90 }
91 $nCur = $dbr->numRows( $res1 );
92 $nOld = $dbr->numRows( $res2 );
93
94 $top = wfShowingResults( $offset, $limit );
95 $wgOut->addHTML( "<p>{$top}\n" );
96
97 $sl = wfViewPrevNext( $offset, $limit,
98 $wgLang->specialpage( "Contributions" ),
99 "hideminor={$hideminor}&target=" . wfUrlEncode( $target ),
100 ($nCur + $nOld) <= $offlimit);
101
102 $shm = wfMsg( "showhideminor", $mlink );
103 $wgOut->addHTML( "<br />{$sl} ($shm)</p>\n");
104
105
106 if ( 0 == $nCur && 0 == $nOld ) {
107 $wgOut->addHTML( "\n<p>" . wfMsg( "nocontribs" ) . "</p>\n" );
108 return;
109 }
110 if ( 0 != $nCur ) { $obj1 = $dbr->fetchObject( $res1 ); }
111 if ( 0 != $nOld ) { $obj2 = $dbr->fetchObject( $res2 ); }
112
113 $wgOut->addHTML( "<ul>\n" );
114 for( $n = 0; $n < $offlimit; $n++ ) {
115 if ( 0 == $nCur && 0 == $nOld ) { break; }
116
117 if ( ( 0 == $nOld ) ||
118 ( ( 0 != $nCur ) &&
119 ( $obj1->cur_timestamp >= $obj2->old_timestamp ) ) ) {
120 $ns = $obj1->cur_namespace;
121 $t = $obj1->cur_title;
122 $ts = $obj1->cur_timestamp;
123 $comment =$obj1->cur_comment;
124 $me = $obj1->cur_minor_edit;
125 $isnew = $obj1->cur_is_new;
126 $usertext = $obj1->cur_user_text;
127
128 $obj1 = $dbr->fetchObject( $res1 );
129 $topmark = true;
130 --$nCur;
131 } else {
132 $ns = $obj2->old_namespace;
133 $t = $obj2->old_title;
134 $ts = $obj2->old_timestamp;
135 $comment =$obj2->old_comment;
136 $me = $obj2->old_minor_edit;
137 $usertext = $obj2->old_user_text;
138
139 $obj2 = $dbr->fetchObject( $res2 );
140 $topmark = false;
141 $isnew = false;
142 --$nOld;
143 }
144 if( $n >= $offset )
145 ucListEdit( $sk, $ns, $t, $ts, $topmark, $comment, ( $me > 0), $isnew, $usertext );
146 }
147 $wgOut->addHTML( "</ul>\n" );
148
149 # Validations
150 global $wgUseValidation;
151 if( $wgUseValidation ) {
152 require_once( 'SpecialValidate.php' );
153 $val = new Validation ;
154 $val = $val->countUserValidations ( $id ) ;
155 $wgOut->addHTML( wfMsg ( 'val_user_validations', $val ) );
156 }
157 }
158
159
160 /*
161
162 Generates each row in the contributions list.
163
164 Contributions which are marked "top" are currently on top of the history.
165 For these contributions, a [rollback] link is shown for users with sysop
166 privileges. The rollback link restores the most recent version that was not
167 written by the target user.
168
169 If the contributions page is called with the parameter &bot=1, all rollback
170 links also get that parameter. It causes the edit itself and the rollback
171 to be marked as "bot" edits. Bot edits are hidden by default from recent
172 changes, so this allows sysops to combat a busy vandal without bothering
173 other users.
174
175 TODO: This would probably look a lot nicer in a table.
176
177 */
178 function ucListEdit( $sk, $ns, $t, $ts, $topmark, $comment, $isminor, $isnew, $target )
179 {
180 global $wgLang, $wgOut, $wgUser, $wgRequest;
181 $page = Title::makeName( $ns, $t );
182 $link = $sk->makeKnownLink( $page, "" );
183 $topmarktext="";
184 if($topmark) {
185 if(!$isnew) {
186 $topmarktext .= $sk->makeKnownLink( $page, wfMsg("uctop"), "diff=0" );
187 } else {
188 $topmarktext .= wfMsg("newarticle");
189 }
190 $sysop = $wgUser->isSysop();
191 if($sysop ) {
192 $extraRollback = $wgRequest->getBool( "bot" ) ? '&bot=1' : '';
193 # $target = $wgRequest->getText( 'target' );
194 $topmarktext .= " [". $sk->makeKnownLink( $page,
195 wfMsg( "rollbacklink" ),
196 "action=rollback&from=" . urlencode( $target ) . $extraRollback ) ."]";
197 }
198
199 }
200 $histlink="(".$sk->makeKnownLink($page,wfMsg("hist"),"action=history").")";
201
202 if($comment) {
203
204 $comment="<em>(". $sk->formatComment($comment, Title::newFromText($t) ) .")</em> ";
205
206 }
207 $d = $wgLang->timeanddate( $ts, true );
208
209 if ($isminor) {
210 $mflag = '<span class="minor">'.wfMsg( "minoreditletter" ).'</span> ';
211 } else {
212 $mflag = "";
213 }
214
215 $wgOut->addHTML( "<li>{$d} {$histlink} {$mflag} {$link} {$comment}{$topmarktext}</li>\n" );
216 }
217
218 function ucCountLink( $lim, $d )
219 {
220 global $wgUser, $wgLang, $wgRequest;
221
222 $target = $wgRequest->getText( 'target' );
223 $sk = $wgUser->getSkin();
224 $s = $sk->makeKnownLink( $wgLang->specialPage( "Contributions" ),
225 "{$lim}", "target={$target}&days={$d}&limit={$lim}" );
226 return $s;
227 }
228
229 function ucDaysLink( $lim, $d )
230 {
231 global $wgUser, $wgLang, $wgRequest;
232
233 $target = $wgRequest->getText( 'target' );
234 $sk = $wgUser->getSkin();
235 $s = $sk->makeKnownLink( $wgLang->specialPage( "Contributions" ),
236 "{$d}", "target={$target}&days={$d}&limit={$lim}" );
237 return $s;
238 }
239 ?>