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   1058 Views

Avatar
gcoderre

Community Member, 5 Posts

20 January 2011 at 11:42am

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

Forum Moderator, 5513 Posts

20 January 2011 at 8:57pm

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
gcoderre

Community Member, 5 Posts

22 January 2011 at 4:40am

Edited: 22/01/2011 4:42am

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

Forum Moderator, 5513 Posts

22 January 2011 at 12:51pm

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.