MediaWiki  REL1_24
SpecialPageLanguage.php
Go to the documentation of this file.
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 }