Version: current

# Class DataDifferencer

Utility class to render views of the differences between two data objects (or two versions of the same data object).

Construcing a diff object is done as follows:

    $fromRecord = Versioned::get_version('SiteTree', $pageID, $fromVersion);
    $toRecord = Versioned::get_version('SiteTree, $pageID, $toVersion);
    $diff = new DataDifferencer($fromRecord, $toRecord);

And then it can be used in a number of ways. You can use the ChangedFields() method in a template:

    <dl class="diff">
    <% control Diff.ChangedFields %>
       <dt>$Title</dt>
       <dd>$Diff</dd>
    <% end_control %>
    </dl>

Or you can get the diff'ed content as another DataObject, that you can insert into a form.

    $form->loadDataFrom($diff->diffedData());

If there are fields whose changes you aren't interested in, you can ignore them like so:

    $diff->ignoreFields('AuthorID', 'Status');

  Object
  ViewableData implements IteratorAggregate
  DataDifferencer

Package: sapphire\misc
Located at sapphire/core/model/DataDifferencer.php

## Methods summary

`public` | # `__construct( mixed $fromRecord, mixed $toRecord )` Construct a DataDifferencer to show the changes between $fromRecord and $toRecord. If $fromRecord is null, this will represent a "creation". Construct a DataDifferencer to show the changes between $fromRecord and $toRecord. If $fromRecord is null, this will represent a "creation". #### Overrides `Object::__construct`
`public` | # `ignoreFields( mixed $ignoredFields )` Specify some fields to ignore changes from. Repeated calls are cumulative. Specify some fields to ignore changes from. Repeated calls are cumulative. #### Parameters $ignoredFields $ignoredFields An array of field names to ignore. Alternatively, pass the field names as separate args.
`public` | # `diffedData( )` Get a DataObject with altered values replaced with HTML diff strings, incorporating <ins> and <del> tags. Get a DataObject with altered values replaced with HTML diff strings, incorporating <ins> and <del> tags.
`public` | # `ChangedFields( )` Get a DataObjectSet of the changed fields. Each element is an array data containing - Name: The field name - Title: The human-readable field title - Diff: An HTML diff showing the changes - From: The older version of the field - To: The newer version of the field Get a DataObjectSet of the changed fields. Each element is an array data containing - Name: The field name - Title: The human-readable field title - Diff: An HTML diff showing the changes - From: The older version of the field - To: The newer version of the field
`public` | # `changedFieldNames( )` Get an array of the names of every fields that has changed. This is simpler than `DataDifferencer::ChangedFields()` Get an array of the names of every fields that has changed. This is simpler than `DataDifferencer::ChangedFields()`

### Methods inherited from ViewableData

`ATT_val()`, `BaseHref()`, `CSSClasses()`, `ColumnBreak()`, `ColumnCalc()`, `ColumnNumber()`, `ColumnPad()`, `ColumnPos()`, `CurrentMember()`, `CurrentPage()`, `Debug()`, `Even()`, `EvenOdd()`, `First()`, `FirstLast()`, `HasPerm()`, `IsAjax()`, `JS_val()`, `Last()`, `Me()`, `Middle()`, `MiddleString()`, `Modulus()`, `MultipleOf()`, `Odd()`, `Pos()`, `RAW_val()`, `SQL_val()`, `ThemeDir()`, `ThemeName()`, `Top()`, `TotalItems()`, `XML_val()`, `__get()`, `__isset()`, `__set()`, `buildCastingCache()`, `cachedCall()`, `castingClass()`, `castingHelper()`, `castingHelperPair()`, `castingObjectCreator()`, `castingObjectCreatorPair()`, `customise()`, `defineMethods()`, `escapeTypeForField()`, `getField()`, `getIterator()`, `getSecurityID()`, `getXMLValues()`, `hasField()`, `hasValue()`, `i18nLocale()`, `iteratorProperties()`, `obj()`, `renderWith()`, `setCustomisedObj()`, `setField()`

### Methods inherited from Object

`__call()`, `__toString()`, `__wakeup()`, `addMethodsFrom()`, `addStaticVars()`, `addWrapperMethod()`, `add_extension()`, `add_static_var()`, `allMethodNames()`, `cacheToFile()`, `cacheToFileWithArgs()`, `clearCache()`, `combined_static()`, `create()`, `createMethod()`, `create_from_string()`, `exists()`, `extInstance()`, `extend()`, `getCustomClass()`, `getExtensionInstance()`, `getExtensionInstances()`, `get_extensions()`, `get_static()`, `hasExtension()`, `hasMethod()`, `has_extension()`, `invokeWithExtensions()`, `is_a()`, `loadCache()`, `parentClass()`, `parse_class_spec()`, `remove_extension()`, `sanitiseCachename()`, `saveCache()`, `set_stat()`, `set_static()`, `set_uninherited()`, `stat()`, `strong_create()`, `uninherited()`, `uninherited_static()`, `useCustomClass()`

### Magic methods summary

## Properties summary

`protected mixed` | $fromRecord | #
`protected mixed` | $toRecord | #
`protected array` | $ignoredFields | #

### Properties inherited from ViewableData

`$casting`, `$customisedObject`, `$default_cast`, `$failover`, `$iteratorPos`, `$iteratorTotalItems`

### Properties inherited from Object

`$class`, `$extension_instances`, `$extensions`

[Raise a SilverStripe Framework issue/bug](https://github.com/silverstripe/silverstripe-framework/issues/new)
- [Raise a SilverStripe CMS issue/bug](https://github.com/silverstripe/silverstripe-cms/issues/new)
- Please use the Silverstripe Forums to ask development related questions. -