X-Git-Url: http://git.cyclocoop.org/%22%20.%20generer_url_ecrire%28%22articles_versions%22%2C%22id_article=%24id_article%22%29%20.%20%22?a=blobdiff_plain;f=includes%2FEditPage.php;h=f3c0237f76ab2053e57b44a78ac9a738aaba2be1;hb=f4c25df570f30c2d48790140726cdf658ea3c6f3;hp=cf2b87875f9de22d1df609dcdd629e676ef1591e;hpb=2902c6cbf3aec1d6f36f1b73e9cbca5999807fc0;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/EditPage.php b/includes/EditPage.php index cf2b87875f..f3c0237f76 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -1218,6 +1218,54 @@ class EditPage { } } + /** + * Run hooks that can filter edits just before they get saved. + * + * @param Content $content the Content to filter. + * @param Status $status for reporting the outcome to the caller + * @param User $user the user performing the edit + * + * @return bool + */ + protected function runPostMergeFilters( Content $content, Status $status, User $user ) { + // Run old style post-section-merge edit filter + if ( !ContentHandler::runLegacyHooks( 'EditFilterMerged', + array( $this, $content, &$this->hookError, $this->summary ) ) ) { + + # Error messages etc. could be handled within the hook... + $status->fatal( 'hookaborted' ); + $status->value = self::AS_HOOK_ERROR; + return false; + } elseif ( $this->hookError != '' ) { + # ...or the hook could be expecting us to produce an error + $status->fatal( 'hookaborted' ); + $status->value = self::AS_HOOK_ERROR_EXPECTED; + return false; + } + + // Run new style post-section-merge edit filter + if ( !wfRunHooks( 'EditFilterMergedContent', + array( $this->mArticle->getContext(), $content, $status, $this->summary, + $user, $this->minoredit ) ) ) { + + # Error messages etc. could be handled within the hook... + // XXX: $status->value may already be something informative... + $this->hookError = $status->getWikiText(); + $status->fatal( 'hookaborted' ); + $status->value = self::AS_HOOK_ERROR; + return false; + } elseif ( !$status->isOK() ) { + # ...or the hook could be expecting us to produce an error + // FIXME this sucks, we should just use the Status object throughout + $this->hookError = $status->getWikiText(); + $status->fatal( 'hookaborted' ); + $status->value = self::AS_HOOK_ERROR_EXPECTED; + return false; + } + + return true; + } + /** * Attempt submission (no UI) * @@ -1235,7 +1283,7 @@ class EditPage { $status = Status::newGood(); - wfProfileIn( __METHOD__ ); + wfProfileIn( __METHOD__ ); wfProfileIn( __METHOD__ . '-checks' ); if ( !wfRunHooks( 'EditPage::attemptSave', array( $this ) ) ) { @@ -1243,7 +1291,7 @@ class EditPage { $status->fatal( 'hookaborted' ); $status->value = self::AS_HOOK_ERROR; wfProfileOut( __METHOD__ . '-checks' ); - wfProfileOut( __METHOD__ ); + wfProfileOut( __METHOD__ ); return $status; } @@ -1253,6 +1301,7 @@ class EditPage { } catch ( MWContentSerializationException $ex ) { $status->fatal( 'content-failed-to-parse', $this->contentModel, $this->contentFormat, $ex->getMessage() ); $status->value = self::AS_PARSE_ERROR; + wfProfileOut( __METHOD__ . '-checks' ); wfProfileOut( __METHOD__ ); return $status; } @@ -1265,7 +1314,7 @@ class EditPage { $status->setResult( false, $code ); wfProfileOut( __METHOD__ . '-checks' ); - wfProfileOut( __METHOD__ ); + wfProfileOut( __METHOD__ ); return $status; } @@ -1386,17 +1435,7 @@ class EditPage { return $status; } - // Run post-section-merge edit filter - if ( !wfRunHooks( 'EditFilterMerged', array( $this, $this->textbox1, &$this->hookError, $this->summary ) ) ) { - # Error messages etc. could be handled within the hook... - $status->fatal( 'hookaborted' ); - $status->value = self::AS_HOOK_ERROR; - wfProfileOut( __METHOD__ ); - return $status; - } elseif ( $this->hookError != '' ) { - # ...or the hook could be expecting us to produce an error - $status->fatal( 'hookaborted' ); - $status->value = self::AS_HOOK_ERROR_EXPECTED; + if ( !$this->runPostMergeFilters( $textbox_content, $status, $wgUser ) ) { wfProfileOut( __METHOD__ ); return $status; } @@ -1510,20 +1549,7 @@ class EditPage { return $status; } - // Run post-section-merge edit filter - $hook_args = array( $this, $content, &$this->hookError, $this->summary ); - - if ( !ContentHandler::runLegacyHooks( 'EditFilterMerged', $hook_args ) - || !wfRunHooks( 'EditFilterMergedContent', $hook_args ) ) { - # Error messages etc. could be handled within the hook... - $status->fatal( 'hookaborted' ); - $status->value = self::AS_HOOK_ERROR; - wfProfileOut( __METHOD__ ); - return $status; - } elseif ( $this->hookError != '' ) { - # ...or the hook could be expecting us to produce an error - $status->fatal( 'hookaborted' ); - $status->value = self::AS_HOOK_ERROR_EXPECTED; + if ( !$this->runPostMergeFilters( $content, $status, $wgUser ) ) { wfProfileOut( __METHOD__ ); return $status; } @@ -1624,12 +1650,7 @@ class EditPage { $doEditStatus = $this->mArticle->doEditContent( $content, $this->summary, $flags, false, null, $this->contentFormat ); - if ( $doEditStatus->isOK() ) { - $result['redirect'] = $content->isRedirect(); - $this->updateWatchlist(); - wfProfileOut( __METHOD__ ); - return $status; - } else { + if ( !$doEditStatus->isOK() ) { // Failure from doEdit() // Show the edit conflict page for certain recognized errors from doEdit(), // but don't show it for errors from extension hooks @@ -1644,6 +1665,11 @@ class EditPage { wfProfileOut( __METHOD__ ); return $doEditStatus; } + + $result['redirect'] = $content->isRedirect(); + $this->updateWatchlist(); + wfProfileOut( __METHOD__ ); + return $status; } /** @@ -1735,10 +1761,10 @@ class EditPage { $editContent = $result; wfProfileOut( __METHOD__ ); return true; - } else { - wfProfileOut( __METHOD__ ); - return false; } + + wfProfileOut( __METHOD__ ); + return false; } /**