https://www.mediawiki.org/wiki/Special:Code/MediaWiki/114433

Revision: 114433
Author:   jeroendedauw
Date:     2012-03-23 00:14:18 +0000 (Fri, 23 Mar 2012)
Log Message:
-----------
work on revision diffs

Modified Paths:
--------------
    trunk/extensions/EducationProgram/actions/EPRestoreAction.php
    trunk/extensions/EducationProgram/actions/EPUndoAction.php
    trunk/extensions/EducationProgram/includes/EPRevisionDiff.php
    trunk/extensions/EducationProgram/includes/EPRevisionedObject.php

Modified: trunk/extensions/EducationProgram/actions/EPRestoreAction.php
===================================================================
--- trunk/extensions/EducationProgram/actions/EPRestoreAction.php       
2012-03-22 23:15:28 UTC (rev 114432)
+++ trunk/extensions/EducationProgram/actions/EPRestoreAction.php       
2012-03-23 00:14:18 UTC (rev 114433)
@@ -64,8 +64,21 @@
                                                $success = $this->doRestore( 
$object, $revision );
                                        }
                                        else {
-                                               $this->displayForm( $object, 
$revision );
-                                               $success = null;
+                                               $diff = 
$object->getRestoreDiff( $revision );
+
+                                               if ( $diff->isValid() ) {
+                                                       if ( 
$diff->hasChanges() ) {
+                                                               
$diff->setContext( $this->getContext() );
+                                                               
$diff->display();
+
+                                                               
$this->displayForm( $object, $revision );
+                                                       }
+                                                       else {
+                                                               // TODO
+                                                       }
+
+                                                       $success = null;
+                                               }
                                        }
                                }
                        }
