Search code examples
phpsilverstripe-4

renderWith not overriding the Template


I have create a controller to override a template if it finds a parameter with value but for some reason it is not overriding the default template.

<?php

namespace {

    use SilverStripe\CMS\Controllers\ContentController;
    use SilverStripe\Control\Controller;

    class ForSalePageController extends ContentController
    {
        /**
         * An array of actions that can be accessed via a request. Each array element should be an action name, and the
         * permissions or conditions required to allow the user to access it.
         *
         * <code>
         * [
         *     'action', // anyone can access this action
         *     'action' => true, // same as above
         *     'action' => 'ADMIN', // you must have ADMIN permissions to access this action
         *     'action' => '->checkAction' // you can only access this action if $this->checkAction() returns true
         * ];
         * </code>
         *
         * @var array
         */


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

            $printVar = Controller::curr()->getRequest()->getVar('print');

            if ($printVar && $printVar === 'portrait') {
                $this->renderWith('PrintPortrait');
            }

        }

    }
}

even though there is a parameter that match the value it still rendering the page with the default template ForSalePage.ss


Solution

  • The init() method is not for returning data or setting the template. That's the index() method (or action) good for. The index action is the default action and it has to return something. Either a rendered string or an array with data to render with in the default template.

    You want to overwrite the default template and return the rendered string, so this should work:

        public function index()
        {
            
    
            if ($printVar && $printVar === 'portrait') {
                return $this->renderWith('PrintPortrait');
            }
    
            return []; //default
    
        }
    

    See docs