我可以动态更改SilverStripe主题吗?

时间:2017-07-15 07:36:36

标签: silverstripe

我为我的网站制作了cecutients(视力低的人)的额外主题。我可以在主页面上按某个按钮动态更改网站主题吗?

2 个答案:

答案 0 :(得分:4)

是的,你可以这样做。我建议你在你的控制器上实现一个更新主题的动作。然后,您可以将当前活动的主题存储在会话中,并在访问页面时使用它。

以下是我实施该方法(在Page_Controller中):

class Page_Controller extends ContentController 
{
    private static $allowed_actions = ['changeTheme'];

    public function init(){
        parent::init();

        if ($theme = Session::get('theme')) {
            Config::inst()->update('SSViewer', 'theme', $theme);
        }
    }

    public function changeTheme()
    {
        $theme = $this->request->param('ID');
        $existingThemes = SiteConfig::current_site_config()->getAvailableThemes();

        if (in_array($theme, $existingThemes)) {
            // Set the theme in the config
            Config::inst()->update('SSViewer', 'theme', $theme);
            // Persist the theme to the session
            Session::set('theme', $theme);
        }

        // redirect back to where we came from
        return $this->redirectBack();
    }
}

现在,changeTheme中有Page_Controller个动作,这意味着您可以在每个页面上使用它。然后,您只需使用链接触发主题更改,例如:

<%-- replace otherTheme with the folder-name of your theme --%>
<a href="$Link('changeTheme')/otherTheme">Change to other theme</a>

在基本主题的Page.ss模板中,您可以添加指向cecutients主题的链接。在cecutients的主题中,您添加了一个指向基本主题的链接。

答案 1 :(得分:0)

Silverstripe 4.x 版本的更新:

use SilverStripe\CMS\Controllers\ContentController;
use SilverStripe\Control\Session;
use SilverStripe\SiteConfig\SiteConfig;
use SilverStripe\View\SSViewer;
use SilverStripe\Core\Config\Config;

class PageController extends ContentController
{

    private static $allowed_actions = ['changeTheme'];

    protected function init()
    {
        parent::init();
        if ($theme = $this->getRequest()->getSession()->get('theme')) {
            SSViewer::config()->update('theme_enabled', true);
            SSViewer::set_themes([$theme]);
        }            

    }

    public function changeTheme()
    {
        $theme = $this->request->param('ID');
        $existingThemes = Config::inst()->get('SilverStripe\View\SSViewer', 'themes');
        if (in_array($theme, $existingThemes)) {
            SSViewer::config()->update('theme_enabled', true);
            SSViewer::set_themes([$theme]);
            $this->getRequest()->getSession()->set('theme', $theme);
        }

        return $this->redirectBack();
    }        
}