@@ -102,7 +115,7 @@
         * @return boolean Success indicator
         */
        protected function doRestore( EPPageObject $object, EPRevision 
$revision ) {
-               $success = $object->restoreToRevision( $revision, 
$object->getTable()->getRevertableFields() );
+               $success = $object->restoreToRevision( $revision );
                
                if ( $success ) {
                        $revAction = new EPRevisionAction();

Modified: trunk/extensions/EducationProgram/actions/EPUndoAction.php
===================================================================
--- trunk/extensions/EducationProgram/actions/EPUndoAction.php  2012-03-22 
23:15:28 UTC (rev 114432)
+++ trunk/extensions/EducationProgram/actions/EPUndoAction.php  2012-03-23 
00:14:18 UTC (rev 114433)
@@ -115,7 +115,7 @@
         * @return boolean Success indicator
         */
        protected function doUndo( EPPageObject $object, EPRevision $revision ) 
{
-               $success = $object->undoRevision( $revision, 
$object->getTable()->getRevertableFields() );
+               $success = $object->undoRevision( $revision );
 
                if ( $success ) {
                        $revAction = new EPRevisionAction();

Modified: trunk/extensions/EducationProgram/includes/EPRevisionDiff.php
===================================================================
--- trunk/extensions/EducationProgram/includes/EPRevisionDiff.php       
2012-03-22 23:15:28 UTC (rev 114432)
+++ trunk/extensions/EducationProgram/includes/EPRevisionDiff.php       
2012-03-23 00:14:18 UTC (rev 114433)
@@ -19,6 +19,34 @@
 
        protected $isValid = true;
 
+       public static function newFromRestoreRevision( EPRevisionedObject 
$sourceObject, EPRevision $revison, array $fields = null ) {
+               $changedFields = array();
+
+               $targetObject = $revison->getObject();
+               $fields = is_null( $fields ) ? $targetObject->getFieldNames() : 
$fields;
+
+               foreach ( $fields as $fieldName ) {
+                       $sourceHasField = $sourceObject->hasField( $fieldName );
+                       $targetHasField = $targetObject->hasField( $fieldName );
+
+                       if ( ( $sourceHasField XOR $targetHasField )
+                               || $sourceObject->getField( $fieldName, null ) 
!== $targetObject->getField( $fieldName, null ) ) {
+
+                               $changedFields[$fieldName] = array();
+
+                               if ( $sourceHasField ) {
+                                       $changedFields[$fieldName]['source'] = 
$sourceObject->getField( $fieldName );
+                               }
+
+                               if ( $targetHasField ) {
+                                       $changedFields[$fieldName]['target'] = 
$targetObject->getField( $fieldName );
+                               }
+                       }
+               }
+
+               return new self( $changedFields );
+       }
+
        public static function newFromUndoRevision( EPRevisionedObject 
$currentObject, EPRevision $revison, array $fields = null ) {
                $changedFields = array();
 
@@ -30,13 +58,25 @@
                        $fields = is_null( $fields ) ? 
$sourceObject->getFieldNames() : $fields;
 
                        foreach ( $fields as $fieldName ) {
-                               if ( $currentObject->getField( $fieldName ) === 
$sourceObject->getField( $fieldName )
-                                       && $sourceObject->getField( $fieldName 
) !== $targetObject->getField( $fieldName ) ) {
+                               $sourceHasField = $sourceObject->hasField( 
$fieldName );
+                               $targetHasField = $targetObject->hasField( 
$fieldName );
 
-                                       $changedFields[$fieldName] = array(
-                                               $sourceObject->getField( 
$fieldName ),
-                                               $targetObject->getField( 
$fieldName )
-                                       );
+                               if ( $currentObject->getField( $fieldName, null 
) === $sourceObject->getField( $fieldName, null )
+                                       &&
+                                       (       ( $sourceHasField XOR 
$targetHasField )
+                                               ||
+                                               $sourceObject->getField( 
$fieldName, null ) !== $targetObject->getField( $fieldName, null )
+                                       ) ) {
+
+                                       $changedFields[$fieldName] = array();
+
+                                       if ( $sourceHasField ) {
+                                               
$changedFields[$fieldName]['source'] = $sourceObject->getField( $fieldName );
+                                       }
+
+                                       if ( $targetHasField ) {
+                                               
$changedFields[$fieldName]['target'] = $targetObject->getField( $fieldName );
+                                       }
                                }
                        }
                }
@@ -64,13 +104,14 @@
                $out->addHTML( '</tr>' );
 
                foreach ( $this->changedFields as $field => $values ) {
-                       list( $old, $new ) = $values;
-
                        $out->addHtml( '<tr>' );
 
+                       $source = array_key_exists( 'source', $values ) ? 
$values['source'] : '';
+                       $target = array_key_exists( 'target', $values ) ? 
$values['target'] : '';
+
                        $out->addElement( 'th', array(), $field );
-                       $out->addElement( 'td', array(), $old );
-                       $out->addElement( 'td', array(), $new );
+                       $out->addElement( 'td', array(), $source );
+                       $out->addElement( 'td', array(), $target );
 
                        $out->addHtml( '</tr>' );
                }

Modified: trunk/extensions/EducationProgram/includes/EPRevisionedObject.php
===================================================================
--- trunk/extensions/EducationProgram/includes/EPRevisionedObject.php   
2012-03-22 23:15:28 UTC (rev 114432)
+++ trunk/extensions/EducationProgram/includes/EPRevisionedObject.php   
2012-03-23 00:14:18 UTC (rev 114433)
@@ -345,21 +345,31 @@
         * 
         * @param EPRevision $revison
         * @param array|null $fields
-        * 
+        *
         * @return boolean Success indicator
         */
        public function restoreToRevision( EPRevision $revison, array $fields = 
null ) {
-               $object = $revison->getObject();
-               $fields = is_null( $fields ) ? $object->getFieldNames() : 
$fields;
-               
-               foreach ( $fields as $fieldName ) {
-                       $this->restoreField( $fieldName, $object->getField( 
$fieldName ) );
-               }
-               
-               return true;
+               $diff = $this->getRestoreDiff( $revison, $fields );
+               $this->applyDiff( $diff );
+               return $diff->isValid();
        }
 
        /**
+        * Get a diff for the changes that will happen when retoring to the 
provided revision.
+        *
+        * @since 0.1
+        *
+        * @param EPRevision $revison
+        * @param array|null $fields
+        *
+        * @return EPRevisionDiff
+        */
+       public function getRestoreDiff( EPRevision $revison, array $fields = 
null ) {
+               $fields = is_null( $fields ) ? 
$this->table->getRevertableFields() : $fields;
+               return EPRevisionDiff::newFromRestoreRevision( $this, $revison, 
$fields );
+       }
+
+       /**
         * Undo the changes of a single revision to this object.
         * Changes are compared on field level. If a field is no
         * longer the same as in the revision being undone, it
@@ -377,12 +387,19 @@
         */
        public function undoRevision( EPRevision $revison, array $fields = null 
) {
                $diff = $this->getUndoDiff( $revison, $fields );
+               $this->applyDiff( $diff );
+               return $diff->isValid();
+       }
 
+       public function applyDiff( EPRevisionDiff $diff ) {
                foreach ( $diff->getChangedFields() as $fieldName => $values ) {
-                       $this->restoreField( $fieldName, $values[1] );
+                       if ( array_key_exists( 'target', $values ) ) {
+                               $this->restoreField( $fieldName, 
$values['target'] );
+                       }
+                       else {
+                               $this->removeField( $fieldName );
+                       }
                }
-
-               return $diff->isValid();
        }
 
        /**
@@ -396,6 +413,7 @@
         * @return EPRevisionDiff
         */
        public function getUndoDiff( EPRevision $revison, array $fields = null 
) {
+               $fields = is_null( $fields ) ? 
$this->table->getRevertableFields() : $fields;
                return EPRevisionDiff::newFromUndoRevision( $this, $revison, 
$fields );
        }
 


_______________________________________________
MediaWiki-CVS mailing list
MediaWiki-CVS@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to