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); + } }