diff --git a/core/model/SiteTree.php b/core/model/SiteTree.php
index 725179724..c9bdf371e 100755
--- a/core/model/SiteTree.php
+++ b/core/model/SiteTree.php
@@ -1469,6 +1469,54 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
return self::get_by_link($link);
}
+ /**
+ * Replace a URL in html content with a new URL.
+ * @param string $old The old URL
+ * @param string $new The new URL
+ */
+ function rewriteLink($old, $new) {
+ $fields = $this->getCMSFields(null)->dataFields();
+ foreach($fields as $field) {
+ if(is_a($field, 'HtmlEditorField')) {
+ $fieldName = $field->Name();
+ $field->setValue($this->$fieldName);
+ $field->rewriteLink($old, $new);
+ $field->saveInto($this);
+ }
+ }
+ }
+
+ /**
+ * Rewrite a file URL on this page, after its been renamed.
+ * Triggers the onRenameLinkedAsset action on extensions.
+ */
+ function rewriteFileURL($old, $new) {
+ Debug::message("Rewriting $old to $new");
+
+ // TODO: Check all HTMLText fields
+ $fieldName = "Content";
+ if($fieldName) {
+ $original = clone $this;
+
+ // Draft site
+ $this->$fieldName = str_replace($old, $new, $this->$fieldName, $numReplaced);
+ if($numReplaced) $this->write();
+
+ // Published site
+ $published = DB::query("SELECT * FROM \"SiteTree_Live\" WHERE ID = $this->ID")->record();
+ $origPublished = $published;
+ $published[$fieldName] = str_replace($old, $new, $published[$fieldName], $numReplaced);
+ if($numReplaced) {
+ DB::query("UPDATE \"SiteTree_Live\" SET \"$fieldName\" = '"
+ . Convert::raw2sql($published[$fieldName]) . "' WHERE ID = $this->ID");
+
+ $publishedClass = $origPublished['ClassName'];
+ $origPublishedObj = new $publishedClass($origPublished);
+ $this->extend('onRenameLinkedAsset', $origPublishedObj);
+ }
+ }
+ }
+
/**
* Returns a FieldSet with which to create the CMS editing form.
*
@@ -1876,6 +1924,8 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
// Handle activities undertaken by decorators
$this->extend('onAfterPublish', $original);
+
+ return true;
}
/**
diff --git a/filesystem/File.php b/filesystem/File.php
index 6bbb3a371..4c3b86720 100755
--- a/filesystem/File.php
+++ b/filesystem/File.php
@@ -380,15 +380,9 @@ class File extends DataObject {
$pages = $this->BackLinkTracking();
+ $summary = "";
if($pages) {
- foreach($pages as $page) {
- $fieldName = $page->FieldName; // extracted from the many-many join
- if($fieldName) {
- $text = $page->$fieldName;
- $page->$fieldName = str_replace($old, $new, $page->$fieldName);
- $page->write();
- }
- }
+ foreach($pages as $page) $page->rewriteFileURL($old,$new);
}
if(class_exists('Subsite')) Subsite::disable_subsite_filter(false);
diff --git a/tests/FileLinkTrackingTest.php b/tests/FileLinkTrackingTest.php
new file mode 100644
index 000000000..59311d778
--- /dev/null
+++ b/tests/FileLinkTrackingTest.php
@@ -0,0 +1,40 @@
+logInWithPermssion('ADMIN');
+ touch(Director::baseFolder() . '/assets/testscript-test-file.pdf');
+ }
+ function tearDown() {
+ parent::tearDown();
+ $testFiles = array(
+ '/assets/testscript-test-file.pdf',
+ '/assets/renamed-test-file.pdf',
+ );
+ foreach($testFiles as $file) {
+ if(file_exists(Director::baseFolder().$file)) unlink(Director::baseFolder().$file);
+ }
+ }
+
+ function testFileRenameUpdatesDraftAndPublishedPages() {
+ $page = $this->objFromFixture('Page', 'page1');
+ $this->assertTrue($page->doPublish());
+ $this->assertContains('',
+ DB::query("SELECT \"Content\" FROM \"SiteTree_Live\" WHERE \"ID\" = $page->ID")->value());
+
+ $file = $this->objFromFixture('File', 'file1');
+ $file->Name = 'renamed-test-file.pdf';
+
+ $this->assertContains('
',
+ DB::query("SELECT \"Content\" FROM \"SiteTree\" WHERE \"ID\" = $page->ID")->value());
+ }
+
+}
+
+?>
diff --git a/tests/FileLinkTrackingTest.yml b/tests/FileLinkTrackingTest.yml
new file mode 100644
index 000000000..45906aea3
--- /dev/null
+++ b/tests/FileLinkTrackingTest.yml
@@ -0,0 +1,10 @@
+# These need to come first so that SiteTree has the link meta-data written.
+File:
+ file1:
+ Filename: assets/testscript-test-file.pdf
+
+Page:
+ page1:
+ Title: page1
+ URLSegment: page1
+ Content: