在CakePHP中,如果现在不推荐使用View-> addScript(),我如何只将*一次*添加到我的布局?

时间:2012-06-03 23:17:35

标签: javascript cakephp cakephp-2.1

在CakePHP 2.1中:
在现在我的布局(即一个块)中添加一段Javascript 一次的最佳方法是什么?
View->addScript()deprecated

修改
$this->Html->script()(链接到JS文件)似乎跟踪重复的脚本,但$this->Html->scriptBlock()(内联JS)没有。 : - (

2 个答案:

答案 0 :(得分:2)

$this->Html->script('scriptname');

确保您的脚本位于webroot中的js文件夹中

答案 1 :(得分:2)

你可以做的几件事情:

<强> 1。查找声明的变量(脏变通方法)

如果您确实希望代码位于$this->Html->scriptBlock()中,则可以定义/检查全局变量,以查看代码是否已定义。例如:

if (!DEFINED('someVarName')) {
    // define the variable from now on
    DEFINE('someVarName', true);
    // add your block
    $this->Html->scriptBlock(...);
}

<强> 2。创建自定义JS路由和文件(Cake方式)

最好的办法是为您的视图创建一个可以包含在$this->Html->script()中的实际JS文件,但是如果您想将PHP代码集成到JS中,那就太烦人了。 Cake有一个非常棒的方法来创建特定于视图的JS脚本,它们似乎没有多少谈论(我无法弄清楚原因)。

只需将其添加到您的Config/routes.php文件中:

Router::parseExtensions('js');

如果您只是在URL的末尾添加“.js”,那么Cake会自动为您的控制器操作寻找JS View。例如:

$this->Html->script('/users/profile.js')查找View/Users/js/profile.ctp

然后,它使用JS布局提供服务。这很棒,因为您仍然可以访问Controller中设置的所有变量和数据。

现在......只是一个问题。默认的JS布局将内容包装在标记中。如果我们试图在外部包含我们的脚本,那就不好了,例如:<script type="text/javascript" src="/users/profile.js"></script>

我对这种方式的JS布局并没有太多的用处,但是我可能在某些时候,所以我只是编辑了布局文件以使其适应性:

// app/View/Layouts/js/default.ctp
<? 
if (isset($this->request->params['ext']) && $this->request->params['ext']=='js') {
    echo $this->fetch('content'); 
} else {
?>
    <? echo $scripts_for_layout; ?>
    <script type="text/javascript"><?php echo $this->fetch('content'); ?></script>
<? } ?>

更多信息(但不多):http://book.cakephp.org/2.0/en/development/routing.html#file-extensions