Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

Template Questions

Template "slots" for inserting markup in other templates


Reply

4 Posts   1027 Views

Avatar
GuillaumeC

20 January 2011 at 11:42am Community Member, 5 Posts

Hi,

Does SilverStripe contain a way to add markup from a template to another template? Symfony calls it [url="http://www.symfony-project.org/gentle-introduction/1_4/en/07-Inside-the-View-Layer#chapter_07_sub_slots"]template slots[/url], and Ruby on Rails [url="http://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-content_for"]content_for[/url].

What I'm looking to do specifically is to add HTML / Javascript bits to the bottom of a site layout from inside a view.

I had a look at the reference pages of doc.silverstripe.com and the Sapphire API, and couldn't find an answer. I'm also quite new to SilverStripe, so I don't fully understand the capabilities / limitations of SSViewer yet...

Thanks for your help!

Avatar
Willr

20 January 2011 at 8:57pm Forum Moderator, 5511 Posts

The symfony slots act a little bit like the <% include Template %> functionality but includes are much more simpler.

In sapphire you can also define your own functions which render into a template, then you can swap the template it renders into based on controller actions etc.

For example if you have a extra totally different layout based on whether someFunctionFoo() is true or not you can do

// main template
$SomeMoreTemplate

// in that templates controller
function SomeMoreTemplate() {
return ($this->someFunctionFoo()) ? $this->renderWith('Template1') : $this->renderWith('Template2');
}

Avatar
GuillaumeC

22 January 2011 at 4:40am (Last edited: 22 January 2011 4:42am), Community Member, 5 Posts

Thanks for your reply Willr!

It's good to know that I can define my own template functions, but in my specific case it seems to be overkill. It often happens that I have view-specific Javascript to render, and while I could add it straight into the view, I would much prefer have some kind of mechanism to "inject" it to the bottom of my layout. A bit like that:

I know I should probably just put that JS in an external file and add it with Requirements::javascript, but it shows well what I'm trying to achieve.

Avatar
Willr

22 January 2011 at 12:51pm Forum Moderator, 5511 Posts

I don't *think* there is anything to support that sort of dynamic injection yet. The current 2.4 SSViewer is little more than a simply string search and replace and doesn't really have any sort of smarts, hence using PHP and renderWith() which you can overload on your controller actions etc.

SSViewer is getting a bit old overhaul for 3.0 so implementing functions like that may become easier.