你可以做的几件事:
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 方式)
最好的做法是为您的视图创建一个实际的 JS 文件,该文件可以包含在$this->Html->script() 中,但是如果您想将 PHP 代码集成到您的 JS 中,那就很烦人了。 Cake 有一个很棒的方法来创建特定于视图的 JS 脚本,他们似乎很少谈论(我不知道为什么)。
只需将其添加到您的 Config/routes.php 文件中:
Router::parseExtensions('js');
如果您只需在 URL 的末尾添加“.js”,Cake 就会自动为您的控制器操作查找 JS 视图。例如:
$this->Html->script('/users/profile.js') 寻找View/Users/js/profile.ctp
然后,它与 JS 布局一起提供。这太棒了,因为您仍然可以访问在控制器中设置的所有变量和数据。
现在……只有一个问题。默认的 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