-2

我正在使用 Kohana 处理网站的管理部分。我在views 文件夹中创建了一个“admin”子文件夹来存储管理视图。我还在管理部分使用模板控制器的修改实例,称为管理模板控制器,见此处:

abstract class Admin_Template_Controller extends Template_Controller
{
    public $template = 'admin/template';

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

            $this->template = View::set_filename($this->template);
            $this->template->css = 'adminstyles';
            $this->template->js  = 'html5';
        }
}

但是,我收到一个错误,即未在“admin/template”文件中定义 css 变量。此时,模板文件与我成功用于创建大部分前端的视图文件夹中的模板文件相同,因此它不存在。另外,需要注意的一个重要事实是,当我使用视图文件夹(用于前端)中的模板文件时,它会正确加载页面。

这让我相信它与位于子文件夹中的模板文件有关。这让我很困惑,因为我成功地从同一个“views/admin”文件夹中加载了另一个视图文件。该文件不包含任何变量,所以也许这就是它加载的原因。

我试过了

 $this->template = View::factory($this->template);

也加载新的模板文件,但它返回一个错误,必须在渲染之前调用视图。我认为这是由于自动渲染开启,但我想要它。

任何想法都会有很大帮助。显然,我可以将文件移出管理文件夹并重命名,但这并不能真正帮助我了解发生了什么。

4

3 回答 3

2

您删除的这一行:

$this->template = View::set_filename($this->template);

正在破坏它,因为 set_filename() 不是静态方法;该方法应该在视图的现有实例上调用,因为该方法返回自身(对于方法链接很有用)。但是,您首先不需要这样做,因为您正在扩展 Template_Controller 类,该类在您使用 parent::_construct() 调用的构造函数中为您创建模板视图。

如果您有一个现有的模板对象,但您想更改与其关联的视图,而无需重新创建一个全新的对象,您只需要使用 set_filename() 方法。

最后,auto_render 选项触发一个 post-controller 钩子,在控制器完成时渲染视图;这不会对控制器类的任何方法内的代码产生任何影响。

于 2009-12-08T03:45:26.143 回答
0

我找到了我的问题的答案。该行:

$this->template = View::set_filename($this->template);

需要删除。也许它会再次加载模板并取消变量。我不确定。但是,我认为该行对于更改已在我正在扩展的模板控制器中定义的模板文件名是必要的。我以为我在 Kohana 论坛上读到了正确的内容。我想不会。希望这对其他人有帮助。

于 2009-12-08T03:05:07.637 回答
0

视图子文件夹的名称应与控制子文件夹中视图的控制器完全相同。

于 2011-03-26T11:32:24.783 回答