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
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs