MediaWiki
REL1_24
|
00001 <?php 00031 class SpecialPageLanguage extends FormSpecialPage { 00035 private $goToUrl; 00036 00037 public function __construct() { 00038 parent::__construct( 'PageLanguage', 'pagelang' ); 00039 } 00040 00041 protected function preText() { 00042 $this->getOutput()->addModules( 'mediawiki.special.pageLanguage' ); 00043 } 00044 00045 protected function getFormFields() { 00046 // Get default from the subpage of Special page 00047 $defaultName = $this->par; 00048 00049 $page = array(); 00050 $page['pagename'] = array( 00051 'type' => 'text', 00052 'label-message' => 'pagelang-name', 00053 'default' => $defaultName, 00054 ); 00055 00056 // Options for whether to use the default language or select language 00057 $selectoptions = array( 00058 (string)$this->msg( 'pagelang-use-default' )->escaped() => 1, 00059 (string)$this->msg( 'pagelang-select-lang' )->escaped() => 2, 00060 ); 00061 $page['selectoptions'] = array( 00062 'id' => 'mw-pl-options', 00063 'type' => 'radio', 00064 'options' => $selectoptions, 00065 'default' => 1 00066 ); 00067 00068 // Building a language selector 00069 $userLang = $this->getLanguage()->getCode(); 00070 $languages = Language::fetchLanguageNames( $userLang, 'mwfile' ); 00071 ksort( $languages ); 00072 $options = array(); 00073 foreach ( $languages as $code => $name ) { 00074 $options["$code - $name"] = $code; 00075 } 00076 00077 $page['language'] = array( 00078 'id' => 'mw-pl-languageselector', 00079 'cssclass' => 'mw-languageselector', 00080 'type' => 'select', 00081 'options' => $options, 00082 'label-message' => 'pagelang-language', 00083 'default' => $this->getConfig()->get( 'LanguageCode' ), 00084 ); 00085 00086 return $page; 00087 } 00088 00089 protected function postText() { 00090 return $this->showLogFragment( $this->par ); 00091 } 00092 00093 public function alterForm( HTMLForm $form ) { 00094 $form->setDisplayFormat( 'vform' ); 00095 $form->setWrapperLegend( false ); 00096 wfRunHooks( 'LanguageSelector', array( $this->getOutput(), 'mw-languageselector' ) ); 00097 } 00098 00104 public function onSubmit( array $data ) { 00105 $title = Title::newFromText( $data['pagename'] ); 00106 00107 // Check if title is valid 00108 if ( !$title ) { 00109 return false; 00110 } 00111 00112 // Get the default language for the wiki 00113 // Returns the default since the page is not loaded from DB 00114 $defLang = $title->getPageLanguage()->getCode(); 00115 00116 $pageId = $title->getArticleID(); 00117 00118 // Check if article exists 00119 if ( !$pageId ) { 00120 return false; 00121 } 00122 00123 // Load the page language from DB 00124 $dbw = wfGetDB( DB_MASTER ); 00125 $langOld = $dbw->selectField( 00126 'page', 00127 'page_lang', 00128 array( 'page_id' => $pageId ), 00129 __METHOD__ 00130 ); 00131 00132 // Url to redirect to after the operation 00133 $this->goToUrl = $title->getFullURL(); 00134 00135 // Check if user wants to use default language 00136 if ( $data['selectoptions'] == 1 ) { 00137 $langNew = null; 00138 } else { 00139 $langNew = $data['language']; 00140 } 00141 00142 // No change in language 00143 if ( $langNew === $langOld ) { 00144 return false; 00145 } 00146 00147 // Hardcoded [def] if the language is set to null 00148 $logOld = $langOld ? $langOld : $defLang . '[def]'; 00149 $logNew = $langNew ? $langNew : $defLang . '[def]'; 00150 00151 // Writing new page language to database 00152 $dbw = wfGetDB( DB_MASTER ); 00153 $dbw->update( 00154 'page', 00155 array( 'page_lang' => $langNew ), 00156 array( 00157 'page_id' => $pageId, 00158 'page_lang' => $langOld 00159 ), 00160 __METHOD__ 00161 ); 00162 00163 if ( !$dbw->affectedRows() ) { 00164 return false; 00165 } 00166 00167 // Logging change of language 00168 $logParams = array( 00169 '4::oldlanguage' => $logOld, 00170 '5::newlanguage' => $logNew 00171 ); 00172 $entry = new ManualLogEntry( 'pagelang', 'pagelang' ); 00173 $entry->setPerformer( $this->getUser() ); 00174 $entry->setTarget( $title ); 00175 $entry->setParameters( $logParams ); 00176 00177 $logid = $entry->insert(); 00178 $entry->publish( $logid ); 00179 00180 return true; 00181 } 00182 00183 public function onSuccess() { 00184 // Success causes a redirect 00185 $this->getOutput()->redirect( $this->goToUrl ); 00186 } 00187 00188 function showLogFragment( $title ) { 00189 $moveLogPage = new LogPage( 'pagelang' ); 00190 $out1 = Xml::element( 'h2', null, $moveLogPage->getName()->text() ); 00191 $out2 = ''; 00192 LogEventsList::showLogExtract( $out2, 'pagelang', $title ); 00193 return $out1 . $out2; 00194 } 00195 }