Special page to work with the interwiki table

From Meta, a Wikimedia project coordination wiki
This is an archived version of this page, as edited by Phroziac~metawiki (talk | contribs) at 00:28, 15 January 2006 ("). It may differ significantly from the current version.

This is an extension to add a Special:Interwiki page to MediaWiki, to view and manipulate the interwiki table, and a log of any actions made with it. It was made by Phroziac, because she was annoyed at forgetting the interwiki prefixes. It's made for MediaWiki 1.6, and has been reported to also work on 1.5. You can see a working copy of it on PhroziacWiki, at http://www2.sosdg.org/~phroziac/i.php/Special:Interwiki .

If you would rather download this script instead of copying and pasting it, get it from http://tools.wikimedia.de/~phroziac/downloads/SpecialInterwiki.gz

SpecialInterwiki.php

<?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.
 *
 * @author Stephanie Amanda Stevens <phroziac@gmail.com>
 * @copyright Copyright (C) 2005 Stephanie Amanda Stevens
 * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
 */

if (!defined('MEDIAWIKI')) die();
$wgExtensionFunctions[] = "Interwiki";

$wgExtensionCredits['other'][] = array(
        'name' => 'Special:Interwiki',
        'description' => 'adds a special page to view and manipulate the interwiki table.',
        'author' => 'Stephanie Amanda Stevens'
);

$tablename = $wgDBprefix;
$tablename .= "interwiki";

function Interwiki() {
        global $IP, $wgMessageCache, $wgHooks;
        require_once( "$IP/includes/SpecialPage.php" );

	$wgMessageCache->addMessage('interwiki', 'View and manipulate interwiki data');
	$wgMessageCache->addMessage('interwiki_delquestion', 'Deleting "$1"');
	$wgMessageCache->addMessage('interwiki_deleted', '$1 was successfully removed from the interwiki table.');
	$wgMessageCache->addMessage('interwiki_prefix', 'Prefix');
	$wgMessageCache->addMessage('interwiki_prefix2', 'Prefix:');
	$wgMessageCache->addMessage('interwiki_url', 'URL');
	$wgMessageCache->addMessage('interwiki_local', 'Local');
	$wgMessageCache->addMessage('interwiki_trans', 'Trans');
	$wgMessageCache->addMessage('interwiki_delete', 'Delete');
	$wgMessageCache->addMessage('interwiki_yes', 'Yes');
	$wgMessageCache->addMessage('interwiki_delfailed', '$1 could not be removed from the interwiki table.');
	$wgMessageCache->addMessage('interwiki_added', '$1 was successfully added to the interwiki table.');
	$wgMessageCache->addMessage('interwiki_addfailed', '$1 could not be added to the interwiki table.');
	$wgMessageCache->addMessage('interwiki_log_added', 'Added "$1" ($2) (local: $3) (trans: $4) to the interwiki table: $5');
	$wgMessageCache->addMessage('interwiki_alreadyexists', '$1 already exists in the interwiki table!');
	$wgMessageCache->addMessage('interwiki_log_deleted', 'Removed prefix "$1" from the interwiki table: $2');
	$wgMessageCache->addMessage('interwiki_add', '*Add an interwiki prefix');
	$wgMessageCache->addMessage('interwiki_show', '*View all interwiki prefixes');
	$wgMessageCache->addMessage('interwiki_logpagename', 'Interwiki table log');
	$wgMessageCache->addMessage('interwiki_logpagetext', 'This is a log of changes to the interwiki table.');
	$wgMessageCache->addMessage('interwiki_logentry', '');
	$wgMessageCache->addMessage('interwiki_reasonfield', 'Reason');
	$wgMessageCache->addMessage('interwiki_addtext', 'Add an interwiki prefix');
	$wgMessageCache->addMessage('interwiki_delbutton', 'Delete');
	$wgMessageCache->addMessage('interwiki_addbutton', 'Add');

	# Add a new log type
        $wgHooks['LogPageValidTypes'][] = 'wfInterwikiAddLogType';
        $wgHooks['LogPageLogName'][] = 'wfInterwikiAddLogName';
        $wgHooks['LogPageLogHeader'][] = 'wfInterwikiAddLogHeader';
        $wgHooks['LogPageActionText'][] = 'wfInterwikiAddActionText';


        class Interwiki extends SpecialPage {
                                function Interwiki() {
                                                        SpecialPage::SpecialPage( 'Interwiki' );
                                                        $this->includable( true );
							
                                }

                                function execute( $par = null ) {
                                                        global $wgOut, $wgRequest, $wgUser;

							$wgOut->setPagetitle( wfMsg( 'interwiki' ) );
					                $do = $wgRequest->getText( 'do'  );
							
							if ($do == "delete") {
								if (!$wgUser->isAllowed('interwiki')) { $wgOut->permissionRequired('interwiki'); return; }


								$titleObj = Title::makeTitle( NS_SPECIAL, "Interwiki" );
								$action = $titleObj->escapeLocalURL( "do=delete2" );
								$button = wfMsg("interwiki_delbutton");
								$prefix = $wgRequest->getText( 'prefix'  );
								$question = wfMsg(interwiki_delquestion, $prefix);
								$reasonmessage = wfMsg('interwiki_reasonfield');
								
								$out = $question;
								$out .= "<form id=\"delete\" method=\"post\" action=\"{$action}\">
                   					                 <input type=\"hidden\" name=\"prefix\" value=\"{$prefix}\" />
									 $reasonmessage <input tabindex='1' type='text' name=\"reason\" maxlength='200' size='60' />
                               						 <input type=\"submit\" name=\"delete\" value=\"{$button}\" />\n";
							} elseif ($do == "delete2") {
								if (!$wgUser->isAllowed('interwiki')) { $wgOut->permissionRequired('interwiki'); return; }
								global $wgTitle, $wgContLang, $tablename;
								$prefix = $wgRequest->getText('prefix');
								$reason = $wgRequest->getText('reason');
								$deletedmessage = wfMsg('interwiki_deleted', $prefix);
								$delfailedmessage = wfMsg('interwiki_delfailed', $prefix);


						                $sql = "DELETE FROM $tablename WHERE iw_prefix = '$prefix' LIMIT 1";
						                $dbw =& wfGetDB( DB_MASTER );


						                $res = $dbw->query( $sql, $fname );
						                $s = $dbw->fetchObject($res);
								if ($dbw->affectedRows() == 0) {
									$out = "$delfailedmessage";
								} else {
									$out = "$deletedmessage";
									$log = new LogPage( 'interwiki' );
									$log->addEntry( 'interwiki', $wgTitle, wfMsgForContent( 'interwiki_log_deleted', $prefix, $reason ) );
								};
							} elseif ($do == "add") {
								global $wgUser;
								if (!$wgUser->isAllowed('interwiki')) { $wgOut->permissionRequired('interwiki'); return; };
								$titleObj = Title::makeTitle( NS_SPECIAL, "Interwiki" );
								$prefixmessage = wfMsg('interwiki_prefix');
								$transmessage = wfMsg('interwiki_trans');
								$localmessage = wfMsg('interwiki_local');
								$action = $titleObj->escapeLocalURL( "do=add2");
								$reasonmessage = wfMsg('interwiki_reasonfield');
								$urlmessage = wfMsg('interwiki_url');
								$button = wfMsg('interwiki_addbutton');



								$out = "<form id=\"add\" method=\"post\" action=\"{$action}\">
                   					                 $prefixmessage <input tabindex='1' type='text' name=\"prefix\" maxlength='20' size='20' /><br>
									 $localmessage <input type=\"checkbox\" id=\"local\" name=\"local\" /><br>
									 $transmessage <input type=\"checkbox\" id=\"trans\" name=\"trans\" /><br>

									 $urlmessage <input tabindex='1' type='text' name=\"theurl\" maxlength='200' size='60' /><br>

									 $reasonmessage <input tabindex='1' type='text' name=\"reason\" maxlength='200' size='60' /><br>


                               						 <input type=\"submit\" name=\"add\" value=\"{$button}\" />\n";



							} elseif ($do == "add2") {
								if (!$wgUser->isAllowed('interwiki')) { $wgOut->permissionRequired('interwiki'); return; }
								global $wgTitle, $wgContLang, $tablename;
								$prefix = $wgRequest->getText('prefix');
								$reason = $wgRequest->getText('reason');
								$theurl = $wgRequest->getText('theurl');
								$local = $wgRequest->getText('local');
								$trans = $wgRequest->getText('trans');

								$addedmessage = wfMsg('interwiki_added', $prefix);
								$addfailedmessage = wfMsg('interwiki_addfailed', $prefix);
								$alreadyexists = wfMsg('interwiki_alreadyexists', $prefix);
								if ($local == "on") { $local = "1"; } else { $local = "0"; }

								if ($trans == "on") { $trans = "1"; } else { $trans = "0"; }

								$sqlCheck = "SELECT * FROM `$tablename` WHERE `iw_prefix` = '$prefix'";
						                $dbr =& wfGetDB( DB_MASTER );


						                $res = $dbr->query( $sqlCheck, $fname );
						                $s = $dbr->fetchObject($res);
								if ($dbr->numRows($res) != 0) {
									$out = $alreadyexists;
								} else {

							                $sql = "INSERT INTO `$tablename` (`iw_prefix` , `iw_url` , `iw_local` , `iw_trans` )  VALUES ('$prefix', '$theurl', '$local', '$trans');";


							                $dbw =& wfGetDB( DB_MASTER );


							                $res = $dbw->query( $sql, $fname );
							                $s = $dbw->fetchObject($res);
									
									$out = "$addedmessage";
									$log = new LogPage( 'interwiki' );
									$log->addEntry( 'interwiki', $wgTitle, wfMsgForContent( 'interwiki_log_added', $prefix, $theurl, $trans, $local, $reason ) );
								};
							} else {
								global $tablename;
						                $sql = "SELECT * FROM $tablename";
						                $dbr =& wfGetDB( DB_SLAVE );
	
						                $res = $dbr->query( $sql, $fname );
						                $s = $dbr->fetchObject($res);
								$numrows = mysql_numrows($res);

								$prefixmessage = wfMsg('interwiki_prefix');
								$urlmessage = wfMsg('interwiki_url');
								$localmessage = wfMsg('interwiki_local');
								$transmessage = wfMsg('interwiki_trans');
								$deletemessage = wfMsg('interwiki_delete');
								$addtext = wfMsg('interwiki_addtext');

								if ($wgUser->isAllowed('interwiki')) {
									$skin = $wgUser->getSkin();
									$title = Title::makeTitle( NS_SPECIAL, 'Interwiki' );
									$out .= $skin->makeLinkObj( $title, $addtext, 'do=add' );
								}								
								$out .= "
									<br>
									<table width=100%;  border=\"2\";>
									<tr><td>$prefixmessage</td> <td>$urlmessage</td> <td>$localmessage</td> <td>$transmessage</td>";
									if( $wgUser->isAllowed('interwiki') ) {
										$out .= "<td>$deletemessage</td>";
									}
	
								$out .= "</tr>\n";

								$i = "0";
								if ($numrows == 0) {
									$out .= "<tr><td>'''ERROR''': The interwiki table is empty, or something else went wrong.</td></tr>";
								};
								while ($i < $numrows) {
									$prefix = mysql_result($res,$i,"iw_prefix");
									$url = mysql_result($res,$i,"iw_url");
									$trans = mysql_result($res,$i,"iw_trans");
									$local = mysql_result($res,$i,"iw_local");
									$out .= "<tr><td>$prefix</td> <td>$url</td> <td>$local</td> <td>$trans</td>";
									if( $wgUser->isAllowed('interwiki') ) {
										$skin = $wgUser->getSkin();
										$title = Title::makeTitle( NS_SPECIAL, 'Interwiki' );
										$out .= '<td>';
										$out .= $skin->makeLinkObj( $title, $deletemessage, 'do=delete&prefix=' . urlencode( $prefix ) );
										$out .= '</td>';
									}

									$out .= "</tr>\n";
									$i++;
						
									
								};
								$out .= "</table><br>";
							}
							$wgOut->addHTML($out);
                                }
        }
        
SpecialPage::addPage( new Interwiki );
}


function wfInterwikiAddLogType( &$types ) {
        if ( !in_array( 'interwiki', $types ) )
                $types[] = 'interwiki';
        return true;
}


function wfInterwikiAddLogName( &$names ) {
        $names['interwiki'] = 'interwiki_logpagename';
        return true;
}

function wfInterwikiAddLogHeader( &$headers ) {
        $headers['interwiki'] = 'interwiki_logpagetext';
        return true;
}

function wfInterwikiAddActionText( &$actions ) {
        $actions['interwiki/interwiki'] = 'interwiki_logentry';
        return true;
}


?>

LocalSettings.php

You'll need something similar to this in your LocalSettings.php.

require_once('extensions/SpecialInterwiki.php');

$wgGroupPermissions['*']['interwiki'] = false;
$wgGroupPermissions['interwiki']['interwiki'] = true;

With this configuration, the "interwiki" flag is required to modify the interwiki table, this flag can be set in Special:Userrights by a bureaucrat.