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.

We've moved the forum!

Please use forum.silverstripe.org for any new questions (announcement).
The forum archive will stick around, but will be read only.

You can also use our Slack channel or StackOverflow to ask for help.
Check out our community overview for more options to contribute.

Customising the CMS /

Moderators: martimiz, Sean, Ed, biapar, Willr, Ingo, swaiba

Accessing theme templates in the CMS? [SOLVED]


Go to End


4 Posts   2585 Views

Avatar
Double-A-Ron

Community Member, 607 Posts

7 March 2014 at 12:00pm

I'm extending LeftAndMain to create a custom CMS area. This is loosely based on the Settings area of the CMS.

After looking into how the Settings area is put together in code, I noticed this function that sets the theme to display tabs correctly:

     public function getResponseNegotiator() {
		$neg = parent::getResponseNegotiator();
		$controller = $this;
		$neg->setCallback('CurrentForm', function() use(&$controller) {
			return $controller->renderWith($controller->getTemplatesWithSuffix('_Content'));
		});
		return $neg;
	}

This gets a template located in /cms/templates/Includes/CMSSettingsController_Content.ss

So I duplicated this in my custom LeftAndMain child and created a duplicate template. This is not a module as it is very specific to the application and we want to keep code/templates in one area of the file system.

When I do the same as above, getTemplatesWithSuffix only returns LeftAndMain.ss.

I have stepped through the code and found that even though my custom template is found, it is ignored because $theme is null in this subsequent function:
SSViewer.php

public static function hasTemplate($templates) {
		$manifest = SS_TemplateLoader::instance()->getManifest();

		if(Config::inst()->get('SSViewer', 'theme_enabled')) {
			$theme = Config::inst()->get('SSViewer', 'theme');
		} else {
			$theme = null;
		}

		foreach ((array) $templates as $template) {
			if ($manifest->getCandidateTemplate($template, $theme)) return true;
		}

		return false;
	}

So how do I make the CMS aware of the theme? Or is a way of doing this?

Avatar
Double-A-Ron

Community Member, 607 Posts

7 March 2014 at 2:38pm

Edited: 07/03/2014 2:38pm

Worth adding: Theme is set in config.yml like so:

---
Name: mysite
After: 'framework/*','cms/*'
---
# YAML configuration for SilverStripe
# See http://doc.silverstripe.org/framework/en/topics/configuration
# Caution: Indentation through two spaces, not tabs
SSViewer:
  theme: 'mytheme'

I thought the After: might have been the culprit, but even if I remove it entirely and do a dev/build, the CMS still can't get hold of it.

Avatar
(deleted)

Community Member, 473 Posts

7 March 2014 at 3:31pm

The CMS deliberately unsets the theme, so it won't load templates from there. Put the templates in mysite/templates/ instead.

Avatar
Double-A-Ron

Community Member, 607 Posts

11 March 2014 at 8:37am

Thanks Simon,

I wasn't really interested in separating this one template from the rest of the codebase (for future maintenance reasons). But your suggestion did work.

In then end I was able to get the template to load from the theme directory by adding this to my LeftAndMain extended class:

public function init() {
	parent::init();
	
	Config::inst()->update('SSViewer', 'theme_enabled', true);
		
	...
}