【问题标题】:KO3: How to deal with stylesheets and scriptfilesKO3:如何处理样式表和脚本文件
【发布时间】:2010-05-14 15:59:19
【问题描述】:

我使用的是 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 ?>

这没问题。问题是它需要将样式和脚本文件添加到控制器中,而实际上不必关心这些。如果视图是由除我之外的其他人完成的,这也很麻烦,因为他们必须在控制器上鬼混,只是为了添加一个新的样式表或一个新的脚本文件。如何以更好的方式做到这一点?

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

【问题讨论】:

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


    【解决方案1】:

    Controller_Template 实际上放置逻辑用于定期加载的样式和javascript的地方,这就是它被称为Controller_Template的原因。

    您应该通过扩展 Controller_Template 的控制器来添加/编辑它们。最后,每个使用 Kohana 的开发人员都应该首先了解这些东西是如何工作的。

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

    【讨论】:

    • 问题是视图文件卡在模板的正文部分,至少应该在头部添加样式表。有人说脚本应该最后添加到正文中,所以我想它们实际上可以添加到视图中,但是是的。
    • 问题是 Kohana 中的视图不允许放入可在多个地方使用的代码。 Rails content_for 方法非常适合这种情况,因为您可以在视图中有一个 content_for :head 块来为视图添加特定于头部的更改(样式、特定于视图的元标记等)。我很想知道如何在 KO3 中做到这一点。
    【解决方案2】:

    一种方法是创建一个帮助程序来存储 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:这是曾经在 IRC 上推荐过的 Kohana 项目的领导者之一。

    【讨论】:

    • 是否也可以将它们添加到视图中?因为在您的示例中,您将它们添加到控制器中,这就是我所指的问题。当然 jquery 和 jquery-ui 我会在模板控制器中添加为默认值,但我正在考虑更多特定于页面的脚本和样式表。
    【解决方案3】:

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

    例如:

    &lt;?php echo HTML::style("/css/style.css", array('media' =&gt; 'screen')).PHP_EOL ?&gt;

    伊恩

    【讨论】:

    • 问题是样式表至少应该添加到头部。视图通常卡在模板内的正文中。
    【解决方案4】:
        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"; }
      ?>
    

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

    $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";};
    

    `

    【讨论】:

      猜你喜欢
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 2013-07-30
      • 2013-11-04
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多