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