Browse files

MINOR Moved FileLinkTracking feature into new SiteTreeFileDecorator c…

…lass in order to move it from 'sapphire' to 'cms'
  • Loading branch information...
1 parent 0b5e9ba commit 7b038db3bebfaa01a9e563eb6a49e8f3540fdf48 @chillu chillu committed Mar 23, 2011
Showing with 196 additions and 1 deletion.
  1. +3 −1 _config.php
  2. +71 −0 code/SiteTreeFileDecorator.php
  3. +112 −0 tests/FileLinkTrackingTest.php
  4. +10 −0 tests/FileLinkTrackingTest.yml
View
4 _config.php
@@ -58,4 +58,6 @@
/**
* Register the default internal shortcodes.
*/
-ShortcodeParser::get('default')->register('sitetree_link', array('SiteTree', 'link_shortcode_handler'));
+ShortcodeParser::get('default')->register('sitetree_link', array('SiteTree', 'link_shortcode_handler'));
+
+Object::add_extension('File', 'SiteTreeFileDecorator');
View
71 code/SiteTreeFileDecorator.php
@@ -0,0 +1,71 @@
+<?php
+/**
+ * @package cms
+ * @subpackage model
+ */
+class SiteTreeFileDecorator extends DataObjectDecorator {
+
+ function extraStatics() {
+ return array(
+ 'belongs_many_many' => array(
+ "BackLinkTracking" => "SiteTree",
+ )
+ );
+ }
+
+ /**
+ * @todo Unnecessary shortcut for AssetTableField, coupled with cms module.
+ *
+ * @return Integer
+ */
+ function BackLinkTrackingCount() {
+ $pages = $this->owner->BackLinkTracking();
+ if($pages) {
+ return $pages->Count();
+ } else {
+ return 0;
+ }
+ }
+
+ /**
+ * Updates link tracking.
+ */
+ function onAfterDelete() {
+ $brokenPages = $this->owner->BackLinkTracking();
+ if($brokenPages) {
+ $origStage = Versioned::current_stage();
+
+ // This will syncLinkTracking on draft
+ Versioned::reading_stage('Stage');
+ foreach($brokenPages as $brokenPage) $brokenPage->write();
+
+ // This will syncLinkTracking on published
+ Versioned::reading_stage('Live');
+ foreach($brokenPages as $brokenPage) $brokenPage->write();
+
+ Versioned::reading_stage($origStage);
+ }
+ }
+
+ /**
+ * Rewrite links to the $old file to now point to the $new file.
+ *
+ * @uses SiteTree->rewriteFileURL()
+ *
+ * @param String $old File path relative to the webroot
+ * @param String $new File path relative to the webroot
+ */
+ function updateLinks($old, $new) {
+ if(class_exists('Subsite')) Subsite::disable_subsite_filter(true);
+
+ $pages = $this->owner->BackLinkTracking();
+
+ $summary = "";
+ if($pages) {
+ foreach($pages as $page) $page->rewriteFileURL($old,$new);
+ }
+
+ if(class_exists('Subsite')) Subsite::disable_subsite_filter(false);
+ }
+
+}
View
112 tests/FileLinkTrackingTest.php
@@ -0,0 +1,112 @@
+<?php
+
+/**
+ * Tests link tracking to files and images.
+ */
+class FileLinkTrackingTest extends SapphireTest {
+ static $fixture_file = "cms/tests/FileLinkTrackingTest.yml";
+
+ function setUp() {
+ parent::setUp();
+ $this->logInWithPermission('ADMIN');
+
+ $fh = fopen(Director::baseFolder() . '/assets/testscript-test-file.pdf', "w");
+ fwrite($fh, str_repeat('x',1000000));
+ fclose($fh);
+ }
+ function tearDown() {
+ parent::tearDown();
+ $testFiles = array(
+ '/assets/testscript-test-file.pdf',
+ '/assets/renamed-test-file.pdf',
+ '/assets/renamed-test-file-second-time.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('<img src="assets/testscript-test-file.pdf"',
+ DB::query("SELECT \"Content\" FROM \"SiteTree_Live\" WHERE \"ID\" = $page->ID")->value());
+
+ $file = $this->objFromFixture('File', 'file1');
+ $file->Name = 'renamed-test-file.pdf';
+ $file->write();
+
+ $this->assertContains('<img src="assets/renamed-test-file.pdf"',
+ DB::query("SELECT \"Content\" FROM \"SiteTree\" WHERE \"ID\" = $page->ID")->value());
+ $this->assertContains('<img src="assets/renamed-test-file.pdf"',
+ DB::query("SELECT \"Content\" FROM \"SiteTree_Live\" WHERE \"ID\" = $page->ID")->value());
+ }
+
+ function testFileLinkRewritingOnVirtualPages() {
+ // Publish the source page
+ $page = $this->objFromFixture('Page', 'page1');
+ $this->assertTrue($page->doPublish());
+
+ // Create a virtual page from it, and publish that
+ $svp = new VirtualPage();
+ $svp->CopyContentFromID = $page->ID;
+ $svp->write();
+ $svp->doPublish();
+
+ // Rename the file
+ $file = $this->objFromFixture('File', 'file1');
+ $file->Name = 'renamed-test-file.pdf';
+ $file->write();
+
+ // Verify that the draft and publish virtual pages both have the corrected link
+ $this->assertContains('<img src="assets/renamed-test-file.pdf"',
+ DB::query("SELECT \"Content\" FROM \"SiteTree\" WHERE \"ID\" = $svp->ID")->value());
+ $this->assertContains('<img src="assets/renamed-test-file.pdf"',
+ DB::query("SELECT \"Content\" FROM \"SiteTree_Live\" WHERE \"ID\" = $svp->ID")->value());
+ }
+
+ function testLinkRewritingOnAPublishedPageDoesntMakeItEditedOnDraft() {
+ // Publish the source page
+ $page = $this->objFromFixture('Page', 'page1');
+ $this->assertTrue($page->doPublish());
+ $this->assertFalse($page->IsModifiedOnStage);
+
+ // Rename the file
+ $file = $this->objFromFixture('File', 'file1');
+ $file->Name = 'renamed-test-file.pdf';
+ $file->write();
+
+ // Caching hack
+ Versioned::prepopulate_versionnumber_cache('SiteTree', 'Stage', array($page->ID));
+ Versioned::prepopulate_versionnumber_cache('SiteTree', 'Live', array($page->ID));
+
+ // Confirm that the page hasn't gone green.
+ $this->assertFalse($page->IsModifiedOnStage);
+ }
+
+ function testTwoFileRenamesInARowWork() {
+ $page = $this->objFromFixture('Page', 'page1');
+ $this->assertTrue($page->doPublish());
+ $this->assertContains('<img src="assets/testscript-test-file.pdf"',
+ DB::query("SELECT \"Content\" FROM \"SiteTree_Live\" WHERE \"ID\" = $page->ID")->value());
+
+ // Rename the file twice
+ $file = $this->objFromFixture('File', 'file1');
+ $file->Name = 'renamed-test-file.pdf';
+ $file->write();
+
+ // TODO Workaround for bug in DataObject->getChangedFields(), which returns stale data,
+ // and influences File->updateFilesystem()
+ $file = DataObject::get_by_id('File', $file->ID);
+ $file->Name = 'renamed-test-file-second-time.pdf';
+ $file->write();
+
+ // Confirm that the correct image is shown in both the draft and live site
+ $this->assertContains('<img src="assets/renamed-test-file-second-time.pdf"',
+ DB::query("SELECT \"Content\" FROM \"SiteTree\" WHERE \"ID\" = $page->ID")->value());
+ $this->assertContains('<img src="assets/renamed-test-file-second-time.pdf"',
+ DB::query("SELECT \"Content\" FROM \"SiteTree_Live\" WHERE \"ID\" = $page->ID")->value());
+ }
+}
+
+?>
View
10 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: <p><img src="assets/testscript-test-file.pdf" /></p>

0 comments on commit 7b038db

Please sign in to comment.