3

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

我正在尝试在我的一个应用程序上实现这个框架,现在我被困在管理多个模板和它的资产上。

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

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

4

2 回答 2

4

总之

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

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

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 中使用模板。

于 2011-11-18T02:20:28.533 回答
2

我建议不要以这种方式构建您的资产,因为您不会按预期使用该框架。

CSS、JavaScript 和图像确实应该存储在主application目录之外

例如

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 规则以允许访问应用程序目录下的资产文件。

于 2011-11-23T10:26:18.700 回答