CakePHP 2$this->;Html->;脚本顺序

CakePHP 2$this->;Html->;脚本顺序,php,cakephp,cakephp-2.1,Php,Cakephp,Cakephp 2.1,我试图将JS文件插入视图中,但插入顺序错误 在我的default.ctp中,我有这个 $this->Html->script(array( 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js', 'global' ), array('inline'=>false)); echo $this->fetch('script'); 我认为: $this->Html->

我试图将JS文件插入视图中,但插入顺序错误

在我的default.ctp中,我有这个

$this->Html->script(array(
    'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js',
    'global'
), array('inline'=>false));

echo $this->fetch('script');
我认为:

$this->Html->script('jquery.fancybox.pack', array('inline' => false));
但当我查看来源时,结果是这样的:

<script type="text/javascript" src="/js/jquery.fancybox.pack.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript" src="/js/global.js">

这显然是错误的顺序,因此jQuery插件无法工作


我做错了什么?

不确定您在构建当前系统上投入了多少时间,但您可以尝试使用助手,而不是标准的cakePHP助手


不幸的是,标准资源加载器无法处理不同文件之间的依赖关系,只能按照您提供的顺序加载它们(视图在布局之前被解析)。

通常,我会在布局中回显所需的脚本(而不是将它们添加到缓冲区),然后在布局之后回显脚本块(缓冲脚本)。这样可以确保首先回显每个视图所需的脚本。您的default.ctp将改为如下所示:

// get echoed immediately
echo $this->Html->script(array(
    'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js',
    'global'
));
// everything else from the view, echoed after
echo $this->fetch('script');
或者,您可以为前面的脚本指定一个特殊块

echo $this->Html->script(array(
    'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js',
    'global'
), array('block' => 'firstScripts');
echo $this->fetch('css');
echo $this->fetch('firstScripts');
echo $this->fetch('script');

在头部使用这个

Html->script('jquery-1.11.1.js') ?> Html->script('jquery-1.11.1.js')?>
fetch('script')?>谢谢,很遗憾它们是按那个顺序解析的,否则这个问题就不存在了。这是我最初的想法,但我真的很喜欢把所有东西都放到
$this->fetch('script')因为它确保所有CSS排在第一位,然后是所有JS。不是一些CSS,然后是一些JS,然后是一些CSS等等。CSS和脚本不是在不同的块中吗?你不能把它们分配给块吗?我的意思是,如果你在视图中回显内联CSS,它将位于布局中JS的下方,而我正试图首先保持所有CSS——块确实工作得很好,但我遇到的问题是视图中添加的JS文件是在布局中添加JS文件之前添加的,因此,您不能在布局中使用jQuery,在每个视图中使用特定的插件,因为这些插件将位于jQuery调用之上。如果您将其拆分为单独的块(编辑的答案),该怎么办?这将首先保留所有非内联CSS,然后回显您的
firstScripts
块(您可以在views事件中附加到该块),然后回显通用脚本。很好,没有想到这一点。谢谢 fetch('script') ?>