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',
|
'$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,
|
* PHP 5.2 has a namespace conflict with our datetime class,
|
||||||
* for legacy support, we use this overload method.
|
* for legacy support, we use this overload method.
|
||||||
|
@ -263,6 +263,29 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
|||||||
return $classes;
|
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.
|
* 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
|
// We make these extend page since that's what all page types are expected to do
|
||||||
|
Loading…
Reference in New Issue
Block a user