0
votes

at the moment I´m working with a custom Silverstripe Controller with a Director rule:

---
Name: myroutes
After: framework/routes#coreroutes
---
Director:
  rules:
    'category/$Action/$Slug': 'Category_Controller'

The Controller looks like that:

class Category_Controller extends Page_Controller {
    public function show($arguments) {
       echo "Slug: " . $arguments->param("Slug");
   }
}

When I open in the browser the URL http://mysite.com/category/show/mobile then the output look fine like this: "Slug: mobile".

I just wonder how I can use a Category.ss Template from the Folder "themes/templates/Layout" to render the Output. Then of course the container html (with header/footer) from Page.ss should be included as well. Just as usual when you have a custom Page Controller/Class and a corresponding Template in the Layout Folder.

I just tried this:

public function show($arguments) {
    echo $this->renderWith("Category");
}

It uses Category.ss for rendering the output, but there is no container html...

Thx for any help. Regards, Florian

1

1 Answers

3
votes

you can also pass an array to renderWith(), and it will try through the array until it finds a template.

so lets say $this->renderWith(array('Category', 'Page')); it will first look for a template called Category.ss, but will not find it (in the templates folder, not layout folder), it will then find Page.ss and use it. Now it hits $Layout inside Page.ss and it checks the array again inside the Layout folder, it will now find the Category.ss, which is exactly what you where looking for if I got the question right.

if you do not want to do return $this->renderWith(); you can also just do return $this; and silverstripe will get the action you called and the class hierarchy of $this and use that as array for renderWith()

So if your classes are Category_Controller > Page_Controller > ContentController the array will look like this:

array(
    'Category_show', // because your action is show
    'Category',
    'Page_show',
    'Page',
    'ContentController_show',
    'ContentController',
)

(I am not a 100% sure if it also includes Page_show and ContentController_show.)