我在控制器中有以下代码:
$this->viewdata->scripts = array(
'http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js',
'jstree/jquery.jstree-1.0-rc2.js',
'jquery.hotkeys-0.8.js',
'tags/index.js'
);
$this->viewdata->styles = array(
'reset.css',
'tags.css'
);
在我看来,我有一个foreach
来将列出的每个javascript/css文件包装到各自的HTML标记中。我使用的是主模板/布局方法;我只需填充主模板中的任意/所有字段,就可以得到我的web页面。所以,在控制器中设置javascript/css对我来说很好,这样我的<script>
和<link>
就可以在<head>
中,这是它们所属的位置。
然而,我最近意识到javascript和css不属于控制器,因为呈现的视图可能会发生变化,并且可能有非常不同的javascript/css要求。
为了便于维护,我基本上只想保留一个主模板,但也希望从控制器中删除所有对view/javascript/css的引用。有什么可以帮助我做到这一点呢?
谢谢。
发布于 2011-03-30 07:03:06
我不使用CI,但我经常使用Zend和Symfony。在这两个框架中,都有某种类型的资产助手,您可以从视图中调用它来将css或js文件添加到堆栈中。然后调用类似的helper将这些文件输出到您的大脑中。例如在symfony中:
查看:
<?php use_stylesheet('/css/mycss.css'); ?>
<?php use_stylesheet('/css/components.css'); ?>
<?php use_javascript('/js/site.js'); ?>
布局:
<head>
<?php include_javascripts(); ?>
<?php include_stylesheets(); ?>
</head>
我认为,如果不是开箱即用,在CI中实现这样的东西会相对容易……
发布于 2011-03-30 06:51:31
我有一个项目,我也做了同样的事情,只是没那么雄辩。我想我可以通过“动态”加载js和css来减少发送给客户端的信息量。我使用控制器在我的视图中定义了文件名数组和循环,以包含它们。
我记得只有一个js文件一直没有包含在内。
你必须决定以下哪一项你比其他人更相信。
controllers
这是一个混乱的决定,你必须自己找到解决的办法。
发布于 2011-03-30 08:37:20
我知道您可能没有使用该代码示例中的cakePHP,但是!他们有一个很好的方法来处理这个问题。它是一个用于“内联”样式、脚本等的参数。
在您的标记中,您有如下内容:
<?= $scripts_for_layout ?>
<?= $styles_for_layout ?>
在视图文件本身中,您有如下代码:
<?php $this->Html->script('jquery', array('inline' => true)); ?>
因此,实际的视图文件呈现,将所有脚本存储到某个数组中,然后呈现布局文件(页眉、页脚等)。
布局文件获取存储的数组,然后呈现到$scripts_for_layout变量中。
相当的天才,工作也很棒。我建议这样做。
参考:http://book.cakephp.org/view/1589/script
https://stackoverflow.com/questions/5479658
复制相似问题