3470bbb9f92c2f1b24cc0dbc6ca87ec0d794b8d2
4 * implements Special:Interwiki
7 class SpecialInterwiki
extends SpecialPage
{
9 function __construct() {
10 parent
::__construct( 'Interwiki' );
13 function execute( $par ) {
14 global $wgRequest, $wgOut, $wgUser, $wgEnableSpecialInterwiki;
17 $this->outputHeader();
19 $admin = $wgUser->isAllowed( 'interwiki' );
21 $wgOut->setPagetitle( wfMsg( 'interwiki' ) );
23 $wgOut->setPagetitle( wfMsg( 'interwiki-title-norights' ) );
25 $action = $wgRequest->getVal( 'action', $par );
31 if( !$wgEnableSpecialInterwiki ) {
32 $wgOut->addWikiMsg( 'interwiki-not-enabled' );
36 $wgOut->permissionRequired( 'interwiki' );
39 $this->showForm( $action );
42 if( !$wgEnableSpecialInterwiki ) {
43 $wgOut->addWikiMsg( 'interwiki-not-enabled' );
47 $wgOut->permissionRequired( 'interwiki' );
50 if( !$wgRequest->wasPosted() ||
!$wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ) ) {
51 $wgOut->addWikiMsg( 'sessionfailure' );
57 $this->showList( $admin );
62 function showForm( $action ) {
63 global $wgRequest, $wgUser, $wgOut;
65 $actionUrl = $this->getTitle()->getLocalURL( 'action=submit' );
66 $token = $wgUser->editToken();
67 $defaultreason = $wgRequest->getVal( 'wpInterwikiReason' ) ?
$wgRequest->getVal( 'wpInterwikiReason' ) : wfMsgForContent( 'interwiki_defaultreason' );
72 $prefix = $wgRequest->getVal( 'prefix' );
73 $button = wfMsg( 'delete' );
74 $topmessage = wfMsg( 'interwiki_delquestion', $prefix );
75 $deletingmessage = wfMsgExt( 'interwiki_deleting', array( 'parseinline' ), $prefix );
76 $reasonmessage = wfMsg( 'deletecomment' );
79 Xml
::openElement( 'fieldset' ) .
80 Xml
::element( 'legend', null, $topmessage ) .
81 Xml
::openElement( 'form', array('id'=> 'mw-interwiki-deleteform', 'method'=> 'post', 'action' => $actionUrl ) ) .
82 Xml
::openElement( 'table' ) .
83 "<tr><td>$deletingmessage</td></tr>".
84 '<tr><td class="mw-label">' . Xml
::label( $reasonmessage, 'mw-interwiki-deletereason') . '</td>' .
85 '<td class="mw-input">' .
86 Xml
::input( 'wpInterwikiReason', 60, $defaultreason, array( 'tabindex' => '1', 'id' => 'mw-interwiki-deletereason', 'maxlength' => '200' ) ) .
88 '<tr><td class="mw-submit">' . Xml
::submitButton( $button, array( 'id' => 'mw-interwiki-submit' ) ) .
89 Xml
::hidden( 'wpInterwikiPrefix', $prefix ) .
90 Xml
::hidden( 'wpInterwikiAction', $action ) .
91 Xml
::hidden( 'wpEditToken', $token ) .
93 Xml
::closeElement( 'table' ) .
94 Xml
::closeElement( 'form' ) .
95 Xml
::closeElement( 'fieldset' )
100 if( $action == "edit" ){
101 $prefix = $wgRequest->getVal( 'prefix' );
102 $dbr = wfGetDB( DB_SLAVE
);
103 $row = $dbr->selectRow( 'interwiki', '*', array( 'iw_prefix' => $prefix ) );
105 $this->error( wfMsg( 'interwiki_editerror', $prefix ) );
108 $prefix = '<tt>' . htmlspecialchars( $row->iw_prefix
) . '</tt>';
109 $defaulturl = $row->iw_url
;
110 $trans = $row->iw_trans
;
111 $local = $row->iw_local
;
112 $old = Xml
::hidden( 'wpInterwikiPrefix', $row->iw_prefix
);
113 $topmessage = wfMsgExt( 'interwiki_edittext', array( 'parseinline' ) );
114 $intromessage = wfMsgExt( 'interwiki_editintro', array( 'parseinline' ) );
115 $button = wfMsg( 'edit' );
117 $prefix = $wgRequest->getVal( 'wpInterwikiPrefix' ) ?
$wgRequest->getVal( 'wpInterwikiPrefix' ) : $wgRequest->getVal( 'prefix' );
118 $prefix = Xml
::input( 'wpInterwikiPrefix', 20, $prefix, array( 'tabindex'=>'1', 'id'=>'mw-interwiki-prefix', 'maxlength'=>'20' ) );
119 $local = $wgRequest->getCheck( 'wpInterwikiLocal' );
120 $trans = $wgRequest->getCheck( 'wpInterwikiTrans' );
122 $defaulturl = $wgRequest->getVal( 'wpInterwikiURL' ) ?
$wgRequest->getVal( 'wpInterwikiURL' ) : wfMsg( 'interwiki_defaulturl' );
123 $topmessage = wfMsgExt( 'interwiki_addtext', array( 'parseinline' ) );
124 $intromessage = wfMsgExt( 'interwiki_addintro', array( 'parseinline' ) );
125 $button = wfMsg( 'interwiki_addbutton' );
128 $prefixmessage = wfMsgHtml( 'interwiki_prefix' );
129 $localmessage = wfMsg( 'interwiki_local' );
130 $transmessage = wfMsg( 'interwiki_trans' );
131 $reasonmessage = wfMsg( 'interwiki_reasonfield' );
132 $urlmessage = wfMsg( 'interwiki_url' );
135 Xml
::openElement( 'fieldset' ) .
136 Xml
::element( 'legend', null, $topmessage ) .
138 Xml
::openElement( 'form', array('id'=> 'mw-interwiki-editform', 'method'=> 'post', 'action'=>$actionUrl) ) .
139 Xml
::openElement( 'table', array('id'=>"mw-interwiki-$action") ) .
140 "<tr><td class='mw-label'>$prefixmessage</td><td><tt>$prefix</tt></td></tr>" .
141 "<tr><td class='mw-label'>" . Xml
::label( $localmessage, 'mw-interwiki-local' ) . '</td>' .
142 "<td class='mw-input'>" . Xml
::check( 'wpInterwikiLocal', $local, array('id'=>'mw-interwiki-local') ) . '</td></tr>' .
143 '<tr><td class="mw-label">' . Xml
::label( $transmessage, 'mw-interwiki-trans' ) . '</td>' .
144 '<td class="mw-input">' . Xml
::check( 'wpInterwikiTrans', $trans, array('id'=>'mw-interwiki-trans') ) . '</td></tr>' .
145 '<tr><td class="mw-label">' . Xml
::label( $urlmessage, 'mw-interwiki-url' ) . '</td>' .
146 '<td class="mw-input">' . Xml
::input( 'wpInterwikiURL', 60, $defaulturl, array('tabindex'=>'1', 'maxlength'=>'200', 'id'=>'mw-interwiki-url') ) . '</td></tr>' .
147 '<tr><td class="mw-label">' . Xml
::label( $reasonmessage, 'mw-interwiki-editreason' ) . '</td>' .
148 '<td class="mw-input">' . Xml
::input( 'wpInterwikiReason', 60, $defaultreason, array( 'tabindex'=>'1', 'id'=>'mw-interwiki-editreason', 'maxlength'=>'200') ) .
149 Xml
::hidden( 'wpInterwikiAction', $action ) .
151 Xml
::hidden( 'wpEditToken', $token ) .
153 '<tr><td class="mw-submit">' . Xml
::submitButton( $button, array( 'id'=>'mw-interwiki-submit' ) ) . '</td></tr>' .
154 Xml
::closeElement( 'table' ) .
155 Xml
::closeElement( 'form' ) .
156 Xml
::closeElement( 'fieldset' )
162 function doSubmit() {
163 global $wgRequest, $wgOut;
164 $prefix = $wgRequest->getVal( 'wpInterwikiPrefix' );
165 $do = $wgRequest->getVal( 'wpInterwikiAction' );
166 if( preg_match( '/[\s:&=]/', $prefix ) ) {
167 $this->error( wfMsg( 'interwiki-badprefix', $prefix ) );
168 $this->showForm( $do );
171 $reason = $wgRequest->getText( 'wpInterwikiReason' );
172 $selfTitle = $this->getTitle();
173 $dbw = wfGetDB( DB_MASTER
);
176 $dbw->delete( 'interwiki', array( 'iw_prefix' => $prefix ), __METHOD__
);
178 if ( $dbw->affectedRows() == 0 ) {
179 $this->error( wfMsg( 'interwiki_delfailed', $prefix ) );
180 $this->showForm( $do );
182 $wgOut->addWikiText( wfMsg( 'interwiki_deleted', $prefix ));
183 $wgOut->returnToMain( false, $selfTitle );
184 $log = new LogPage( 'interwiki' );
185 $log->addEntry( 'iw_delete', $selfTitle, $reason, array( $prefix ) );
190 $theurl = $wgRequest->getVal( 'wpInterwikiURL' );
191 $local = $wgRequest->getCheck( 'wpInterwikiLocal' ) ?
1 : 0;
192 $trans = $wgRequest->getCheck( 'wpInterwikiTrans' ) ?
1 : 0;
193 $data = array( 'iw_prefix' => $prefix, 'iw_url' => $theurl,
194 'iw_local' => $local, 'iw_trans' => $trans );
197 $dbw->insert( 'interwiki', $data, __METHOD__
, 'IGNORE' );
199 $dbw->update( 'interwiki', $data, array( 'iw_prefix' => $prefix ), __METHOD__
, 'IGNORE' );
202 if( $dbw->affectedRows() == 0 ) {
203 $this->error( wfMsg( "interwiki_{$do}failed", $prefix ) );
204 $this->showForm( $do );
206 $wgOut->addWikiMsg( "interwiki_{$do}ed", $prefix );
207 $wgOut->returnToMain( false, $selfTitle );
208 $log = new LogPage( 'interwiki' );
209 $log->addEntry( 'iw_'.$do, $selfTitle, $reason, array( $prefix, $theurl, $trans, $local ) );
215 function showList( $admin ) {
216 global $wgUser, $wgOut, $wgEnableSpecialInterwiki;
217 $prefixmessage = wfMsgHtml( 'interwiki_prefix' );
218 $urlmessage = wfMsgHtml( 'interwiki_url' );
219 $localmessage = wfMsgHtml( 'interwiki_local' );
220 $transmessage = wfMsgHtml( 'interwiki_trans' );
222 $wgOut->addWikiMsg( 'interwiki_intro' );
223 $selfTitle = $this->getTitle();
225 if ( $admin && $wgEnableSpecialInterwiki ) {
226 $skin = $wgUser->getSkin();
227 $addtext = wfMsgHtml( 'interwiki_addtext' );
228 $addlink = $skin->link( $selfTitle, $addtext, array(), array( 'action' => 'add' ) );
229 $wgOut->addHTML( '<ul>' . '<li>' . $addlink . '</li>' . '</ul>' );
232 $dbr = wfGetDB( DB_SLAVE
);
233 $res = $dbr->select( 'interwiki', '*' );
234 $numrows = $res->numRows();
235 if ( $numrows == 0 ) {
236 $this->error( wfMsgWikiHtml( 'interwiki_error' ) );
242 <table width='100%' style='border:1px solid #aaa;' class='wikitable'>
243 <tr id='interwikitable-header'><th>$prefixmessage</th> <th>$urlmessage</th> <th>$localmessage</th> <th>$transmessage</th>";
244 if( $admin && $wgEnableSpecialInterwiki ) {
245 $deletemessage = wfMsgHtml( 'delete' );
246 $editmessage = wfMsgHtml( 'edit' );
247 $out .= "<th>$editmessage</th>";
251 while( $s = $res->fetchObject() ) {
252 $prefix = htmlspecialchars( $s->iw_prefix
);
253 $url = htmlspecialchars( $s->iw_url
);
254 $trans = htmlspecialchars( $s->iw_trans
);
255 $local = htmlspecialchars( $s->iw_local
);
256 $out .= "<tr class='mw-interwikitable-row'>
257 <td class='mw-interwikitable-prefix'>$prefix</td>
258 <td class='mw-interwikitable-url'>$url</td>
259 <td class='mw-interwikitable-local'>$local</td>
260 <td class='mw-interwikitable-trans'>$trans</td>";
261 if( $admin && $wgEnableSpecialInterwiki ) {
262 $out .= '<td class="mw-interwikitable-modify">';
263 $out .= $skin->link( $selfTitle, $editmessage, array(),
264 array( 'action' => 'edit', 'prefix' => $s->iw_prefix
) );
266 $out .= $skin->link( $selfTitle, $deletemessage, array(),
267 array( 'action' => 'delete', 'prefix' => $s->iw_prefix
) );
274 $out .= "</table><br />";
275 $wgOut->addHTML( $out );
278 function error( $msg ) {
280 $wgOut->addHTML( Xml
::tags( 'p', array( 'class' => 'error' ), $msg ) );