1
0
mirror of https://github.com/silverstripe/silverstripe-framework synced 2024-10-22 14:05:37 +02:00

FEATURE: Added MigrateSiteTreeLinkingTask to allow plain HTML links to be migrated into shortcode links.

From: Andrew Short <andrewjshort@gmail.com>

git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@88992 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
Andrew Short 2009-10-15 00:02:06 +00:00 committed by Sam Minnee
parent 1ccdcbac5d
commit 86c81bc6b4
3 changed files with 201 additions and 0 deletions

View File

@ -0,0 +1,54 @@
<?php
/**
* Rewrites plain internal HTML links into shortcode form, using existing link tracking information.
*
* @package sapphire
* @subpackage tasks
*/
class MigrateSiteTreeLinkingTask extends BuildTask {
protected $title = 'Migrate SiteTree Linking Task';
protected $description = 'Rewrites plain internal HTML links into shortcode form, using existing link tracking information.';
public function run($request) {
$pages = 0;
$links = 0;
$linkedPages = DataObject::get (
'SiteTree',
null,
null,
'INNER JOIN "SiteTree_LinkTracking" ON "SiteTree_LinkTracking"."SiteTreeID" = "SiteTree"."ID"'
);
if($linkedPages) foreach($linkedPages as $page) {
$tracking = DB::query(sprintf (
'SELECT "ChildID", "FieldName" FROM "SiteTree_LinkTracking" WHERE "SiteTreeID" = %d',
$page->ID
));
foreach($tracking as $link) {
$linked = DataObject::get_by_id('SiteTree', $link['ChildID']);
$page->{$link['FieldName']} = preg_replace (
"/href *= *([\"']?){$linked->URLSegment}\/?/i",
"href=$1[sitetree_link id={$linked->ID}]",
$page->{$link['FieldName']},
-1,
$replaced
);
if($replaced) {
$page->write();
$links += $replaced;
}
}
$pages++;
}
echo "Rewrote $links link(s) on $pages page(s) to use shortcodes.\n";
}
}

View File

@ -0,0 +1,80 @@
<?php
/**
* @package sapphire
* @subpackage tests
*/
class MigrateSiteTreeLinkingTaskTest extends SapphireTest {
public static $fixture_file = 'sapphire/tests/tasks/MigrateSiteTreeLinkingTaskTest.yml';
public static $use_draft_site = true;
public function testLinkingMigration() {
ob_start();
$task = new MigrateSiteTreeLinkingTask();
$task->run(null);
$this->assertEquals (
"Rewrote 9 link(s) on 5 page(s) to use shortcodes.\n",
ob_get_contents(),
'Rewritten links are correctly reported'
);
ob_end_clean();
$homeID = $this->idFromFixture('SiteTree', 'home');
$aboutID = $this->idFromFixture('SiteTree', 'about');
$staffID = $this->idFromFixture('SiteTree', 'staff');
$actionID = $this->idFromFixture('SiteTree', 'action');
$hashID = $this->idFromFixture('SiteTree', 'hash_link');
$homeContent = sprintf (
'<a href="[sitetree_link id=%d]">About</a><a href="[sitetree_link id=%d]">Staff</a><a href="http://silverstripe.org/">External Link</a>',
$aboutID,
$staffID
);
$aboutContent = sprintf (
'<a href="[sitetree_link id=%d]">Home</a><a href="[sitetree_link id=%d]">Staff</a>',
$homeID,
$staffID
);
$staffContent = sprintf (
'<a href="[sitetree_link id=%d]">Home</a><a href="[sitetree_link id=%d]">About</a>',
$homeID,
$aboutID
);
$actionContent = sprintf (
'<a href="[sitetree_link id=%d]SearchForm">Search Form</a>', $homeID
);
$hashLinkContent = sprintf (
'<a href="[sitetree_link id=%d]#anchor">Home</a><a href="[sitetree_link id=%d]#second-anchor">About</a>',
$homeID,
$aboutID
);
$this->assertEquals (
$homeContent,
DataObject::get_by_id('SiteTree', $homeID)->Content,
'HTML URLSegment links are rewritten.'
);
$this->assertEquals (
$aboutContent,
DataObject::get_by_id('SiteTree', $aboutID)->Content
);
$this->assertEquals (
$staffContent,
DataObject::get_by_id('SiteTree', $staffID)->Content
);
$this->assertEquals (
$actionContent,
DataObject::get_by_id('SiteTree', $actionID)->Content,
'Links to actions on pages are rewritten correctly.'
);
$this->assertEquals (
$hashLinkContent,
DataObject::get_by_id('SiteTree', $hashID)->Content,
'Hash/anchor links are correctly handled.'
);
}
}

View File

@ -0,0 +1,67 @@
SiteTree:
home:
Title: Home Page
URLSegment: home
Content: '<a href="about/">About</a><a href="staff">Staff</a><a href="http://silverstripe.org/">External Link</a>'
about:
Title: About Us
URLSegment: about
Content: <a href="home">Home</a><a href="staff/">Staff</a>
staff:
Title: Staff
URLSegment: staff
Content: <a href="home/">Home</a><a href="about">About</a>
Parent: =>SiteTree.about
action:
Title: Action Link
URLSegment: action
Content: <a href="home/SearchForm">Search Form</a>
hash_link:
Title: Hash Link
URLSegment: hash-link
Content: '<a href="home/#anchor">Home</a><a href="about/#second-anchor">About</a>'
admin_link:
Title: Admin Link
URLSegment: admin-link
Content: <a href="admin">Admin</a>
no_links:
Title: No Links
URLSemgment: No Links
SiteTree_LinkTracking:
home_about:
SiteTreeID: =>SiteTree.home
ChildID: =>SiteTree.about
FieldName: Content
home_staff:
SiteTreeID: =>SiteTree.home
ChildID: =>SiteTree.staff
FieldName: Content
about_home:
SiteTreeID: =>SiteTree.about
ChildID: =>SiteTree.home
FieldName: Content
about_staff:
SiteTreeID: =>SiteTree.about
ChildID: =>SiteTree.staff
FieldName: Content
staff_home:
SiteTreeID: =>SiteTree.staff
ChildID: =>SiteTree.home
FieldName: Content
staff_about:
SiteTreeID: =>SiteTree.staff
ChildID: =>SiteTree.about
FieldName: Content
action_home:
SiteTreeID: =>SiteTree.action
ChildID: =>SiteTree.home
FieldName: Content
hash_link_home:
SiteTreeID: =>SiteTree.hash_link
ChildID: =>SiteTree.home
FieldName: Content
hash_link_about:
SiteTreeID: =>SiteTree.hash_link
ChildID: =>SiteTree.about
FieldName: Content