diff --git a/_config/config.yml b/_config/config.yml index 8e169ffa..8b91fc39 100644 --- a/_config/config.yml +++ b/_config/config.yml @@ -4,6 +4,3 @@ LeftAndMain: Security: extensions: - ErrorPageControllerExtension -HtmlEditorField: - extensions: - - SiteTreeLinkTracking_Highlighter diff --git a/code/model/SiteTreeLinkTracking.php b/code/model/SiteTreeLinkTracking.php index 5286e572..7d57cc0d 100644 --- a/code/model/SiteTreeLinkTracking.php +++ b/code/model/SiteTreeLinkTracking.php @@ -37,15 +37,39 @@ class SiteTreeLinkTracking extends DataExtension { "ImageTracking" => array("FieldName" => "Varchar") ); - function trackLinksInField($field) { + public function trackLinksInField($fieldName) { $record = $this->owner; $linkedPages = array(); $linkedFiles = array(); - $htmlValue = Injector::inst()->create('HTMLValue', $record->$field); + $htmlValue = Injector::inst()->create('HTMLValue', $record->$fieldName); $links = $this->parser->process($htmlValue); + // Highlight broken links in the content. + foreach ($links as $link) { + $classStr = trim($link['DOMReference']->getAttribute('class')); + if (!$classStr) { + $classes = array(); + } else { + $classes = explode(' ', $classStr); + } + + // Add or remove the broken class from the link, depending on the link status. + if ($link['Broken']) { + $classes = array_unique(array_merge($classes, array('ss-broken'))); + } else { + $classes = array_diff($classes, array('ss-broken')); + } + + if (!empty($classes)) { + $link['DOMReference']->setAttribute('class', implode(' ', $classes)); + } else { + $link['DOMReference']->removeAttribute('class'); + } + } + $record->$fieldName = $htmlValue->getContent(); + // Populate link tracking for internal links & links to asset files. foreach ($links as $link) { switch ($link['Type']) { @@ -88,13 +112,13 @@ class SiteTreeLinkTracking extends DataExtension { if($record->ID && $record->many_many('LinkTracking') && $tracker = $record->LinkTracking()) { $tracker->removeByFilter(sprintf( '"FieldName" = \'%s\' AND "%s" = %d', - $field, + $fieldName, $tracker->getForeignKey(), $record->ID )); if($linkedPages) foreach($linkedPages as $item) { - $tracker->add($item, array('FieldName' => $field)); + $tracker->add($item, array('FieldName' => $fieldName)); } } @@ -102,18 +126,18 @@ class SiteTreeLinkTracking extends DataExtension { if($record->ID && $record->many_many('ImageTracking') && $tracker = $record->ImageTracking()) { $tracker->removeByFilter(sprintf( '"FieldName" = \'%s\' AND "%s" = %d', - $field, + $fieldName, $tracker->getForeignKey(), $record->ID )); if($linkedFiles) foreach($linkedFiles as $item) { - $tracker->add($item, array('FieldName' => $field)); + $tracker->add($item, array('FieldName' => $fieldName)); } } } - function augmentSyncLinkTracking() { + public function augmentSyncLinkTracking() { // Reset boolean broken flags $this->owner->HasBrokenLink = false; $this->owner->HasBrokenFile = false; @@ -134,51 +158,6 @@ class SiteTreeLinkTracking extends DataExtension { } } -/** - * Extension for enabling highlighting of broken links in the HtmlEditorFields. - */ -class SiteTreeLinkTracking_Highlighter extends Extension { - - public $parser; - - private static $dependencies = array( - 'parser' => '%$SiteTreeLinkTracking_Parser' - ); - - /** - * Adds an ability to highlight broken links in the content. - * It reuses the parser the SiteTreeLinkTracking uses for maintaining the references and the "broken" flags - * to make sure all pages listed in the BrokenLinkChecker highlight these in their content. - */ - public function onBeforeRender($field) { - // Handle situation when the field has been customised, i.e. via $properties on the HtmlEditorField::Field call. - $obj = $this->owner->getCustomisedObj() ?: $this->owner; - $value = $obj->value; - - // Parse the text as DOM. - $htmlValue = Injector::inst()->create('HTMLValue', $value); - $links = $this->parser->process($htmlValue); - - foreach ($links as $link) { - $classStr = $link['DOMReference']->getAttribute('class'); - $classes = explode(' ', $classStr); - - // Add or remove the broken class from the link, depending on the link status. - if ($link['Broken']) { - $classes = array_unique(array_merge($classes, array('ss-broken'))); - } else { - $classes = array_diff($classes, array('ss-broken')); - } - $link['DOMReference']->setAttribute('class', implode(' ', $classes)); - } - - $obj->customise(array( - 'Value' => htmlentities($htmlValue->getContent(), ENT_COMPAT, 'UTF-8') - )); - } - -} - /** * A helper object for extracting information about links. */ diff --git a/tests/model/SiteTreeBrokenLinksTest.php b/tests/model/SiteTreeBrokenLinksTest.php index 90fb9144..c3f8ccc6 100644 --- a/tests/model/SiteTreeBrokenLinksTest.php +++ b/tests/model/SiteTreeBrokenLinksTest.php @@ -292,13 +292,6 @@ class SiteTreeBrokenLinksTest extends SapphireTest { $this->assertFalse((bool)$vp->HasBrokenLink); $this->assertFalse((bool)$rp->HasBrokenLink); - // However, the page isn't marked as modified on stage - $this->assertFalse($p2->IsModifiedOnStage); - $this->assertFalse($rp->IsModifiedOnStage); - - // This is something that we know to be broken - //$this->assertFalse($vp->IsModifiedOnStage); - } public function testBrokenAnchorLinksInAPage() { diff --git a/tests/model/SiteTreeHTMLEditorFieldTest.php b/tests/model/SiteTreeHTMLEditorFieldTest.php index daf5c77d..c3a63a5b 100644 --- a/tests/model/SiteTreeHTMLEditorFieldTest.php +++ b/tests/model/SiteTreeHTMLEditorFieldTest.php @@ -166,37 +166,4 @@ class SiteTreeHtmlEditorFieldTest extends FunctionalTest { $this->assertFalse((bool) $sitetree->HasBrokenFile); } - public function testBrokenLinkHighlighting() { - $sitetree = new SiteTree(); - $editor = new HtmlEditorField('Content'); - - // SiteTree link highlighting - $editor->setValue('Broken Link'); - - $element = new SimpleXMLElement(html_entity_decode((string) new SimpleXMLElement($editor->Field()))); - $this->assertContains('ss-broken', (string) $element['class'], 'A broken SiteTree link is highlighted'); - - $editor->setValue(sprintf ( - 'Working Link', - $this->idFromFixture('SiteTree', 'home') - )); - - $element = new SimpleXMLElement(html_entity_decode((string) new SimpleXMLElement($editor->Field()))); - $this->assertNotContains('ss-broken', (string) $element['class']); - - // File link highlighting - $editor->setValue('Broken Link'); - - $element = new SimpleXMLElement(html_entity_decode((string) new SimpleXMLElement($editor->Field()))); - $this->assertContains('ss-broken', (string) $element['class'], 'A broken File link is highlighted'); - - $editor->setValue(sprintf ( - 'Working Link', - $this->idFromFixture('File', 'example_file') - )); - - $element = new SimpleXMLElement(html_entity_decode((string) new SimpleXMLElement($editor->Field()))); - $this->assertNotContains('ss-broken', (string) $element['class']); - } - } diff --git a/tests/model/SiteTreeLinkTrackingTest.php b/tests/model/SiteTreeLinkTrackingTest.php index 7fc43f9f..98ccb71f 100644 --- a/tests/model/SiteTreeLinkTrackingTest.php +++ b/tests/model/SiteTreeLinkTrackingTest.php @@ -35,10 +35,10 @@ class SiteTreeLinkTrackingTest extends SapphireTest { } function highlight($content) { - $field = new SiteTreeLinkTrackingTest_Field('Test'); - $field->setValue($content); - $newContent = html_entity_decode($field->Field(), ENT_COMPAT, 'UTF-8'); - return $newContent; + $page = new Page(); + $page->Content = $content; + $page->write(); + return $page->Content; } function testHighlighter() { @@ -49,20 +49,15 @@ class SiteTreeLinkTrackingTest extends SapphireTest { $content = $this->highlight('link'); $this->assertEquals(substr_count($content, 'ss-broken'), 1, 'ss-broken class is added to the broken link.'); - $page = new Page(); - $page->Content = ''; - $page->write(); + $otherPage = new Page(); + $otherPage->Content = ''; + $otherPage->write(); $content = $this->highlight( - "ID]\" class=\"existing-class ss-broken ss-broken\">link" + "ID]\" class=\"existing-class ss-broken ss-broken\">link" ); $this->assertEquals(substr_count($content, 'ss-broken'), 0, 'All ss-broken classes are removed from good link'); $this->assertEquals(substr_count($content, 'existing-class'), 1, 'Existing class is not removed.'); } -} -class SiteTreeLinkTrackingTest_Field extends HtmlEditorField implements TestOnly { - private static $extensions = array( - 'SiteTreeLinkTracking_Highlighter' - ); } diff --git a/tests/tasks/MigrateSiteTreeLinkingTaskTest.php b/tests/tasks/MigrateSiteTreeLinkingTaskTest.php index 537d2467..6239d687 100644 --- a/tests/tasks/MigrateSiteTreeLinkingTaskTest.php +++ b/tests/tasks/MigrateSiteTreeLinkingTaskTest.php @@ -29,12 +29,12 @@ class MigrateSiteTreeLinkingTaskTest extends SapphireTest { $hashID = $this->idFromFixture('SiteTree', 'hash_link'); $homeContent = sprintf ( - 'AboutStaffExternal Link', + 'AboutStaffExternal Link', $aboutID, $staffID ); $aboutContent = sprintf ( - 'HomeStaff', + 'HomeStaff', $homeID, $staffID ); diff --git a/tests/tasks/MigrateSiteTreeLinkingTaskTest.yml b/tests/tasks/MigrateSiteTreeLinkingTaskTest.yml index 084ae190..3d14a8b9 100644 --- a/tests/tasks/MigrateSiteTreeLinkingTaskTest.yml +++ b/tests/tasks/MigrateSiteTreeLinkingTaskTest.yml @@ -2,11 +2,11 @@ SiteTree: home: Title: Home Page URLSegment: home - Content: 'AboutStaffExternal Link' + Content: 'AboutStaffExternal Link' about: Title: About Us URLSegment: about - Content: 'HomeStaff' + Content: 'HomeStaff' staff: Title: Staff URLSegment: staff