renderWith 不覆盖模板

renderWith not overriding the 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');
            }

        }

    }
}

即使有一个参数与值匹配,它仍然使用默认模板呈现页面 ForSalePage.ss

init()方法不适用于return输入数据或设置模板。这就是 index() 方法(或动作)的用武之地。索引操作是默认操作,它必须 return 一些东西。呈现的字符串或包含要在默认模板中呈现的数据的数组。

您想覆盖默认模板和 return 呈现的字符串,所以这应该可行:

    public function index()
    {
        

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

        return []; //default

    }

See docs