mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
FEATURE: Allow you to link to SiteTree? objects in HTMLText or HTMLVarchar fields by using a "[sitetree_link id=n]" shortcode.
From: Andrew Short <andrewjshort@gmail.com> git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@88481 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
parent
acc063984b
commit
4a054c0cc5
@ -36,6 +36,11 @@ Director::addRules(1, array(
|
||||
'$URLSegment//$Action/$ID/$OtherID' => 'ModelAsController',
|
||||
));
|
||||
|
||||
/**
|
||||
* Register the default internal shortcodes.
|
||||
*/
|
||||
ShortcodeParser::get('default')->register('sitetree_link', array('SiteTree', 'link_shortcode_handler'));
|
||||
|
||||
/**
|
||||
* PHP 5.2 has a namespace conflict with our datetime class,
|
||||
* for legacy support, we use this overload method.
|
||||
|
@ -263,6 +263,29 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
return $classes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace a "[sitetree_link id=n]" shortcode with a link to the page with the corresponding ID.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function link_shortcode_handler($arguments, $content = null, $parser = null) {
|
||||
if(!isset($arguments['id']) || !is_numeric($arguments['id'])) return;
|
||||
|
||||
if (
|
||||
!($page = DataObject::get_by_id('SiteTree', $arguments['id'])) // Get the current page by ID.
|
||||
&& !($page = Versioned::get_latest_version('SiteTree', $arguments['id'])) // Attempt link to old version.
|
||||
&& !($page = DataObject::get_one('ErrorPage', '"ErrorCode" = \'404\'')) // Link to 404 page directly.
|
||||
) {
|
||||
return; // There were no suitable matches at all.
|
||||
}
|
||||
|
||||
if($content) {
|
||||
return sprintf('<a href="%s">%s</a>', $page->Link(), $parser->parse($content));
|
||||
} else {
|
||||
return $page->Link();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the link for this {@link SiteTree} object, with the {@link Director::baseURL()} included.
|
||||
*
|
||||
|
@ -381,6 +381,41 @@ class SiteTreeTest extends SapphireTest {
|
||||
|
||||
}
|
||||
|
||||
public function testLinkShortcodeHandler() {
|
||||
$aboutPage = $this->objFromFixture('Page', 'about');
|
||||
$errorPage = $this->objFromFixture('ErrorPage', '404');
|
||||
|
||||
$parser = new ShortcodeParser();
|
||||
$parser->register('sitetree_link', array('SiteTree', 'link_shortcode_handler'));
|
||||
|
||||
$aboutShortcode = sprintf('[sitetree_link id=%d]', $aboutPage->ID);
|
||||
$aboutEnclosed = sprintf('[sitetree_link id=%d]Example Content[/sitetree_link]', $aboutPage->ID);
|
||||
|
||||
$aboutShortcodeExpected = $aboutPage->Link();
|
||||
$aboutEnclosedExpected = sprintf('<a href="%s">Example Content</a>', $aboutPage->Link());
|
||||
|
||||
$this->assertEquals($aboutShortcodeExpected, $parser->parse($aboutShortcode), 'Test that simple linking works.');
|
||||
$this->assertEquals($aboutEnclosedExpected, $parser->parse($aboutEnclosed), 'Test enclosed content is linked.');
|
||||
|
||||
$aboutPage->delete();
|
||||
|
||||
$this->assertEquals($aboutShortcodeExpected, $parser->parse($aboutShortcode), 'Test that deleted pages still link.');
|
||||
$this->assertEquals($aboutEnclosedExpected, $parser->parse($aboutEnclosed));
|
||||
|
||||
$aboutShortcode = '[sitetree_link id="-1"]';
|
||||
$aboutEnclosed = '[sitetree_link id="-1"]Example Content[/sitetree_link]';
|
||||
|
||||
$aboutShortcodeExpected = $errorPage->Link();
|
||||
$aboutEnclosedExpected = sprintf('<a href="%s">Example Content</a>', $errorPage->Link());
|
||||
|
||||
$this->assertEquals($aboutShortcodeExpected, $parser->parse($aboutShortcode), 'Test link to 404 page if no suitable matches.');
|
||||
$this->assertEquals($aboutEnclosedExpected, $parser->parse($aboutEnclosed));
|
||||
|
||||
$this->assertEquals('', $parser->parse('[sitetree_link]'), 'Test that invalid ID attributes are not parsed.');
|
||||
$this->assertEquals('', $parser->parse('[sitetree_link id="text"]'));
|
||||
$this->assertEquals('', $parser->parse('[sitetree_link]Example Content[/sitetree_link]'));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// We make these extend page since that's what all page types are expected to do
|
||||
|
Loading…
Reference in New Issue
Block a user