如何管理多个模板和模板资产

时间:2011-11-16 20:11:51

标签: kohana kohana-3 kohana-3.2

我是Kohana的新手,并且一直在阅读文档,教程和论坛帖子,以了解它的工作原理。

我正在尝试在我的某个应用程序上实现此框架,现在我无法管理多个模板及其资产。

基本上我的应用程序将有一个模板文件夹,如template1,template2 ....并且所有与特定模板相关的图像,css,js都需要包含在模板文件夹中。

那么有可能实现这样的实现吗?如果是这样,我如何将模板特定资产加载到父模板文件?

2 个答案:

答案 0 :(得分:4)

简而言之

我自己在使用Kohana 3.0制作的网站上使用模板。我将尝试解释它的基本设置;使用模板,你的控制器需要扩展Controller_Template$template变量指定要在视图文件夹中加载的模板页面,所以我创建了自己的主控制器类,扩展了controller_template类来管理哪个模板载入;在下面你会看到我的默认模板的名称只是模板,所以如果我的控制器上没有指定,我会从我的views文件夹中加载template.php

我有一个 master.php 主控制器,其类定义为(dumbed down)

abstract class Controller_Master extends Controller_Template
{
    public $template = 'template'; // Default template

    public function before()
    {
        // Set a local template variable to what template the controller wants to use, by default 'template'
        $template = $this->template; 

        // This is important and for abstraction, since we're extending a class and its functions we need to make sure we still execute its before(); function
        // This will load the view you need from /views/template.php or /views/template2.php depending on what your controller specifies into $this->template
        parent::before();

        // Check which template our code/controller needs to use
        if ($template == 'template') 
        {
            $this->template->header = View::factory('template/head');  // Loads default header file from our views folder /views/template/head.php
            $this->template->content = View::factory('template/index');  // Loads default index file from our views folder /views/template/index.php
            $this->template->footer = View::factory('template/footer');  // Loads default footer file from our views folder /views/template/footer.php

            return;
        } elseif ($template == 'template2') 
        {
            $this->template->header = View::factory('template2/head');  // Loads default header file from our views folder /views/template2/head.php
            $this->template->sidebar = View::factory('template2/sidebar');  // Loads default sidebar file from our views folder /views/template2/sidebar.php
            $this->template->content = View::factory('template2/index');  // Loads default index file from our views folder /views/template2/index.php
            $this->template->footer = View::factory('template2/footer');  // Loads default footer file from our views folder /views/template2/footer.php

            return;
        }
    }
}

我有一个 user.php 用户控制器,其类定义为

// This is important, make sure your controllers extend your master controller class
class Controller_User extends Controller_Master
{
    // In this example this user controller just needs to use the default controller 
    // so nothing needs to be changed on it besides extending our Controller_Master

    // Example action inside the user class on how to load different content into your template instead of the default index page.
    function action_login()
    {
        // Load the login view page from /views/template/forms/login.php
        $this->template->content = View::factory('template/forms/login');
    }
}

现在假设我们有一个需要使用不同模板的控制器,让我们说 你有一个 photo.php 照片控制器,其类定义为

// This is important, make sure your controllers extend your master controller class
class Controller_Photo extends Controller_Master
{
    // Since this controller needs to use a different template we extend the before() function
    // to override the $template variable we created in master to use 'template2'
    function before() 
    {
        $this->template = 'template2';
    }
}

/views/template.php 包含类似

的内容
    <body>
        <div id="header">
            <?= $header; ?>
        </div>
        <div id="content">
            <?= $content; ?>
        </div>
        <div id="footer">
            <?= $footer; ?>
        </div>        
    </body>

/views/templat2e.php 包含不同的布局,例如

    <body>
        <div id="header">
            <?= $header; ?>
        </div>
        <div id="sidebar">
            <?= $sidebar; ?>
        </div>
        <div id="content">
            <?= $content; ?>
        </div>
        <div id="footer">
            <?= $footer; ?>
        </div>        
    </body>

$header$sidebar$content$footer在主控制器中设置或由控制器中的代码覆盖$this->template->header等等类推。

希望这足以解释如何在Kohana中使用模板。

答案 1 :(得分:2)

我建议不要以这种方式构建资产,因为你不会像预期的那样使用框架。

CSS,JavaScript和图像应该存储在主application目录

之外

e.g。

application/
modules/
system/
assets/
  template1/
    css/
      styles.css
    js/
      script.js
    img/
      thing.jpg
  template2/
    css/
      styles.css
    js/
      script.js
    img/
      another-thing.jpg

否则,每个资产请求都将通过框架进行路由,这将影响您的应用程序的响应能力。

如果您仍希望沿着此路径前进,请查看action_media中的/modules/userguide/classes/controller/userguide.php方法,了解用户指南模块如何加载CSS,JavaScript和图片。

或者,您可以修改.htaccess规则以允许访问应用程序目录下的资产文件。