我正在使用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';
}
}
但是,我收到的错误是css变量未在“admin / template”文件中定义。此时,模板文件与我成功用于创建大部分前端的views文件夹中的模板文件相同,因此它不在那里。另外,需要注意的一个重要事实是,当我在views文件夹中使用模板文件时(对于前端),它正确加载页面。
这让我相信它与位于子文件夹中的模板文件有关。这让我感到困惑,因为我从同一个“views / admin”文件夹中成功加载了另一个视图文件。该文件虽然不包含任何变量,但也许这就是它加载的原因。
我试过
$this->template = View::factory($this->template);
也要加载新模板文件,但它返回一个错误,必须在渲染之前调用该视图。我认为这是由于自动渲染开启,但我想要它。
任何想法都会有很大的帮助。显然,我可以将文件移出admin文件夹并重命名,但这并不能帮助我了解正在发生的事情。
答案 0 :(得分:2)
您删除了这一行:
$this->template = View::set_filename($this->template);
打破了它,因为set_filename()不是静态方法;应该在视图的现有实例上调用该方法,因为该方法返回自身(对于方法链接很有用)。但是,您首先不需要这样做,因为您正在扩展Template_Controller类,该类在您使用parent :: _ construct()调用的构造函数中为您创建模板视图。
如果您有一个现有的模板对象,但只想更改与之关联的视图而不必重新创建一个全新的对象,则只需要使用set_filename()方法。
最后,auto_render选项触发一个后控制器挂钩,在控制器完成时呈现视图;这对控制器类的任何方法内的代码都没有任何影响。
答案 1 :(得分:0)
我找到了问题的答案。这一行:
$this->template = View::set_filename($this->template);
需要删除。也许它会再次加载模板并取消变量。我不确定。但是,我认为该行是必要的,以更改我正在扩展的模板控制器中定义的模板文件名。我以为我在Kohana论坛上正确地阅读了这一点。我想不是。希望这有助于其他人。
答案 2 :(得分:0)
视图子文件夹的名称应与控制子文件夹中视图的控制器完全相同。