diff --git a/code/Controllers/CMSPageHistoryController.php b/code/Controllers/CMSPageHistoryController.php
index b21545d8..7ac7c3f9 100644
--- a/code/Controllers/CMSPageHistoryController.php
+++ b/code/Controllers/CMSPageHistoryController.php
@@ -7,10 +7,12 @@ use SilverStripe\Control\Controller;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Control\HTTPResponse;
use SilverStripe\Forms\CheckboxField;
+use SilverStripe\Forms\CompositeField;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\Form;
use SilverStripe\Forms\FormAction;
use SilverStripe\Forms\HiddenField;
+use SilverStripe\Forms\HTMLReadonlyField;
use SilverStripe\Forms\LiteralField;
use SilverStripe\ORM\FieldType\DBField;
use SilverStripe\ORM\FieldType\DBHTMLText;
@@ -450,21 +452,16 @@ class CMSPageHistoryController extends CMSMain
$form->setActions(new FieldList());
$form->addExtraClass('compare');
- // Comparison views shouldn't be editable.
- // Its important to convert fields *before* loading data,
- // as the comparison output is HTML and not valid values for the various field types
- $readonlyFields = $form->Fields()->makeReadonly();
- $form->setFields($readonlyFields);
-
$form->loadDataFrom($record);
$form->loadDataFrom(array(
"ID" => $id,
"Version" => $fromVersion,
));
- foreach ($form->Fields()->dataFields() as $field) {
- $field->dontEscape = true;
- }
+ // Comparison views shouldn't be editable.
+ // As the comparison output is HTML and not valid values for the various field types
+ $readonlyFields = $this->transformReadonly($form->Fields());
+ $form->setFields($readonlyFields);
return $form;
}
@@ -475,4 +472,22 @@ class CMSPageHistoryController extends CMSMain
$crumbs[0]->Title = _t('CMSPagesController.MENUTITLE', 'Pages');
return $crumbs;
}
+
+ /**
+ * Replace all data fields with HTML readonly fields to display diff
+ *
+ * @param FieldList $fields
+ * @return FieldList
+ */
+ public function transformReadonly(FieldList $fields)
+ {
+ foreach ($fields->dataFields() as $field) {
+ if ($field instanceof HiddenField) {
+ continue;
+ }
+ $newField = $field->castedCopy(HTMLReadonlyField::class);
+ $fields->replaceField($field->getName(), $newField);
+ }
+ return $fields;
+ }
}
diff --git a/tests/controller/CMSPageHistoryControllerTest.php b/tests/controller/CMSPageHistoryControllerTest.php
index d85acda5..cbfbe74d 100755
--- a/tests/controller/CMSPageHistoryControllerTest.php
+++ b/tests/controller/CMSPageHistoryControllerTest.php
@@ -1,5 +1,10 @@
assertThat($checkbox[0], $this->logicalNot($this->isNull()));
$this->assertEquals('checked', (string) $checkbox[0]->attributes()->checked);
}
+
+ public function testTransformReadonly()
+ {
+ /** @var CMSPageHistoryController $history */
+ $history = singleton(CMSPageHistoryController::class);
+
+ $fieldList = FieldList::create([
+ FieldGroup::create('group', [
+ TextField::create('childField', 'child field'),
+ ]),
+ TextField::create('field', 'field', 'My valuechange'),
+ HiddenField::create('hiddenField', 'hidden field'),
+ ]);
+
+ $newList = $history->transformReadonly($fieldList);
+
+ $field = $newList->dataFieldByName('field');
+ $this->assertTrue($field instanceof HTMLReadonlyField);
+ $this->assertContains('', $field->forTemplate());
+
+ $groupField = $newList->fieldByName('group');
+ $this->assertTrue($groupField instanceof FieldGroup);
+
+ $childField = $newList->dataFieldByName('childField');
+ $this->assertTrue($childField instanceof HTMLReadonlyField);
+
+ $hiddenField = $newList->dataFieldByName('hiddenField');
+ $this->assertTrue($hiddenField instanceof HiddenField);
+ }
}