Merge "Replace Pakaran with Punjabi"
[lhc/web/wiklou.git] / includes / api / ApiEditPage.php
index 3d0b425..bd61895 100644 (file)
@@ -159,12 +159,17 @@ class ApiEditPage extends ApiBase {
                                        $this->dieUsage( "Sections are not supported for this content model: $modelName.", 'sectionsnotsupported' );
                                }
 
-                               // Process the content for section edits
-                               $section = intval( $params['section'] );
-                               $content = $content->getSection( $section );
+                               if ( $params['section'] == 'new' ) {
+                                       // DWIM if they're trying to prepend/append to a new section.
+                                       $content = null;
+                               } else {
+                                       // Process the content for section edits
+                                       $section = intval( $params['section'] );
+                                       $content = $content->getSection( $section );
 
-                               if ( !$content ) {
-                                       $this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
+                                       if ( !$content ) {
+                                               $this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
+                                       }
                                }
                        }
 
@@ -275,6 +280,10 @@ class ApiEditPage extends ApiBase {
                        if ( $section == 0 && $params['section'] != '0' && $params['section'] != 'new' ) {
                                $this->dieUsage( "The section parameter must be set to an integer or 'new'", "invalidsection" );
                        }
+                       $content = $pageObj->getContent();
+                       if ( $section !== 0 && ( !$content || !$content->getSection( $section ) ) ) {
+                               $this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
+                       }
                        $requestArray['wpSection'] = $params['section'];
                } else {
                        $requestArray['wpSection'] = '';
@@ -293,6 +302,10 @@ class ApiEditPage extends ApiBase {
                        $requestArray['wpWatchthis'] = '';
                }
 
+               // Pass through anything else we might have been given, to support extensions
+               // This is kind of a hack but it's the best we can do to make extensions work
+               $requestArray += $this->getRequest()->getValues();
+
                global $wgTitle, $wgRequest;
 
                $req = new DerivativeRequest( $this->getRequest(), $requestArray, true );
@@ -316,11 +329,37 @@ class ApiEditPage extends ApiBase {
 
                $ep->setContextTitle( $titleObj );
                $ep->importFormData( $req );
+               $content = $ep->textbox1;
+
+               // The following is needed to give the hook the full content of the
+               // new revision rather than just the current section. (Bug 52077)
+               if ( !is_null( $params['section'] ) && $contentHandler->supportsSections() && $titleObj->exists() ) {
+
+                       $sectionTitle = '';
+                       // If sectiontitle is set, use it, otherwise use the summary as the section title (for
+                       // backwards compatibility with old forms/bots).
+                       if ( $ep->sectiontitle !== '' ) {
+                               $sectionTitle = $ep->sectiontitle;
+                       } else {
+                               $sectionTitle = $ep->summary;
+                       }
+
+                       $contentObj = $contentHandler->unserializeContent( $content, $contentFormat );
+
+                       $fullContentObj = $articleObject->replaceSectionContent( $params['section'], $contentObj, $sectionTitle );
+                       if ( $fullContentObj ) {
+                               $content = $fullContentObj->serialize( $contentFormat );
+                       } else {
+                               // This most likely means we have an edit conflict which means that the edit
+                               // wont succeed anyway.
+                               $this->dieUsageMsg( 'editconflict' );
+                       }
+               }
 
                // Run hooks
                // Handle APIEditBeforeSave parameters
                $r = array();
-               if ( !wfRunHooks( 'APIEditBeforeSave', array( $ep, $ep->textbox1, &$r ) ) ) {
+               if ( !wfRunHooks( 'APIEditBeforeSave', array( $ep, $content, &$r ) ) ) {
                        if ( count( $r ) ) {
                                $r['result'] = 'Failure';
                                $apiResult->addValue( null, $this->getModuleName(), $r );