* (bug 3487) Fix category edit preview with preview-on-bottom
[lhc/web/wiklou.git] / includes / EditPage.php
index b4bb6fa..002f0ed 100644 (file)
@@ -23,6 +23,7 @@ class EditPage {
        var $formtype;
        var $firsttime;
        var $lastDelete;
+       var $mTokenOk = true;
 
        # Form values
        var $save = false, $preview = false, $diff = false;
@@ -327,19 +328,22 @@ class EditPage {
                                wfDebug( "POST DATA: " . var_export( $_POST, true ) . "\n" );
                                $this->preview  = true;
                        } else {
-                               if( $this->tokenOk( $request ) ) {
-                                       # Some browsers will not report any submit button
-                                       # if the user hits enter in the comment box.
-                                       # The unmarked state will be assumed to be a save,
-                                       # if the form seems otherwise complete.
-                                       wfDebug( "$fname: Passed token check.\n" );
-                                       $this->preview = $request->getCheck( 'wpPreview' );
-                                       $this->diff = $request->getCheck( 'wpDiff' );
-                               } else {
-                                       # Page might be a hack attempt posted from
-                                       # an external site. Preview instead of saving.
-                                       wfDebug( "$fname: Failed token check; forcing preview\n" );
-                                       $this->preview = true;
+                               $this->preview = $request->getCheck( 'wpPreview' );
+                               $this->diff = $request->getCheck( 'wpDiff' );
+                               
+                               if( !$this->preview ) {
+                                       if ( $this->tokenOk( $request ) ) {
+                                               # Some browsers will not report any submit button
+                                               # if the user hits enter in the comment box.
+                                               # The unmarked state will be assumed to be a save,
+                                               # if the form seems otherwise complete.
+                                               wfDebug( "$fname: Passed token check.\n" );
+                                       } else {
+                                               # Page might be a hack attempt posted from
+                                               # an external site. Preview instead of saving.
+                                               wfDebug( "$fname: Failed token check; forcing preview\n" );
+                                               $this->preview = true;
+                                       }
                                }
                        }
                        $this->save    = ! ( $this->preview OR $this->diff );
@@ -395,10 +399,11 @@ class EditPage {
                if( $wgUser->isAnon() ) {
                        # Anonymous users may not have a session
                        # open. Don't tokenize.
-                       return true;
+                       $this->mTokenOk = true;
                } else {
-                       return $wgUser->matchEditToken( $request->getVal( 'wpEditToken' ) );
+                       $this->mTokenOk = $wgUser->matchEditToken( $request->getVal( 'wpEditToken' ) );
                }
+               return $this->mTokenOk;
        }
 
        function showIntro() {
@@ -766,18 +771,9 @@ class EditPage {
 
                $checkboxhtml = $minoredithtml . $watchhtml;
 
-               $wgOut->addHTML( '<div id="wikiPreview">' );
-               if ( 'preview' == $this->formtype) {
-                       $previewOutput = $this->getPreviewText();
-                       if ( $wgUser->getOption('previewontop' ) ) {
-                               $wgOut->addHTML( $previewOutput );
-                               if($this->mTitle->getNamespace() == NS_CATEGORY) {
-                                       $this->mArticle->closeShowCategory();
-                               }
-                               $wgOut->addHTML( "<br style=\"clear:both;\" />\n" );
-                       }
+               if ( 'preview' == $this->formtype && $wgUser->getOption( 'previewontop' ) ) {
+                       $this->showPreview();
                }
-               $wgOut->addHTML( '</div>' );
                if ( 'diff' == $this->formtype ) {
                        if ( $wgUser->getOption('previewontop' ) ) {
                                $wgOut->addHTML( $this->getDiff() );
@@ -907,7 +903,7 @@ END
                }
                $wgOut->addHTML( "</form>\n" );
                if ( $this->formtype == 'preview' && !$wgUser->getOption( 'previewontop' ) ) {
-                       $wgOut->addHTML( '<div id="wikiPreview">' . $previewOutput . '</div>' );
+                       $this->showPreview();
                }
                if ( $this->formtype == 'diff' && !$wgUser->getOption( 'previewontop' ) ) {
                        #$wgOut->addHTML( '<div id="wikiPreview">' . $difftext . '</div>' );
@@ -916,6 +912,26 @@ END
 
                wfProfileOut( $fname );
        }
+       
+       /**
+        * Append preview output to $wgOut.
+        * Includes category rendering if this is a category page.
+        * @access private
+        */
+       function showPreview() {
+               global $wgOut;
+               $wgOut->addHTML( '<div id="wikiPreview">' );
+               if($this->mTitle->getNamespace() == NS_CATEGORY) {
+                       $this->mArticle->openShowCategory();
+               }
+               $previewOutput = $this->getPreviewText();
+               $wgOut->addHTML( $previewOutput );
+               if($this->mTitle->getNamespace() == NS_CATEGORY) {
+                       $this->mArticle->closeShowCategory();
+               }
+               $wgOut->addHTML( "<br style=\"clear:both;\" />\n" );
+               $wgOut->addHTML( '</div>' );
+       }
 
        /**
         * Prepare a list of templates used by this page. Returns HTML.
@@ -1006,8 +1022,13 @@ END
                $fname = 'EditPage::getPreviewText';
                wfProfileIn( $fname );
 
+               if ( $this->mTokenOk ) {
+                       $msg = 'previewnote';
+               } else {
+                       $msg = 'session_fail_preview';
+               }
                $previewhead = '<h2>' . htmlspecialchars( wfMsg( 'preview' ) ) . "</h2>\n" .
-                       "<div class='previewnote'>" . $wgOut->parse( wfMsg( 'previewnote' ) ) . "</div>\n";
+                       "<div class='previewnote'>" . $wgOut->parse( wfMsg( $msg ) ) . "</div>\n";
                if ( $this->isConflict ) {
                        $previewhead.='<h2>' . htmlspecialchars( wfMsg( 'previewconflict' ) ) . "</h2>\n";
                }