KO3:如何处理样式表和脚本文件

时间:2010-05-14 15:59:19

标签: model-view-controller kohana code-organization kohana-3

我正在使用Kohana 3和它的模板控制器。我的主要网站模板控制器目前看起来像这样:

<?php defined('SYSPATH') or die('No direct script access.');

abstract class Controller_SiteTemplate extends Controller_Template
{
    public function before()
    {
        parent::before();

        // Initialize default template variables
        $this->template->styles           = Kohana::config('site.styles');
        $this->template->scripts          = Kohana::config('site.scripts');

        $this->template->title            = '';
        $this->template->content          = '';
    }
}

然后在我的模板视图中我做:

<?php # Styles
foreach($styles as $file => $media) 
    echo HTML::style($file, array('media' => $media)).PHP_EOL ?>

<?php # Scripts
foreach($scripts as $file) 
    echo HTML::script($file).PHP_EOL ?>

这没关系。问题是它需要在控制器中添加样式和脚本文件,这不应该真正关心那些。如果视图是由我以外的其他人完成的话,这也很麻烦,因为他们不得不愚弄控制器只是为了添加新的样式表或新的脚本文件。如何以更好的方式做到这一点?

只是为了澄清,我想知道的是如何处理页面特定的样式表和脚本。默认和站点范围的我从配置文件中获取或直接放在模板视图中没有问题。我的问题是如何以一种好的方式为特定页面添加自定义页面。

4 个答案:

答案 0 :(得分:1)

Controller_Template实际上 是为定期加载的样式和javascripts设置逻辑的地方,这就是为什么它被称为Controller_Template。

您应该通过扩展Controller_Template的控制器添加/编辑它们。最后,与Kohana合作的每个开发人员都应该首先了解其中的工作原理。

关于内联脚本/样式,只需将它们放在视图文件中,它们是内联的,对吧?

答案 1 :(得分:0)

一种方法是创建一个帮助程序,用于存储CSS和脚本文件的列表。这个助手可以作为单身人士使用。然后,在适当的时候,您可以将这些链接转储到模板中。

即:

帮助程序代码:

<?php defined('SYSPATH') or die('No direct script access.');

class javascript {
    private static $files = array();

    public static function add($file)
    {
        self::$files[] = $file;
    }

    public static function get()
    {
        return self::$files;
    }
}

控制器代码:

class Controller_Example extends Controller_Template {

    public function before()
    {
        ....
        javascript::add('js/jquery.js');
        javascript::add('js/jquery-ui.js');
        ....
    }
}

模板代码:

<html>
    <head>
        <?php foreach(javascript::get() as $javascript ?>
        <script type="text/javascript" src="<?= $javascript ?>"></script> 
        <?php endforeach; ?>
    </head>
...
</html>

需要考虑几项改进:

  • 创建一个基类作为CSS版本的模板。
  • 添加一种方法来添加FBJS所需的正文中包含的脚本文件。

PS:这是Kohana项目在IRC上推荐过一次的策略之一。

答案 2 :(得分:0)

为什么不把它们放在视图中? - 如果其他人正在处理视图,他们可以看到正在使用哪些样式表并控制它们而不触及控制器等?

例如:

<?php echo HTML::style("/css/style.css", array('media' => 'screen')).PHP_EOL ?>

伊恩

答案 3 :(得分:0)

    parent::before();

    // Initialize default template variables
    $this->template->styles           = Kohana::config('site.styles');
    $this->template->scripts          = Kohana::config('site.scripts');

    $this->template->title            = '';
    $this->template->content          = '';

    /* make your view template available to all your other views so easily you could
       access template variable
    */
    View::bind_global('template', $this->template);

在某个视图中使用类似这样的内容

   $template->scripts[] = 'js/example.js';

并且在主视图(模板视图)的末尾,您将从不同的视图中获得一组js

  <?php
   foreach($template->scripts as $file) { echo Html::script($file), "\n"; }
  ?>

使用这种方法,你必须在每个使用的视图上调用渲染方法(在模板视图脚本之上执行此操作),然后插入带有渲染内容的变量,如bellow

$top = View::factory('elements/top_nav')->render();
$content = $content->render();
$footer = View::factory('elements/footer')->render();

<div id="content"> 
        <?php echo $content;?>
    </div>
    <div id="meniu"><?php echo $top;?></div> you could add inline scripts as well, just add a $template->inline_scripts populate it with $template->inline_scripts = array('<script type="text/javascript">Cufon.replace(\'#meniu ul.topnav li a\');</script>'); and show it on template view script with a foreach($template->inline_scripts as $inline_script) { echo $inline_script."\n";};

`