CakePHP如何从元素内部添加script()?

CakePHP如何从元素内部添加script()?,php,cakephp,cakephp-1.3,Php,Cakephp,Cakephp 1.3,我在CakePHPelement文件(views/elements/nav_default.ctp)中有一个导航菜单 该文件包含在另一个元素中,即标题(views/elements/header_default.ctp),该标题随后包含在布局文件(views/layouts/default.ctp)中 我试图告诉Cake从nav元素中加载一个js文件(webroot/js/mega_drop.js),如下所示: <?php $this->addScript('mega_drop');

我在CakePHP
element
文件(views/elements/nav_default.ctp)中有一个导航菜单

该文件包含在另一个元素中,即标题(views/elements/header_default.ctp),该标题随后包含在布局文件(views/layouts/default.ctp)中

我试图告诉Cake从nav元素中加载一个js文件(webroot/js/mega_drop.js),如下所示:

<?php
$this->addScript('mega_drop');
?>

不包括在内。我看了一下文件,上面写着:

将内容添加到内部脚本 缓冲器此缓冲区可用 在布局中作为$scripts\u for\u布局。 此方法在创建时非常有用 需要添加javascript或 css直接应用于布局。(使)留在家里 请注意,脚本是从 布局,或布局中的元素将 不能添加到$scripts\u中,以用于\u布局。 这种方法最常用于 内部助手,如Javascript 和Html助手

关键部分:

请记住,从布局中添加的脚本或布局中的元素不会添加到$scripts\u for\u布局中

那我该怎么做呢

我想我可以在
default.ctp
布局中添加
。但这感觉不太对,因为它会将布局和元素紧密地捆绑在一起

CakePHP的最佳实践方法是什么?

addScript()
不加载文件;它将实际代码添加到布局变量的
$scripts\u中。其想法是,布局是加载JavaScript文件和代码的好地方。通过这种方式,您可以在一个位置输出所有代码—在头块中或在末尾—无论哪种方式都可以一起输出。因此,如果您的视图中有JavaScript代码,而不是内联输出,则可以将其传递给布局

加载脚本文件的最佳方法是使用HTML助手-
echo$this->HTML->script(“脚本或数组('of','scripts')”)$this->set('scripts','mega_-drop')代码,然后使用布局中的$scripts变量调用Html帮助器

问题是:如果从布局中调用nav_default.ctp,它将不起作用。$this->set()在视图(或从视图中调用的元素)内部工作,因为视图是在布局之前渲染的。如果要从布局中调用元素,则在布局中设置ViewVar已为时过晚最好的方法是从控制器设置()脚本变量,并在布局中使用if(isset($scripts)){echo$this->Html->script($scripts);}
试试看

$this->Html->script('mega_drop', $inline=false);
在你的元素中没有回声

第二个参数表示将其添加到$scripts\u for\u布局变量中


您应该能够在元素中实现这一点,这样javascript只在元素被激活时才被包含

正确有效的1.3.x CakePHP 2.0开发版本来自
example.ctp
文件:

$this->addScript($this->Javascript->link('tab_enabler')); 
$this->addScript($this->Html->css('jquery.tabs'));
这是一个如何从视图中正确包含CSS和JS文件并添加变量
$scripts\u for_layout
的示例,以避免W3C产生验证错误,因为在
中添加指向CSS文件的链接是不正确的